{"openapi":"3.1.0","info":{"title":"Emisso Connect API","version":"0.1.0","description":"Un solo endpoint entre tus agentes y los sistemas chilenos: el SII, los bancos y Previred para leer, y Notta para emitir documentos tributarios.\n\nToda llamada es un POST a '/v1/tools/{tool_id}/execute' con la entrada envuelta en 'input', y toda respuesta trae el mismo sobre: 'data' con la salida de la tool y 'meta' con el 'request_id' que la identifica en la bitácora. Los errores traen 'code', 'message', 'request_id' y un 'suggested_fix' escrito para ejecutarse: decide siempre por el 'code', nunca por el texto.\n\nDos reglas que conviene saber antes de la primera llamada. La primera: leer datos reales son DOS pasos. La tool 'conexion.sincronizar' de cada sistema hace el login y escribe lo que trajo; las tools 'consultar' leen eso ya guardado y nunca preguntan en vivo, así que una consulta vacía puede significar que ese período todavía no se sincroniza. La segunda: en todo sistema conectable la cabecera 'X-Connect-Connection' es obligatoria y no hay elección implícita, ni con una sola conexión activa, porque la conexión es la empresa a cuyo nombre se opera.\n\nEl mismo catálogo se sirve por MCP en '/mcp', donde se anuncian dos meta-tools, 'search_docs' y 'execute'.","contact":{"name":"Emisso","url":"https://connect.emisso.ai/docs","email":"hola@emisso.ai"}},"servers":[{"url":"https://connect.emisso.ai/api"}],"externalDocs":{"url":"https://connect.emisso.ai/docs","description":"Guías, conceptos y la referencia completa de cada tool."},"tags":[{"name":"banco_estado","description":"BancoEstado Empresas (banco). Requiere una conexión: manda su conn_ en 'X-Connect-Connection'."},{"name":"banco_security","description":"Banco Security Empresas (banco). Requiere una conexión: manda su conn_ en 'X-Connect-Connection'."},{"name":"bch_empresas","description":"Banco de Chile Empresas (banco). Requiere una conexión: manda su conn_ en 'X-Connect-Connection'."},{"name":"bci_pyme","description":"Banco BCI Empresas (banco). Requiere una conexión: manda su conn_ en 'X-Connect-Connection'."},{"name":"bice_empresas","description":"Banco BICE Empresas (banco). Requiere una conexión: manda su conn_ en 'X-Connect-Connection'."},{"name":"conexiones","description":"Conexiones de Emisso Connect (utilidad). No requiere conexión: queda habilitado para toda organización."},{"name":"core","description":"Core (utilidad). No requiere conexión: queda habilitado para toda organización."},{"name":"echo","description":"Echo (utilidad). No requiere conexión: queda habilitado para toda organización."},{"name":"indicadores","description":"Indicadores económicos (utilidad). No requiere conexión: queda habilitado para toda organización."},{"name":"notta","description":"Notta (facturación). Requiere una conexión: manda su conn_ en 'X-Connect-Connection'."},{"name":"previred","description":"Previred (autoridad tributaria). Requiere una conexión: manda su conn_ en 'X-Connect-Connection'."},{"name":"sii","description":"Servicio de Impuestos Internos (autoridad tributaria). Requiere una conexión: manda su conn_ en 'X-Connect-Connection'."}],"security":[{"apiKey":[]},{"oauth2":[]}],"paths":{"/v1/tools/banco_estado.conexion.sincronizar/execute":{"post":{"operationId":"banco_estado__conexion__sincronizar","summary":"Sincronizar conexión BancoEstado","description":"Inicia sesión en BancoEstado Empresas y persiste los alcances pedidos (saldos, movimientos) para un período, en UNA sola sesión (un login, un logout). Es el ÚNICO camino que trae datos del banco: las tools de consulta leen lo ya guardado. `saldos` es una foto del momento, no del período, así que sólo se sincroniza pidiendo el período corriente. Puede tardar cerca de un minuto, y mientras corre el titular no va a poder entrar al portal: BancoEstado admite una sola sesión activa por usuario.","tags":["banco_estado"],"security":[{"apiKey":[]},{"oauth2":["banco_estado:read"]}],"parameters":[{"name":"X-Connect-Connection","in":"header","required":true,"description":"Cuál conexión (conn_…) ejecuta esta llamada. Obligatoria en todo sistema conectable y sin resolución implícita, ni siquiera cuando la organización tiene una sola conexión activa: la conexión ES la empresa, y elegir por ti una que hoy acierta mañana acierta distinto sin que nadie cambie nada. Los ids salen de la tool 'conexiones.estado.consultar'. Si falta, la respuesta es 'validation_error' y no se contacta al sistema externo.","schema":{"type":"string","pattern":"^conn_"},"example":"conn_9tKfR2mQx4Vb"}],"requestBody":{"required":true,"description":"La entrada de la tool, envuelta en 'input'. Manda '{\"input\": {}}' cuando la tool no toma argumentos: el sobre es obligatorio aunque esté vacío.","content":{"application/json":{"schema":{"type":"object","properties":{"input":{"$ref":"#/components/schemas/banco_estado__conexion__sincronizar__Input"}},"required":["input"]}}}},"responses":{"200":{"description":"La tool corrió bien. 'data' es la salida de la tool tal cual, y 'meta' trae el 'request_id' que identifica esta llamada en la bitácora.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/banco_estado__conexion__sincronizar__Output"},"meta":{"$ref":"#/components/schemas/ResponseMeta"}},"required":["data"]}}}},"400":{"$ref":"#/components/responses/Error_validation_error"},"401":{"$ref":"#/components/responses/Error_unauthorized"},"403":{"description":"scope_not_granted | alcance_not_enabled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"$ref":"#/components/responses/Error_tool_not_found"},"409":{"description":"connection_ambiguous | connection_busy","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"428":{"$ref":"#/components/responses/Error_connection_credential_required"},"500":{"$ref":"#/components/responses/Error_internal_error"}}}},"/v1/tools/banco_estado.conexion.verificar/execute":{"post":{"operationId":"banco_estado__conexion__verificar","summary":"Verificar conexión BancoEstado Empresas","description":"Prueba las credenciales de la conexión contra BancoEstado Empresas haciendo un login real (y su logout, a cargo del pipeline). No sincroniza ni devuelve datos: solo confirma si las credenciales sirven.","tags":["banco_estado"],"security":[{"apiKey":[]},{"oauth2":["banco_estado:read"]}],"parameters":[{"name":"X-Connect-Connection","in":"header","required":true,"description":"Cuál conexión (conn_…) ejecuta esta llamada. Obligatoria en todo sistema conectable y sin resolución implícita, ni siquiera cuando la organización tiene una sola conexión activa: la conexión ES la empresa, y elegir por ti una que hoy acierta mañana acierta distinto sin que nadie cambie nada. Los ids salen de la tool 'conexiones.estado.consultar'. Si falta, la respuesta es 'validation_error' y no se contacta al sistema externo.","schema":{"type":"string","pattern":"^conn_"},"example":"conn_9tKfR2mQx4Vb"}],"requestBody":{"required":true,"description":"La entrada de la tool, envuelta en 'input'. Manda '{\"input\": {}}' cuando la tool no toma argumentos: el sobre es obligatorio aunque esté vacío.","content":{"application/json":{"schema":{"type":"object","properties":{"input":{"$ref":"#/components/schemas/banco_estado__conexion__verificar__Input"}},"required":["input"]}}}},"responses":{"200":{"description":"La tool corrió bien. 'data' es la salida de la tool tal cual, y 'meta' trae el 'request_id' que identifica esta llamada en la bitácora.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/banco_estado__conexion__verificar__Output"},"meta":{"$ref":"#/components/schemas/ResponseMeta"}},"required":["data"]}}}},"400":{"$ref":"#/components/responses/Error_validation_error"},"401":{"$ref":"#/components/responses/Error_unauthorized"},"403":{"description":"scope_not_granted | alcance_not_enabled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"$ref":"#/components/responses/Error_tool_not_found"},"409":{"description":"connection_ambiguous | connection_busy","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"428":{"$ref":"#/components/responses/Error_connection_credential_required"},"500":{"$ref":"#/components/responses/Error_internal_error"}}}},"/v1/tools/banco_estado.movimientos.consultar/execute":{"post":{"operationId":"banco_estado__movimientos__consultar","summary":"Consultar movimientos de BancoEstado","description":"Lee los movimientos de BancoEstado YA sincronizados de esta conexión, del más reciente al más antiguo. Lectura pura: NO contacta al banco ni dispara una sincronización, así que si falta un período usa 'banco_estado.conexion.sincronizar' primero. Los montos vienen como NÚMERO: 'monto' es la magnitud SIN signo, 'type' dice si sale ('credit') o entra ('debit') plata según el libro del banco (al revés de como se lee una cartola), y 'display' es ese monto ya formateado a la chilena con su signo. 'saldo' es el saldo arrastrado: es un balance, no lleva 'type' y conserva su propio signo. Pagina con 'cursor': cuando la respuesta trae 'cursor' distinto de null hay más filas, reenvía ese valor tal cual.","tags":["banco_estado"],"security":[{"apiKey":[]},{"oauth2":["banco_estado:read"]}],"parameters":[{"name":"X-Connect-Connection","in":"header","required":true,"description":"Cuál conexión (conn_…) ejecuta esta llamada. Obligatoria en todo sistema conectable y sin resolución implícita, ni siquiera cuando la organización tiene una sola conexión activa: la conexión ES la empresa, y elegir por ti una que hoy acierta mañana acierta distinto sin que nadie cambie nada. Los ids salen de la tool 'conexiones.estado.consultar'. Si falta, la respuesta es 'validation_error' y no se contacta al sistema externo.","schema":{"type":"string","pattern":"^conn_"},"example":"conn_9tKfR2mQx4Vb"}],"requestBody":{"required":true,"description":"La entrada de la tool, envuelta en 'input'. Manda '{\"input\": {}}' cuando la tool no toma argumentos: el sobre es obligatorio aunque esté vacío.","content":{"application/json":{"schema":{"type":"object","properties":{"input":{"$ref":"#/components/schemas/banco_estado__movimientos__consultar__Input"}},"required":["input"]}}}},"responses":{"200":{"description":"La tool corrió bien. 'data' es la salida de la tool tal cual, y 'meta' trae el 'request_id' que identifica esta llamada en la bitácora.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/banco_estado__movimientos__consultar__Output"},"meta":{"$ref":"#/components/schemas/ResponseMeta"}},"required":["data"]}}}},"400":{"$ref":"#/components/responses/Error_validation_error"},"401":{"$ref":"#/components/responses/Error_unauthorized"},"403":{"description":"scope_not_granted | alcance_not_enabled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"$ref":"#/components/responses/Error_tool_not_found"},"409":{"description":"connection_ambiguous | connection_busy","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"428":{"$ref":"#/components/responses/Error_connection_credential_required"},"500":{"$ref":"#/components/responses/Error_internal_error"}}}},"/v1/tools/banco_estado.saldos.consultar/execute":{"post":{"operationId":"banco_estado__saldos__consultar","summary":"Consultar saldos de BancoEstado","description":"Lee los saldos de BancoEstado YA sincronizados de esta conexión, del más reciente al más antiguo. Lectura pura: NO contacta al banco ni dispara una sincronización, así que si nunca se sincronizó devuelve una lista vacía. Para traer datos nuevos usa 'banco_estado.conexion.sincronizar' primero. Los saldos son una foto POR DÍA y vienen como NÚMERO conservando su signo: un sobregiro es negativo, y un saldo no lleva 'type' porque no es una operación. Pagina con 'cursor': cuando la respuesta trae 'cursor' distinto de null hay más filas, reenvía ese valor tal cual y nunca lo construyas a mano.","tags":["banco_estado"],"security":[{"apiKey":[]},{"oauth2":["banco_estado:read"]}],"parameters":[{"name":"X-Connect-Connection","in":"header","required":true,"description":"Cuál conexión (conn_…) ejecuta esta llamada. Obligatoria en todo sistema conectable y sin resolución implícita, ni siquiera cuando la organización tiene una sola conexión activa: la conexión ES la empresa, y elegir por ti una que hoy acierta mañana acierta distinto sin que nadie cambie nada. Los ids salen de la tool 'conexiones.estado.consultar'. Si falta, la respuesta es 'validation_error' y no se contacta al sistema externo.","schema":{"type":"string","pattern":"^conn_"},"example":"conn_9tKfR2mQx4Vb"}],"requestBody":{"required":true,"description":"La entrada de la tool, envuelta en 'input'. Manda '{\"input\": {}}' cuando la tool no toma argumentos: el sobre es obligatorio aunque esté vacío.","content":{"application/json":{"schema":{"type":"object","properties":{"input":{"$ref":"#/components/schemas/banco_estado__saldos__consultar__Input"}},"required":["input"]}}}},"responses":{"200":{"description":"La tool corrió bien. 'data' es la salida de la tool tal cual, y 'meta' trae el 'request_id' que identifica esta llamada en la bitácora.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/banco_estado__saldos__consultar__Output"},"meta":{"$ref":"#/components/schemas/ResponseMeta"}},"required":["data"]}}}},"400":{"$ref":"#/components/responses/Error_validation_error"},"401":{"$ref":"#/components/responses/Error_unauthorized"},"403":{"description":"scope_not_granted | alcance_not_enabled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"$ref":"#/components/responses/Error_tool_not_found"},"409":{"description":"connection_ambiguous | connection_busy","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"428":{"$ref":"#/components/responses/Error_connection_credential_required"},"500":{"$ref":"#/components/responses/Error_internal_error"}}}},"/v1/tools/banco_security.conexion.sincronizar/execute":{"post":{"operationId":"banco_security__conexion__sincronizar","summary":"Sincronizar conexión Banco Security","description":"Sincroniza los alcances solicitados (transferencias, nóminas, saldos, movimientos) para un período en una sola sesión (un login, un logout). `saldos` es una foto del momento, no del período: solo se sincroniza cuando se pide el período corriente. `movimientos` cubre cualquier período: el conector elige solo la cartola que corresponde (la del mes en curso o la histórica) y las dos escriben la misma tabla, así que un mismo movimiento traído por las dos NO se duplica.","tags":["banco_security"],"security":[{"apiKey":[]},{"oauth2":["banco_security:read"]}],"parameters":[{"name":"X-Connect-Connection","in":"header","required":true,"description":"Cuál conexión (conn_…) ejecuta esta llamada. Obligatoria en todo sistema conectable y sin resolución implícita, ni siquiera cuando la organización tiene una sola conexión activa: la conexión ES la empresa, y elegir por ti una que hoy acierta mañana acierta distinto sin que nadie cambie nada. Los ids salen de la tool 'conexiones.estado.consultar'. Si falta, la respuesta es 'validation_error' y no se contacta al sistema externo.","schema":{"type":"string","pattern":"^conn_"},"example":"conn_9tKfR2mQx4Vb"}],"requestBody":{"required":true,"description":"La entrada de la tool, envuelta en 'input'. Manda '{\"input\": {}}' cuando la tool no toma argumentos: el sobre es obligatorio aunque esté vacío.","content":{"application/json":{"schema":{"type":"object","properties":{"input":{"$ref":"#/components/schemas/banco_security__conexion__sincronizar__Input"}},"required":["input"]}}}},"responses":{"200":{"description":"La tool corrió bien. 'data' es la salida de la tool tal cual, y 'meta' trae el 'request_id' que identifica esta llamada en la bitácora.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/banco_security__conexion__sincronizar__Output"},"meta":{"$ref":"#/components/schemas/ResponseMeta"}},"required":["data"]}}}},"400":{"$ref":"#/components/responses/Error_validation_error"},"401":{"$ref":"#/components/responses/Error_unauthorized"},"403":{"description":"scope_not_granted | alcance_not_enabled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"$ref":"#/components/responses/Error_tool_not_found"},"409":{"description":"connection_ambiguous | connection_busy","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"428":{"$ref":"#/components/responses/Error_connection_credential_required"},"500":{"$ref":"#/components/responses/Error_internal_error"}}}},"/v1/tools/banco_security.conexion.verificar/execute":{"post":{"operationId":"banco_security__conexion__verificar","summary":"Verificar conexión Banco Security","description":"Prueba las credenciales de la conexión contra Banco Security haciendo un login real (y su logout, a cargo del pipeline). No sincroniza ni devuelve datos: solo confirma si las credenciales sirven.","tags":["banco_security"],"security":[{"apiKey":[]},{"oauth2":["banco_security:read"]}],"parameters":[{"name":"X-Connect-Connection","in":"header","required":true,"description":"Cuál conexión (conn_…) ejecuta esta llamada. Obligatoria en todo sistema conectable y sin resolución implícita, ni siquiera cuando la organización tiene una sola conexión activa: la conexión ES la empresa, y elegir por ti una que hoy acierta mañana acierta distinto sin que nadie cambie nada. Los ids salen de la tool 'conexiones.estado.consultar'. Si falta, la respuesta es 'validation_error' y no se contacta al sistema externo.","schema":{"type":"string","pattern":"^conn_"},"example":"conn_9tKfR2mQx4Vb"}],"requestBody":{"required":true,"description":"La entrada de la tool, envuelta en 'input'. Manda '{\"input\": {}}' cuando la tool no toma argumentos: el sobre es obligatorio aunque esté vacío.","content":{"application/json":{"schema":{"type":"object","properties":{"input":{"$ref":"#/components/schemas/banco_security__conexion__verificar__Input"}},"required":["input"]}}}},"responses":{"200":{"description":"La tool corrió bien. 'data' es la salida de la tool tal cual, y 'meta' trae el 'request_id' que identifica esta llamada en la bitácora.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/banco_security__conexion__verificar__Output"},"meta":{"$ref":"#/components/schemas/ResponseMeta"}},"required":["data"]}}}},"400":{"$ref":"#/components/responses/Error_validation_error"},"401":{"$ref":"#/components/responses/Error_unauthorized"},"403":{"description":"scope_not_granted | alcance_not_enabled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"$ref":"#/components/responses/Error_tool_not_found"},"409":{"description":"connection_ambiguous | connection_busy","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"428":{"$ref":"#/components/responses/Error_connection_credential_required"},"500":{"$ref":"#/components/responses/Error_internal_error"}}}},"/v1/tools/banco_security.movimientos.consultar/execute":{"post":{"operationId":"banco_security__movimientos__consultar","summary":"Consultar movimientos de Banco Security","description":"Lee la caché ya sincronizada; NO contacta al banco. Devuelve los movimientos de cuenta corriente guardados de esta conexión, del más reciente al más antiguo, filtrables por período (AAAA-MM). Exige el alcance 'movimientos' habilitado. Sin 'periodo' devuelve todos los períodos sincronizados. Si el período nunca se sincronizó, devuelve una lista vacía (lo que NO significa que no haya movimientos): usa 'banco_security.conexion.sincronizar' primero. El banco sirve el mes en curso y los meses ya cerrados por dos cartolas distintas, pero eso es interno: las dos escriben esta misma caché con la misma identidad por movimiento, así que un mes de solape NO aparece duplicado y los resultados se pueden sumar sin miedo. Los montos vienen como NÚMERO: 'monto' es la magnitud sin signo, 'type' dice si entra ('debit') o sale ('credit') plata según el libro del banco (al revés de como se lee una cartola) y 'display' es ese monto ya formateado a la chilena con su signo. Un saldo NO lleva 'type': es un balance y conserva su propio signo. Pagina con 'cursor': cuando la respuesta trae 'cursor' distinto de null hay más filas: reenvía ese valor tal cual; nunca lo construyas a mano.","tags":["banco_security"],"security":[{"apiKey":[]},{"oauth2":["banco_security:read"]}],"parameters":[{"name":"X-Connect-Connection","in":"header","required":true,"description":"Cuál conexión (conn_…) ejecuta esta llamada. Obligatoria en todo sistema conectable y sin resolución implícita, ni siquiera cuando la organización tiene una sola conexión activa: la conexión ES la empresa, y elegir por ti una que hoy acierta mañana acierta distinto sin que nadie cambie nada. Los ids salen de la tool 'conexiones.estado.consultar'. Si falta, la respuesta es 'validation_error' y no se contacta al sistema externo.","schema":{"type":"string","pattern":"^conn_"},"example":"conn_9tKfR2mQx4Vb"}],"requestBody":{"required":true,"description":"La entrada de la tool, envuelta en 'input'. Manda '{\"input\": {}}' cuando la tool no toma argumentos: el sobre es obligatorio aunque esté vacío.","content":{"application/json":{"schema":{"type":"object","properties":{"input":{"$ref":"#/components/schemas/banco_security__movimientos__consultar__Input"}},"required":["input"]}}}},"responses":{"200":{"description":"La tool corrió bien. 'data' es la salida de la tool tal cual, y 'meta' trae el 'request_id' que identifica esta llamada en la bitácora.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/banco_security__movimientos__consultar__Output"},"meta":{"$ref":"#/components/schemas/ResponseMeta"}},"required":["data"]}}}},"400":{"$ref":"#/components/responses/Error_validation_error"},"401":{"$ref":"#/components/responses/Error_unauthorized"},"403":{"description":"scope_not_granted | alcance_not_enabled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"$ref":"#/components/responses/Error_tool_not_found"},"409":{"description":"connection_ambiguous | connection_busy","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"428":{"$ref":"#/components/responses/Error_connection_credential_required"},"500":{"$ref":"#/components/responses/Error_internal_error"}}}},"/v1/tools/banco_security.nomina_pagos.consultar/execute":{"post":{"operationId":"banco_security__nomina_pagos__consultar","summary":"Consultar los pagos de una nómina de Banco Security","description":"Lee la caché ya sincronizada; NO contacta al banco. Devuelve las LÍNEAS DE PAGO de UNA nómina: el 'idNomina' es obligatorio y sale de 'banco_security.nominas.consultar'. Exige el alcance 'nominas' habilitado (el mismo que las cabeceras). Las líneas salen en orden ascendente de 'linea'. Si esa nómina nunca se sincronizó, devuelve una lista vacía. Los montos vienen como NÚMERO: 'monto' es la magnitud sin signo, 'type' dice si entra ('debit') o sale ('credit') plata según el libro del banco (al revés de como se lee una cartola) y 'display' es ese monto ya formateado a la chilena con su signo. Un saldo NO lleva 'type': es un balance y conserva su propio signo. Pagina con 'cursor': cuando la respuesta trae 'cursor' distinto de null hay más filas: reenvía ese valor tal cual; nunca lo construyas a mano.","tags":["banco_security"],"security":[{"apiKey":[]},{"oauth2":["banco_security:read"]}],"parameters":[{"name":"X-Connect-Connection","in":"header","required":true,"description":"Cuál conexión (conn_…) ejecuta esta llamada. Obligatoria en todo sistema conectable y sin resolución implícita, ni siquiera cuando la organización tiene una sola conexión activa: la conexión ES la empresa, y elegir por ti una que hoy acierta mañana acierta distinto sin que nadie cambie nada. Los ids salen de la tool 'conexiones.estado.consultar'. Si falta, la respuesta es 'validation_error' y no se contacta al sistema externo.","schema":{"type":"string","pattern":"^conn_"},"example":"conn_9tKfR2mQx4Vb"}],"requestBody":{"required":true,"description":"La entrada de la tool, envuelta en 'input'. Manda '{\"input\": {}}' cuando la tool no toma argumentos: el sobre es obligatorio aunque esté vacío.","content":{"application/json":{"schema":{"type":"object","properties":{"input":{"$ref":"#/components/schemas/banco_security__nomina_pagos__consultar__Input"}},"required":["input"]}}}},"responses":{"200":{"description":"La tool corrió bien. 'data' es la salida de la tool tal cual, y 'meta' trae el 'request_id' que identifica esta llamada en la bitácora.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/banco_security__nomina_pagos__consultar__Output"},"meta":{"$ref":"#/components/schemas/ResponseMeta"}},"required":["data"]}}}},"400":{"$ref":"#/components/responses/Error_validation_error"},"401":{"$ref":"#/components/responses/Error_unauthorized"},"403":{"description":"scope_not_granted | alcance_not_enabled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"$ref":"#/components/responses/Error_tool_not_found"},"409":{"description":"connection_ambiguous | connection_busy","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"428":{"$ref":"#/components/responses/Error_connection_credential_required"},"500":{"$ref":"#/components/responses/Error_internal_error"}}}},"/v1/tools/banco_security.nominas.consultar/execute":{"post":{"operationId":"banco_security__nominas__consultar","summary":"Consultar nóminas de pago de Banco Security","description":"Lee la caché ya sincronizada; NO contacta al banco. Devuelve SOLO las CABECERAS de las nóminas de pago masivas guardadas de esta conexión, de la más reciente a la más antigua, filtrables por período (AAAA-MM). Exige el alcance 'nominas' habilitado. Cada cabecera trae 'numRegistros' para que dimensiones antes de pedir el detalle: las líneas de pago se piden aparte con 'banco_security.nomina_pagos.consultar' pasándole el 'idNomina' de la cabecera (hay nóminas de más de mil líneas, por eso no vienen aquí). Si el período nunca se sincronizó, devuelve una lista vacía: usa 'banco_security.conexion.sincronizar' primero. Los montos vienen como NÚMERO: 'monto' es la magnitud sin signo, 'type' dice si entra ('debit') o sale ('credit') plata según el libro del banco (al revés de como se lee una cartola) y 'display' es ese monto ya formateado a la chilena con su signo. Un saldo NO lleva 'type': es un balance y conserva su propio signo. Pagina con 'cursor': cuando la respuesta trae 'cursor' distinto de null hay más filas: reenvía ese valor tal cual; nunca lo construyas a mano.","tags":["banco_security"],"security":[{"apiKey":[]},{"oauth2":["banco_security:read"]}],"parameters":[{"name":"X-Connect-Connection","in":"header","required":true,"description":"Cuál conexión (conn_…) ejecuta esta llamada. Obligatoria en todo sistema conectable y sin resolución implícita, ni siquiera cuando la organización tiene una sola conexión activa: la conexión ES la empresa, y elegir por ti una que hoy acierta mañana acierta distinto sin que nadie cambie nada. Los ids salen de la tool 'conexiones.estado.consultar'. Si falta, la respuesta es 'validation_error' y no se contacta al sistema externo.","schema":{"type":"string","pattern":"^conn_"},"example":"conn_9tKfR2mQx4Vb"}],"requestBody":{"required":true,"description":"La entrada de la tool, envuelta en 'input'. Manda '{\"input\": {}}' cuando la tool no toma argumentos: el sobre es obligatorio aunque esté vacío.","content":{"application/json":{"schema":{"type":"object","properties":{"input":{"$ref":"#/components/schemas/banco_security__nominas__consultar__Input"}},"required":["input"]}}}},"responses":{"200":{"description":"La tool corrió bien. 'data' es la salida de la tool tal cual, y 'meta' trae el 'request_id' que identifica esta llamada en la bitácora.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/banco_security__nominas__consultar__Output"},"meta":{"$ref":"#/components/schemas/ResponseMeta"}},"required":["data"]}}}},"400":{"$ref":"#/components/responses/Error_validation_error"},"401":{"$ref":"#/components/responses/Error_unauthorized"},"403":{"description":"scope_not_granted | alcance_not_enabled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"$ref":"#/components/responses/Error_tool_not_found"},"409":{"description":"connection_ambiguous | connection_busy","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"428":{"$ref":"#/components/responses/Error_connection_credential_required"},"500":{"$ref":"#/components/responses/Error_internal_error"}}}},"/v1/tools/banco_security.saldos.consultar/execute":{"post":{"operationId":"banco_security__saldos__consultar","summary":"Consultar saldos de Banco Security","description":"Lee la caché ya sincronizada; NO contacta al banco. Devuelve los saldos guardados de esta conexión (contable, disponible y provisorio), con el snapshot más reciente primero. Exige el alcance 'saldos' habilitado. Si nunca se sincronizó, devuelve una lista vacía (eso NO significa que la empresa no tenga cuentas); usa 'banco_security.conexion.sincronizar' primero. Los saldos son un snapshot POR DÍA, así que sin filtro de fecha la primera página ya son los más recientes que hay guardados. Los tres saldos vienen como NÚMERO ya normalizado (antes eran la celda cruda del banco, '$ 12.345.678'), y conservan su signo: un sobregiro es negativo. Un saldo no lleva 'type': no es una operación. 'ultimaLecturaEn' dice cuándo se leyó esa fila del banco: si es vieja, la conexión puede estar pausada. Pagina con 'cursor': cuando la respuesta trae 'cursor' distinto de null hay más filas. reenvía ese valor tal cual; nunca lo construyas a mano.","tags":["banco_security"],"security":[{"apiKey":[]},{"oauth2":["banco_security:read"]}],"parameters":[{"name":"X-Connect-Connection","in":"header","required":true,"description":"Cuál conexión (conn_…) ejecuta esta llamada. Obligatoria en todo sistema conectable y sin resolución implícita, ni siquiera cuando la organización tiene una sola conexión activa: la conexión ES la empresa, y elegir por ti una que hoy acierta mañana acierta distinto sin que nadie cambie nada. Los ids salen de la tool 'conexiones.estado.consultar'. Si falta, la respuesta es 'validation_error' y no se contacta al sistema externo.","schema":{"type":"string","pattern":"^conn_"},"example":"conn_9tKfR2mQx4Vb"}],"requestBody":{"required":true,"description":"La entrada de la tool, envuelta en 'input'. Manda '{\"input\": {}}' cuando la tool no toma argumentos: el sobre es obligatorio aunque esté vacío.","content":{"application/json":{"schema":{"type":"object","properties":{"input":{"$ref":"#/components/schemas/banco_security__saldos__consultar__Input"}},"required":["input"]}}}},"responses":{"200":{"description":"La tool corrió bien. 'data' es la salida de la tool tal cual, y 'meta' trae el 'request_id' que identifica esta llamada en la bitácora.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/banco_security__saldos__consultar__Output"},"meta":{"$ref":"#/components/schemas/ResponseMeta"}},"required":["data"]}}}},"400":{"$ref":"#/components/responses/Error_validation_error"},"401":{"$ref":"#/components/responses/Error_unauthorized"},"403":{"description":"scope_not_granted | alcance_not_enabled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"$ref":"#/components/responses/Error_tool_not_found"},"409":{"description":"connection_ambiguous | connection_busy","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"428":{"$ref":"#/components/responses/Error_connection_credential_required"},"500":{"$ref":"#/components/responses/Error_internal_error"}}}},"/v1/tools/banco_security.transferencias.consultar/execute":{"post":{"operationId":"banco_security__transferencias__consultar","summary":"Consultar transferencias de Banco Security","description":"Lee la caché ya sincronizada; NO contacta al banco. Devuelve las transferencias TEF guardadas de esta conexión, de la más reciente a la más antigua, filtrables por período (AAAA-MM) y por dirección. Exige el alcance 'transferencias' habilitado. Omitir 'direccion' trae enviadas y recibidas juntas; el campo 'direction' de cada fila las distingue ('issued' = enviada, 'received' = recibida). Si el período nunca se sincronizó, devuelve una lista vacía: usa 'banco_security.conexion.sincronizar' primero. Los montos vienen como NÚMERO: 'monto' es la magnitud sin signo, 'type' dice si entra ('debit') o sale ('credit') plata según el libro del banco (al revés de como se lee una cartola) y 'display' es ese monto ya formateado a la chilena con su signo. Un saldo NO lleva 'type': es un balance y conserva su propio signo. 'numeroTransaccion' sí es texto (tiene 14 dígitos y no entra en un entero de 32 bits). 'ultimaLecturaEn' dice cuándo se leyó esa fila del banco. Pagina con 'cursor': cuando la respuesta trae 'cursor' distinto de null hay más filas. reenvía ese valor tal cual; nunca lo construyas a mano.","tags":["banco_security"],"security":[{"apiKey":[]},{"oauth2":["banco_security:read"]}],"parameters":[{"name":"X-Connect-Connection","in":"header","required":true,"description":"Cuál conexión (conn_…) ejecuta esta llamada. Obligatoria en todo sistema conectable y sin resolución implícita, ni siquiera cuando la organización tiene una sola conexión activa: la conexión ES la empresa, y elegir por ti una que hoy acierta mañana acierta distinto sin que nadie cambie nada. Los ids salen de la tool 'conexiones.estado.consultar'. Si falta, la respuesta es 'validation_error' y no se contacta al sistema externo.","schema":{"type":"string","pattern":"^conn_"},"example":"conn_9tKfR2mQx4Vb"}],"requestBody":{"required":true,"description":"La entrada de la tool, envuelta en 'input'. Manda '{\"input\": {}}' cuando la tool no toma argumentos: el sobre es obligatorio aunque esté vacío.","content":{"application/json":{"schema":{"type":"object","properties":{"input":{"$ref":"#/components/schemas/banco_security__transferencias__consultar__Input"}},"required":["input"]}}}},"responses":{"200":{"description":"La tool corrió bien. 'data' es la salida de la tool tal cual, y 'meta' trae el 'request_id' que identifica esta llamada en la bitácora.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/banco_security__transferencias__consultar__Output"},"meta":{"$ref":"#/components/schemas/ResponseMeta"}},"required":["data"]}}}},"400":{"$ref":"#/components/responses/Error_validation_error"},"401":{"$ref":"#/components/responses/Error_unauthorized"},"403":{"description":"scope_not_granted | alcance_not_enabled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"$ref":"#/components/responses/Error_tool_not_found"},"409":{"description":"connection_ambiguous | connection_busy","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"428":{"$ref":"#/components/responses/Error_connection_credential_required"},"500":{"$ref":"#/components/responses/Error_internal_error"}}}},"/v1/tools/bch_empresas.cartolas.consultar/execute":{"post":{"operationId":"bch_empresas__cartolas__consultar","summary":"Consultar cartolas emitidas de Banco de Chile","description":"Lee las cartolas (extractos mensuales) ya sincronizadas de esta conexión, la más reciente primero, filtrables por período de búsqueda (AAAA-MM) y por cuenta. Lectura pura: NO contacta al banco ni dispara una sincronización. Para traer datos nuevos, usa 'bch_empresas.conexion.sincronizar' primero. Una cartola es un OBJETO propio, no una vista de 'movimientos': sus saldos de apertura y cierre pueden no cuadrar exactamente con la suma de movimientos del mismo mes porque el extracto encadena por fecha contable y el feed vivo por fecha del movimiento. 'numeroCartola' es TEXTO siempre (convertirlo a número pierde ceros a la izquierda). Pagina con 'cursor': cuando la respuesta trae 'cursor' distinto de null hay más filas; reenvía ese valor tal cual, nunca lo construyas a mano.","tags":["bch_empresas"],"security":[{"apiKey":[]},{"oauth2":["bch_empresas:read"]}],"parameters":[{"name":"X-Connect-Connection","in":"header","required":true,"description":"Cuál conexión (conn_…) ejecuta esta llamada. Obligatoria en todo sistema conectable y sin resolución implícita, ni siquiera cuando la organización tiene una sola conexión activa: la conexión ES la empresa, y elegir por ti una que hoy acierta mañana acierta distinto sin que nadie cambie nada. Los ids salen de la tool 'conexiones.estado.consultar'. Si falta, la respuesta es 'validation_error' y no se contacta al sistema externo.","schema":{"type":"string","pattern":"^conn_"},"example":"conn_9tKfR2mQx4Vb"}],"requestBody":{"required":true,"description":"La entrada de la tool, envuelta en 'input'. Manda '{\"input\": {}}' cuando la tool no toma argumentos: el sobre es obligatorio aunque esté vacío.","content":{"application/json":{"schema":{"type":"object","properties":{"input":{"$ref":"#/components/schemas/bch_empresas__cartolas__consultar__Input"}},"required":["input"]}}}},"responses":{"200":{"description":"La tool corrió bien. 'data' es la salida de la tool tal cual, y 'meta' trae el 'request_id' que identifica esta llamada en la bitácora.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/bch_empresas__cartolas__consultar__Output"},"meta":{"$ref":"#/components/schemas/ResponseMeta"}},"required":["data"]}}}},"400":{"$ref":"#/components/responses/Error_validation_error"},"401":{"$ref":"#/components/responses/Error_unauthorized"},"403":{"description":"scope_not_granted | alcance_not_enabled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"$ref":"#/components/responses/Error_tool_not_found"},"409":{"description":"connection_ambiguous | connection_busy","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"428":{"$ref":"#/components/responses/Error_connection_credential_required"},"500":{"$ref":"#/components/responses/Error_internal_error"}}}},"/v1/tools/bch_empresas.conexion.sincronizar/execute":{"post":{"operationId":"bch_empresas__conexion__sincronizar","summary":"Sincronizar conexión Banco de Chile","description":"Sincroniza los alcances solicitados (saldos, movimientos, cartolas) para un período en una sola sesión de portal (un login, un logout). `saldos` es una foto del momento, no del período: solo se sincroniza cuando se pide el período corriente. `cartolas` son los extractos MENSUALES ya emitidos por el banco, un objeto propio que NO alimenta `movimientos`.","tags":["bch_empresas"],"security":[{"apiKey":[]},{"oauth2":["bch_empresas:read"]}],"parameters":[{"name":"X-Connect-Connection","in":"header","required":true,"description":"Cuál conexión (conn_…) ejecuta esta llamada. Obligatoria en todo sistema conectable y sin resolución implícita, ni siquiera cuando la organización tiene una sola conexión activa: la conexión ES la empresa, y elegir por ti una que hoy acierta mañana acierta distinto sin que nadie cambie nada. Los ids salen de la tool 'conexiones.estado.consultar'. Si falta, la respuesta es 'validation_error' y no se contacta al sistema externo.","schema":{"type":"string","pattern":"^conn_"},"example":"conn_9tKfR2mQx4Vb"}],"requestBody":{"required":true,"description":"La entrada de la tool, envuelta en 'input'. Manda '{\"input\": {}}' cuando la tool no toma argumentos: el sobre es obligatorio aunque esté vacío.","content":{"application/json":{"schema":{"type":"object","properties":{"input":{"$ref":"#/components/schemas/bch_empresas__conexion__sincronizar__Input"}},"required":["input"]}}}},"responses":{"200":{"description":"La tool corrió bien. 'data' es la salida de la tool tal cual, y 'meta' trae el 'request_id' que identifica esta llamada en la bitácora.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/bch_empresas__conexion__sincronizar__Output"},"meta":{"$ref":"#/components/schemas/ResponseMeta"}},"required":["data"]}}}},"400":{"$ref":"#/components/responses/Error_validation_error"},"401":{"$ref":"#/components/responses/Error_unauthorized"},"403":{"description":"scope_not_granted | alcance_not_enabled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"$ref":"#/components/responses/Error_tool_not_found"},"409":{"description":"connection_ambiguous | connection_busy","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"428":{"$ref":"#/components/responses/Error_connection_credential_required"},"500":{"$ref":"#/components/responses/Error_internal_error"}}}},"/v1/tools/bch_empresas.conexion.verificar/execute":{"post":{"operationId":"bch_empresas__conexion__verificar","summary":"Verificar conexión Banco de Chile","description":"Prueba las credenciales de la conexión contra Banco de Chile haciendo un login real (y su logout, a cargo del pipeline). No sincroniza ni devuelve datos: solo confirma si las credenciales sirven.","tags":["bch_empresas"],"security":[{"apiKey":[]},{"oauth2":["bch_empresas:read"]}],"parameters":[{"name":"X-Connect-Connection","in":"header","required":true,"description":"Cuál conexión (conn_…) ejecuta esta llamada. Obligatoria en todo sistema conectable y sin resolución implícita, ni siquiera cuando la organización tiene una sola conexión activa: la conexión ES la empresa, y elegir por ti una que hoy acierta mañana acierta distinto sin que nadie cambie nada. Los ids salen de la tool 'conexiones.estado.consultar'. Si falta, la respuesta es 'validation_error' y no se contacta al sistema externo.","schema":{"type":"string","pattern":"^conn_"},"example":"conn_9tKfR2mQx4Vb"}],"requestBody":{"required":true,"description":"La entrada de la tool, envuelta en 'input'. Manda '{\"input\": {}}' cuando la tool no toma argumentos: el sobre es obligatorio aunque esté vacío.","content":{"application/json":{"schema":{"type":"object","properties":{"input":{"$ref":"#/components/schemas/bch_empresas__conexion__verificar__Input"}},"required":["input"]}}}},"responses":{"200":{"description":"La tool corrió bien. 'data' es la salida de la tool tal cual, y 'meta' trae el 'request_id' que identifica esta llamada en la bitácora.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/bch_empresas__conexion__verificar__Output"},"meta":{"$ref":"#/components/schemas/ResponseMeta"}},"required":["data"]}}}},"400":{"$ref":"#/components/responses/Error_validation_error"},"401":{"$ref":"#/components/responses/Error_unauthorized"},"403":{"description":"scope_not_granted | alcance_not_enabled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"$ref":"#/components/responses/Error_tool_not_found"},"409":{"description":"connection_ambiguous | connection_busy","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"428":{"$ref":"#/components/responses/Error_connection_credential_required"},"500":{"$ref":"#/components/responses/Error_internal_error"}}}},"/v1/tools/bch_empresas.movimientos.consultar/execute":{"post":{"operationId":"bch_empresas__movimientos__consultar","summary":"Consultar movimientos de Banco de Chile","description":"Lee los movimientos ya sincronizados de esta conexión, del más reciente al más antiguo, filtrables por período (AAAA-MM) y por cuenta. Lectura pura: NO contacta al banco ni dispara una sincronización. Si el período nunca se sincronizó, devuelve una lista vacía, que NO significa que no haya movimientos. Para traer datos nuevos, usa 'bch_empresas.conexion.sincronizar' primero. Los montos vienen como NÚMERO: 'monto' es la magnitud sin signo, 'type' dice si entra ('debit') o sale ('credit') plata según el libro del banco (al revés de como se lee una cartola), y 'display' es ese monto ya formateado a la chilena con su signo. 'saldoContable' es un balance: no lleva 'type' y conserva su propio signo. 'id' es la huella estable con la que se guardó el movimiento: el mismo movimiento visto en dos sincronizaciones solapadas trae el mismo 'id'. Pagina con 'cursor': cuando la respuesta trae 'cursor' distinto de null hay más filas; reenvía ese valor tal cual, nunca lo construyas a mano.","tags":["bch_empresas"],"security":[{"apiKey":[]},{"oauth2":["bch_empresas:read"]}],"parameters":[{"name":"X-Connect-Connection","in":"header","required":true,"description":"Cuál conexión (conn_…) ejecuta esta llamada. Obligatoria en todo sistema conectable y sin resolución implícita, ni siquiera cuando la organización tiene una sola conexión activa: la conexión ES la empresa, y elegir por ti una que hoy acierta mañana acierta distinto sin que nadie cambie nada. Los ids salen de la tool 'conexiones.estado.consultar'. Si falta, la respuesta es 'validation_error' y no se contacta al sistema externo.","schema":{"type":"string","pattern":"^conn_"},"example":"conn_9tKfR2mQx4Vb"}],"requestBody":{"required":true,"description":"La entrada de la tool, envuelta en 'input'. Manda '{\"input\": {}}' cuando la tool no toma argumentos: el sobre es obligatorio aunque esté vacío.","content":{"application/json":{"schema":{"type":"object","properties":{"input":{"$ref":"#/components/schemas/bch_empresas__movimientos__consultar__Input"}},"required":["input"]}}}},"responses":{"200":{"description":"La tool corrió bien. 'data' es la salida de la tool tal cual, y 'meta' trae el 'request_id' que identifica esta llamada en la bitácora.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/bch_empresas__movimientos__consultar__Output"},"meta":{"$ref":"#/components/schemas/ResponseMeta"}},"required":["data"]}}}},"400":{"$ref":"#/components/responses/Error_validation_error"},"401":{"$ref":"#/components/responses/Error_unauthorized"},"403":{"description":"scope_not_granted | alcance_not_enabled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"$ref":"#/components/responses/Error_tool_not_found"},"409":{"description":"connection_ambiguous | connection_busy","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"428":{"$ref":"#/components/responses/Error_connection_credential_required"},"500":{"$ref":"#/components/responses/Error_internal_error"}}}},"/v1/tools/bch_empresas.saldos.consultar/execute":{"post":{"operationId":"bch_empresas__saldos__consultar","summary":"Consultar saldos de Banco de Chile","description":"Lee los saldos ya sincronizados de esta conexión, con el snapshot más reciente primero. Lectura pura: NO contacta al banco ni dispara una sincronización. Si nunca se sincronizó, devuelve una lista vacía. Para traer datos nuevos, usa 'bch_empresas.conexion.sincronizar' primero. Los saldos son un snapshot POR DÍA, así que sin filtro de fecha la primera página ya son los saldos más recientes que hay guardados. Los tres saldos vienen como NÚMERO y conservan su signo. Un saldo no lleva 'type' (no es una operación). 'saldoContable' puede venir null en filas sincronizadas antes del 2026-08-11, que es cuando se empezó a leer; desde entonces trae el saldo contable real, que difiere del disponible por retenciones y cheques en canje. Pagina con 'cursor': cuando la respuesta trae 'cursor' distinto de null hay más filas; reenvía ese valor tal cual, nunca lo construyas a mano.","tags":["bch_empresas"],"security":[{"apiKey":[]},{"oauth2":["bch_empresas:read"]}],"parameters":[{"name":"X-Connect-Connection","in":"header","required":true,"description":"Cuál conexión (conn_…) ejecuta esta llamada. Obligatoria en todo sistema conectable y sin resolución implícita, ni siquiera cuando la organización tiene una sola conexión activa: la conexión ES la empresa, y elegir por ti una que hoy acierta mañana acierta distinto sin que nadie cambie nada. Los ids salen de la tool 'conexiones.estado.consultar'. Si falta, la respuesta es 'validation_error' y no se contacta al sistema externo.","schema":{"type":"string","pattern":"^conn_"},"example":"conn_9tKfR2mQx4Vb"}],"requestBody":{"required":true,"description":"La entrada de la tool, envuelta en 'input'. Manda '{\"input\": {}}' cuando la tool no toma argumentos: el sobre es obligatorio aunque esté vacío.","content":{"application/json":{"schema":{"type":"object","properties":{"input":{"$ref":"#/components/schemas/bch_empresas__saldos__consultar__Input"}},"required":["input"]}}}},"responses":{"200":{"description":"La tool corrió bien. 'data' es la salida de la tool tal cual, y 'meta' trae el 'request_id' que identifica esta llamada en la bitácora.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/bch_empresas__saldos__consultar__Output"},"meta":{"$ref":"#/components/schemas/ResponseMeta"}},"required":["data"]}}}},"400":{"$ref":"#/components/responses/Error_validation_error"},"401":{"$ref":"#/components/responses/Error_unauthorized"},"403":{"description":"scope_not_granted | alcance_not_enabled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"$ref":"#/components/responses/Error_tool_not_found"},"409":{"description":"connection_ambiguous | connection_busy","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"428":{"$ref":"#/components/responses/Error_connection_credential_required"},"500":{"$ref":"#/components/responses/Error_internal_error"}}}},"/v1/tools/bci_pyme.conexion.sincronizar/execute":{"post":{"operationId":"bci_pyme__conexion__sincronizar","summary":"Sincronizar conexión BCI","description":"Sincroniza los alcances solicitados (saldos, movimientos) para un período en una sola sesión (un login, un logout). `saldos` es una foto del momento, no del período: solo se sincroniza cuando se pide el período corriente.","tags":["bci_pyme"],"security":[{"apiKey":[]},{"oauth2":["bci_pyme:read"]}],"parameters":[{"name":"X-Connect-Connection","in":"header","required":true,"description":"Cuál conexión (conn_…) ejecuta esta llamada. Obligatoria en todo sistema conectable y sin resolución implícita, ni siquiera cuando la organización tiene una sola conexión activa: la conexión ES la empresa, y elegir por ti una que hoy acierta mañana acierta distinto sin que nadie cambie nada. Los ids salen de la tool 'conexiones.estado.consultar'. Si falta, la respuesta es 'validation_error' y no se contacta al sistema externo.","schema":{"type":"string","pattern":"^conn_"},"example":"conn_9tKfR2mQx4Vb"}],"requestBody":{"required":true,"description":"La entrada de la tool, envuelta en 'input'. Manda '{\"input\": {}}' cuando la tool no toma argumentos: el sobre es obligatorio aunque esté vacío.","content":{"application/json":{"schema":{"type":"object","properties":{"input":{"$ref":"#/components/schemas/bci_pyme__conexion__sincronizar__Input"}},"required":["input"]}}}},"responses":{"200":{"description":"La tool corrió bien. 'data' es la salida de la tool tal cual, y 'meta' trae el 'request_id' que identifica esta llamada en la bitácora.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/bci_pyme__conexion__sincronizar__Output"},"meta":{"$ref":"#/components/schemas/ResponseMeta"}},"required":["data"]}}}},"400":{"$ref":"#/components/responses/Error_validation_error"},"401":{"$ref":"#/components/responses/Error_unauthorized"},"403":{"description":"scope_not_granted | alcance_not_enabled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"$ref":"#/components/responses/Error_tool_not_found"},"409":{"description":"connection_ambiguous | connection_busy","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"428":{"$ref":"#/components/responses/Error_connection_credential_required"},"500":{"$ref":"#/components/responses/Error_internal_error"}}}},"/v1/tools/bci_pyme.conexion.verificar/execute":{"post":{"operationId":"bci_pyme__conexion__verificar","summary":"Verificar conexión BCI","description":"Prueba las credenciales de la conexión contra BCI haciendo un login real (y su logout, a cargo del pipeline). No sincroniza ni devuelve datos: solo confirma si las credenciales sirven.","tags":["bci_pyme"],"security":[{"apiKey":[]},{"oauth2":["bci_pyme:read"]}],"parameters":[{"name":"X-Connect-Connection","in":"header","required":true,"description":"Cuál conexión (conn_…) ejecuta esta llamada. Obligatoria en todo sistema conectable y sin resolución implícita, ni siquiera cuando la organización tiene una sola conexión activa: la conexión ES la empresa, y elegir por ti una que hoy acierta mañana acierta distinto sin que nadie cambie nada. Los ids salen de la tool 'conexiones.estado.consultar'. Si falta, la respuesta es 'validation_error' y no se contacta al sistema externo.","schema":{"type":"string","pattern":"^conn_"},"example":"conn_9tKfR2mQx4Vb"}],"requestBody":{"required":true,"description":"La entrada de la tool, envuelta en 'input'. Manda '{\"input\": {}}' cuando la tool no toma argumentos: el sobre es obligatorio aunque esté vacío.","content":{"application/json":{"schema":{"type":"object","properties":{"input":{"$ref":"#/components/schemas/bci_pyme__conexion__verificar__Input"}},"required":["input"]}}}},"responses":{"200":{"description":"La tool corrió bien. 'data' es la salida de la tool tal cual, y 'meta' trae el 'request_id' que identifica esta llamada en la bitácora.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/bci_pyme__conexion__verificar__Output"},"meta":{"$ref":"#/components/schemas/ResponseMeta"}},"required":["data"]}}}},"400":{"$ref":"#/components/responses/Error_validation_error"},"401":{"$ref":"#/components/responses/Error_unauthorized"},"403":{"description":"scope_not_granted | alcance_not_enabled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"$ref":"#/components/responses/Error_tool_not_found"},"409":{"description":"connection_ambiguous | connection_busy","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"428":{"$ref":"#/components/responses/Error_connection_credential_required"},"500":{"$ref":"#/components/responses/Error_internal_error"}}}},"/v1/tools/bci_pyme.movimientos.consultar/execute":{"post":{"operationId":"bci_pyme__movimientos__consultar","summary":"Consultar movimientos de BCI","description":"Lee la caché ya sincronizada; NO contacta al banco. Devuelve los movimientos guardados de esta conexión, del más reciente al más antiguo, filtrables por período (AAAA-MM) y por cuenta. Exige el alcance 'movimientos' habilitado. Si el período nunca se sincronizó, devuelve una lista vacía, que NO significa que no haya movimientos; usa 'bci_pyme.conexion.sincronizar' primero. 'completo' dice si el último sync de ESE período trajo todo: BCI corta en 1000 movimientos por cuenta y mes, y 'completo: false' significa que faltan filas. Sin filtro de 'periodo' vale null, o sea «no se sabe». Ojo con las correcciones del banco: un movimiento corregido entra como fila NUEVA en vez de reemplazar a la anterior, así que ante dos filas del mismo movimiento vale la de 'ultimaLecturaEn' mayor. Los montos vienen como NÚMERO: 'monto' es la magnitud sin signo, 'type' dice si entra ('debit') o sale ('credit') plata según el libro del banco (al revés de como se lee una cartola) y 'display' es ese monto ya formateado a la chilena con su signo. 'saldoContable' es un balance: no lleva 'type' y conserva su propio signo. Pagina con 'cursor': cuando la respuesta trae 'cursor' distinto de null hay más filas: reenvía ese valor tal cual; nunca lo construyas a mano.","tags":["bci_pyme"],"security":[{"apiKey":[]},{"oauth2":["bci_pyme:read"]}],"parameters":[{"name":"X-Connect-Connection","in":"header","required":true,"description":"Cuál conexión (conn_…) ejecuta esta llamada. Obligatoria en todo sistema conectable y sin resolución implícita, ni siquiera cuando la organización tiene una sola conexión activa: la conexión ES la empresa, y elegir por ti una que hoy acierta mañana acierta distinto sin que nadie cambie nada. Los ids salen de la tool 'conexiones.estado.consultar'. Si falta, la respuesta es 'validation_error' y no se contacta al sistema externo.","schema":{"type":"string","pattern":"^conn_"},"example":"conn_9tKfR2mQx4Vb"}],"requestBody":{"required":true,"description":"La entrada de la tool, envuelta en 'input'. Manda '{\"input\": {}}' cuando la tool no toma argumentos: el sobre es obligatorio aunque esté vacío.","content":{"application/json":{"schema":{"type":"object","properties":{"input":{"$ref":"#/components/schemas/bci_pyme__movimientos__consultar__Input"}},"required":["input"]}}}},"responses":{"200":{"description":"La tool corrió bien. 'data' es la salida de la tool tal cual, y 'meta' trae el 'request_id' que identifica esta llamada en la bitácora.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/bci_pyme__movimientos__consultar__Output"},"meta":{"$ref":"#/components/schemas/ResponseMeta"}},"required":["data"]}}}},"400":{"$ref":"#/components/responses/Error_validation_error"},"401":{"$ref":"#/components/responses/Error_unauthorized"},"403":{"description":"scope_not_granted | alcance_not_enabled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"$ref":"#/components/responses/Error_tool_not_found"},"409":{"description":"connection_ambiguous | connection_busy","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"428":{"$ref":"#/components/responses/Error_connection_credential_required"},"500":{"$ref":"#/components/responses/Error_internal_error"}}}},"/v1/tools/bci_pyme.saldos.consultar/execute":{"post":{"operationId":"bci_pyme__saldos__consultar","summary":"Consultar saldos de BCI","description":"Lee la caché ya sincronizada; NO contacta al banco. Devuelve los saldos guardados de esta conexión (contable, disponible, 9AM y retención), con el snapshot más reciente primero. Exige el alcance 'saldos' habilitado. Si nunca se sincronizó, devuelve una lista vacía: eso NO significa que la empresa no tenga cuentas. Para traer datos nuevos usa 'bci_pyme.conexion.sincronizar' primero. Los saldos son un snapshot POR DÍA, así que sin filtro de fecha la primera página ya son los más recientes que hay guardados. Los cuatro saldos vienen como NÚMERO ya normalizado y conservan su signo: un sobregiro es negativo. Un saldo no lleva 'type' (no es una operación). 'ultimaLecturaEn' dice cuándo se leyó esa fila del banco: si es vieja, la conexión puede estar pausada. Pagina con 'cursor': cuando la respuesta trae 'cursor' distinto de null hay más filas: reenvía ese valor tal cual; nunca lo construyas a mano.","tags":["bci_pyme"],"security":[{"apiKey":[]},{"oauth2":["bci_pyme:read"]}],"parameters":[{"name":"X-Connect-Connection","in":"header","required":true,"description":"Cuál conexión (conn_…) ejecuta esta llamada. Obligatoria en todo sistema conectable y sin resolución implícita, ni siquiera cuando la organización tiene una sola conexión activa: la conexión ES la empresa, y elegir por ti una que hoy acierta mañana acierta distinto sin que nadie cambie nada. Los ids salen de la tool 'conexiones.estado.consultar'. Si falta, la respuesta es 'validation_error' y no se contacta al sistema externo.","schema":{"type":"string","pattern":"^conn_"},"example":"conn_9tKfR2mQx4Vb"}],"requestBody":{"required":true,"description":"La entrada de la tool, envuelta en 'input'. Manda '{\"input\": {}}' cuando la tool no toma argumentos: el sobre es obligatorio aunque esté vacío.","content":{"application/json":{"schema":{"type":"object","properties":{"input":{"$ref":"#/components/schemas/bci_pyme__saldos__consultar__Input"}},"required":["input"]}}}},"responses":{"200":{"description":"La tool corrió bien. 'data' es la salida de la tool tal cual, y 'meta' trae el 'request_id' que identifica esta llamada en la bitácora.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/bci_pyme__saldos__consultar__Output"},"meta":{"$ref":"#/components/schemas/ResponseMeta"}},"required":["data"]}}}},"400":{"$ref":"#/components/responses/Error_validation_error"},"401":{"$ref":"#/components/responses/Error_unauthorized"},"403":{"description":"scope_not_granted | alcance_not_enabled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"$ref":"#/components/responses/Error_tool_not_found"},"409":{"description":"connection_ambiguous | connection_busy","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"428":{"$ref":"#/components/responses/Error_connection_credential_required"},"500":{"$ref":"#/components/responses/Error_internal_error"}}}},"/v1/tools/bice_empresas.conexion.sincronizar/execute":{"post":{"operationId":"bice_empresas__conexion__sincronizar","summary":"Sincronizar conexión BICE","description":"Sincroniza los alcances solicitados (saldos, movimientos) para un período en una sola sesión de portal. `saldos` es una foto del momento, no del período: solo se sincroniza cuando se pide el período corriente.","tags":["bice_empresas"],"security":[{"apiKey":[]},{"oauth2":["bice_empresas:read"]}],"parameters":[{"name":"X-Connect-Connection","in":"header","required":true,"description":"Cuál conexión (conn_…) ejecuta esta llamada. Obligatoria en todo sistema conectable y sin resolución implícita, ni siquiera cuando la organización tiene una sola conexión activa: la conexión ES la empresa, y elegir por ti una que hoy acierta mañana acierta distinto sin que nadie cambie nada. Los ids salen de la tool 'conexiones.estado.consultar'. Si falta, la respuesta es 'validation_error' y no se contacta al sistema externo.","schema":{"type":"string","pattern":"^conn_"},"example":"conn_9tKfR2mQx4Vb"}],"requestBody":{"required":true,"description":"La entrada de la tool, envuelta en 'input'. Manda '{\"input\": {}}' cuando la tool no toma argumentos: el sobre es obligatorio aunque esté vacío.","content":{"application/json":{"schema":{"type":"object","properties":{"input":{"$ref":"#/components/schemas/bice_empresas__conexion__sincronizar__Input"}},"required":["input"]}}}},"responses":{"200":{"description":"La tool corrió bien. 'data' es la salida de la tool tal cual, y 'meta' trae el 'request_id' que identifica esta llamada en la bitácora.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/bice_empresas__conexion__sincronizar__Output"},"meta":{"$ref":"#/components/schemas/ResponseMeta"}},"required":["data"]}}}},"400":{"$ref":"#/components/responses/Error_validation_error"},"401":{"$ref":"#/components/responses/Error_unauthorized"},"403":{"description":"scope_not_granted | alcance_not_enabled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"$ref":"#/components/responses/Error_tool_not_found"},"409":{"description":"connection_ambiguous | connection_busy","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"428":{"$ref":"#/components/responses/Error_connection_credential_required"},"500":{"$ref":"#/components/responses/Error_internal_error"}}}},"/v1/tools/bice_empresas.conexion.verificar/execute":{"post":{"operationId":"bice_empresas__conexion__verificar","summary":"Verificar conexión BICE","description":"Prueba las credenciales de la conexión contra BICE haciendo un login real (y su logout, a cargo del pipeline). No sincroniza ni devuelve datos: solo confirma si las credenciales sirven.","tags":["bice_empresas"],"security":[{"apiKey":[]},{"oauth2":["bice_empresas:read"]}],"parameters":[{"name":"X-Connect-Connection","in":"header","required":true,"description":"Cuál conexión (conn_…) ejecuta esta llamada. Obligatoria en todo sistema conectable y sin resolución implícita, ni siquiera cuando la organización tiene una sola conexión activa: la conexión ES la empresa, y elegir por ti una que hoy acierta mañana acierta distinto sin que nadie cambie nada. Los ids salen de la tool 'conexiones.estado.consultar'. Si falta, la respuesta es 'validation_error' y no se contacta al sistema externo.","schema":{"type":"string","pattern":"^conn_"},"example":"conn_9tKfR2mQx4Vb"}],"requestBody":{"required":true,"description":"La entrada de la tool, envuelta en 'input'. Manda '{\"input\": {}}' cuando la tool no toma argumentos: el sobre es obligatorio aunque esté vacío.","content":{"application/json":{"schema":{"type":"object","properties":{"input":{"$ref":"#/components/schemas/bice_empresas__conexion__verificar__Input"}},"required":["input"]}}}},"responses":{"200":{"description":"La tool corrió bien. 'data' es la salida de la tool tal cual, y 'meta' trae el 'request_id' que identifica esta llamada en la bitácora.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/bice_empresas__conexion__verificar__Output"},"meta":{"$ref":"#/components/schemas/ResponseMeta"}},"required":["data"]}}}},"400":{"$ref":"#/components/responses/Error_validation_error"},"401":{"$ref":"#/components/responses/Error_unauthorized"},"403":{"description":"scope_not_granted | alcance_not_enabled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"$ref":"#/components/responses/Error_tool_not_found"},"409":{"description":"connection_ambiguous | connection_busy","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"428":{"$ref":"#/components/responses/Error_connection_credential_required"},"500":{"$ref":"#/components/responses/Error_internal_error"}}}},"/v1/tools/bice_empresas.movimientos.consultar/execute":{"post":{"operationId":"bice_empresas__movimientos__consultar","summary":"Consultar movimientos de BICE Empresas","description":"Lee los movimientos ya sincronizados de esta conexión, del más reciente al más antiguo, filtrables por período (AAAA-MM), por cuenta y por 'type' (el eje credit/debit del libro del banco: 'debit' para los abonos, 'credit' para los cargos). Lectura pura: NO contacta al banco ni dispara una sincronización. Si el período nunca se sincronizó, devuelve una lista vacía, que NO significa que no haya movimientos. Para traer datos nuevos, usa 'bice_empresas.conexion.sincronizar' primero. Los montos vienen como NÚMERO: 'monto' es la magnitud sin signo, 'type' dice si entra ('debit') o sale ('credit') plata según el libro del banco (al revés de como se lee una cartola), y 'display' es ese monto ya formateado a la chilena con su signo. 'saldoContable' es un balance: no lleva 'type' y conserva su propio signo. Pagina con 'cursor': cuando la respuesta trae 'cursor' distinto de null hay más filas. reenvía ese valor tal cual; nunca lo construyas a mano.","tags":["bice_empresas"],"security":[{"apiKey":[]},{"oauth2":["bice_empresas:read"]}],"parameters":[{"name":"X-Connect-Connection","in":"header","required":true,"description":"Cuál conexión (conn_…) ejecuta esta llamada. Obligatoria en todo sistema conectable y sin resolución implícita, ni siquiera cuando la organización tiene una sola conexión activa: la conexión ES la empresa, y elegir por ti una que hoy acierta mañana acierta distinto sin que nadie cambie nada. Los ids salen de la tool 'conexiones.estado.consultar'. Si falta, la respuesta es 'validation_error' y no se contacta al sistema externo.","schema":{"type":"string","pattern":"^conn_"},"example":"conn_9tKfR2mQx4Vb"}],"requestBody":{"required":true,"description":"La entrada de la tool, envuelta en 'input'. Manda '{\"input\": {}}' cuando la tool no toma argumentos: el sobre es obligatorio aunque esté vacío.","content":{"application/json":{"schema":{"type":"object","properties":{"input":{"$ref":"#/components/schemas/bice_empresas__movimientos__consultar__Input"}},"required":["input"]}}}},"responses":{"200":{"description":"La tool corrió bien. 'data' es la salida de la tool tal cual, y 'meta' trae el 'request_id' que identifica esta llamada en la bitácora.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/bice_empresas__movimientos__consultar__Output"},"meta":{"$ref":"#/components/schemas/ResponseMeta"}},"required":["data"]}}}},"400":{"$ref":"#/components/responses/Error_validation_error"},"401":{"$ref":"#/components/responses/Error_unauthorized"},"403":{"description":"scope_not_granted | alcance_not_enabled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"$ref":"#/components/responses/Error_tool_not_found"},"409":{"description":"connection_ambiguous | connection_busy","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"428":{"$ref":"#/components/responses/Error_connection_credential_required"},"500":{"$ref":"#/components/responses/Error_internal_error"}}}},"/v1/tools/bice_empresas.saldos.consultar/execute":{"post":{"operationId":"bice_empresas__saldos__consultar","summary":"Consultar saldos de BICE Empresas","description":"Lee los saldos ya sincronizados de esta conexión, con el snapshot más reciente primero. Lectura pura: NO contacta al banco ni dispara una sincronización. Si nunca se sincronizó, devuelve una lista vacía. Para traer datos nuevos, usa 'bice_empresas.conexion.sincronizar' primero. Los saldos son un snapshot POR DÍA, así que sin filtro de fecha la primera página ya son los saldos más recientes que hay guardados. Los dos saldos vienen como NÚMERO y conservan su signo: un sobregiro es negativo. Un saldo no lleva 'type' (no es una operación). Pagina con 'cursor': cuando la respuesta trae 'cursor' distinto de null hay más filas: reenvía ese valor tal cual; nunca lo construyas a mano.","tags":["bice_empresas"],"security":[{"apiKey":[]},{"oauth2":["bice_empresas:read"]}],"parameters":[{"name":"X-Connect-Connection","in":"header","required":true,"description":"Cuál conexión (conn_…) ejecuta esta llamada. Obligatoria en todo sistema conectable y sin resolución implícita, ni siquiera cuando la organización tiene una sola conexión activa: la conexión ES la empresa, y elegir por ti una que hoy acierta mañana acierta distinto sin que nadie cambie nada. Los ids salen de la tool 'conexiones.estado.consultar'. Si falta, la respuesta es 'validation_error' y no se contacta al sistema externo.","schema":{"type":"string","pattern":"^conn_"},"example":"conn_9tKfR2mQx4Vb"}],"requestBody":{"required":true,"description":"La entrada de la tool, envuelta en 'input'. Manda '{\"input\": {}}' cuando la tool no toma argumentos: el sobre es obligatorio aunque esté vacío.","content":{"application/json":{"schema":{"type":"object","properties":{"input":{"$ref":"#/components/schemas/bice_empresas__saldos__consultar__Input"}},"required":["input"]}}}},"responses":{"200":{"description":"La tool corrió bien. 'data' es la salida de la tool tal cual, y 'meta' trae el 'request_id' que identifica esta llamada en la bitácora.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/bice_empresas__saldos__consultar__Output"},"meta":{"$ref":"#/components/schemas/ResponseMeta"}},"required":["data"]}}}},"400":{"$ref":"#/components/responses/Error_validation_error"},"401":{"$ref":"#/components/responses/Error_unauthorized"},"403":{"description":"scope_not_granted | alcance_not_enabled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"$ref":"#/components/responses/Error_tool_not_found"},"409":{"description":"connection_ambiguous | connection_busy","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"428":{"$ref":"#/components/responses/Error_connection_credential_required"},"500":{"$ref":"#/components/responses/Error_internal_error"}}}},"/v1/tools/conexiones.enlace.crear/execute":{"post":{"operationId":"conexiones__enlace__crear","summary":"Crear un enlace para conectar un sistema","description":"Crea un enlace de un solo uso donde la persona entrega sus credenciales del sistema para conectarlo. Devuelve el enlace SIEMPRE con su dominio completo visible y explicando quién lo pidió y para qué; nunca lo presentes como un aviso del banco ni del SII. La credencial se cifra en el vault de esta misma organización y no la ve nadie más, tampoco tú. El enlace vence y sirve una sola vez. Después de que la persona lo complete, usa 'conexiones.estado.consultar' para saber si ya hay datos.","tags":["conexiones"],"security":[{"apiKey":[]},{"oauth2":["conexiones:write"]}],"requestBody":{"required":true,"description":"La entrada de la tool, envuelta en 'input'. Manda '{\"input\": {}}' cuando la tool no toma argumentos: el sobre es obligatorio aunque esté vacío.","content":{"application/json":{"schema":{"type":"object","properties":{"input":{"$ref":"#/components/schemas/conexiones__enlace__crear__Input"}},"required":["input"]}}}},"responses":{"200":{"description":"La tool corrió bien. 'data' es la salida de la tool tal cual, y 'meta' trae el 'request_id' que identifica esta llamada en la bitácora.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/conexiones__enlace__crear__Output"},"meta":{"$ref":"#/components/schemas/ResponseMeta"}},"required":["data"]}}}},"400":{"$ref":"#/components/responses/Error_validation_error"},"401":{"$ref":"#/components/responses/Error_unauthorized"},"403":{"description":"scope_not_granted | alcance_not_enabled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"$ref":"#/components/responses/Error_tool_not_found"},"409":{"description":"connection_ambiguous | connection_busy","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"428":{"$ref":"#/components/responses/Error_connection_credential_required"},"500":{"$ref":"#/components/responses/Error_internal_error"}}}},"/v1/tools/conexiones.estado.consultar/execute":{"post":{"operationId":"conexiones__estado__consultar","summary":"Consultar el estado de las conexiones","description":"Dice en qué va cada conexión: si la credencial quedó vinculada, qué sincronizaciones corrieron y si YA HAY DATOS para consultar ('datosListos'). Úsala después de que la persona complete un enlace, y antes de intentar leer: un listado vacío no significa que no haya nada, puede ser que todavía no sincronizó. La primera sincronización de un sistema con navegador puede tardar cerca de un minuto. El campo 'herramientas' trae los ids que ya puedes invocar; si tu cliente MCP todavía no los muestra en su lista, invócalos con la herramienta 'execute' pasando el id en 'tool'.","tags":["conexiones"],"security":[{"apiKey":[]},{"oauth2":["conexiones:read"]}],"requestBody":{"required":true,"description":"La entrada de la tool, envuelta en 'input'. Manda '{\"input\": {}}' cuando la tool no toma argumentos: el sobre es obligatorio aunque esté vacío.","content":{"application/json":{"schema":{"type":"object","properties":{"input":{"$ref":"#/components/schemas/conexiones__estado__consultar__Input"}},"required":["input"]}}}},"responses":{"200":{"description":"La tool corrió bien. 'data' es la salida de la tool tal cual, y 'meta' trae el 'request_id' que identifica esta llamada en la bitácora.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/conexiones__estado__consultar__Output"},"meta":{"$ref":"#/components/schemas/ResponseMeta"}},"required":["data"]}}}},"400":{"$ref":"#/components/responses/Error_validation_error"},"401":{"$ref":"#/components/responses/Error_unauthorized"},"403":{"description":"scope_not_granted | alcance_not_enabled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"$ref":"#/components/responses/Error_tool_not_found"},"409":{"description":"connection_ambiguous | connection_busy","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"428":{"$ref":"#/components/responses/Error_connection_credential_required"},"500":{"$ref":"#/components/responses/Error_internal_error"}}}},"/v1/tools/conexiones.sistemas.listar/execute":{"post":{"operationId":"conexiones__sistemas__listar","summary":"Listar los sistemas que se pueden conectar","description":"Devuelve el catálogo de sistemas chilenos que esta organización puede conectar (bancos, SII) con el estado de cada uno: si ya está conectado, sus conexiones, los módulos de datos que ofrece y las herramientas que quedan disponibles al conectarlo. Úsala SIEMPRE antes de crear un enlace, para obtener el código exacto del sistema, no lo adivines. Si un sistema aparece con 'conectado' en false, el camino es 'conexiones.enlace.crear'.","tags":["conexiones"],"security":[{"apiKey":[]},{"oauth2":["conexiones:read"]}],"requestBody":{"required":true,"description":"La entrada de la tool, envuelta en 'input'. Manda '{\"input\": {}}' cuando la tool no toma argumentos: el sobre es obligatorio aunque esté vacío.","content":{"application/json":{"schema":{"type":"object","properties":{"input":{"$ref":"#/components/schemas/conexiones__sistemas__listar__Input"}},"required":["input"]}}}},"responses":{"200":{"description":"La tool corrió bien. 'data' es la salida de la tool tal cual, y 'meta' trae el 'request_id' que identifica esta llamada en la bitácora.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/conexiones__sistemas__listar__Output"},"meta":{"$ref":"#/components/schemas/ResponseMeta"}},"required":["data"]}}}},"400":{"$ref":"#/components/responses/Error_validation_error"},"401":{"$ref":"#/components/responses/Error_unauthorized"},"403":{"description":"scope_not_granted | alcance_not_enabled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"$ref":"#/components/responses/Error_tool_not_found"},"409":{"description":"connection_ambiguous | connection_busy","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"428":{"$ref":"#/components/responses/Error_connection_credential_required"},"500":{"$ref":"#/components/responses/Error_internal_error"}}}},"/v1/tools/core.timestamp.now/execute":{"post":{"operationId":"core__timestamp__now","summary":"Hora del servidor","description":"Devuelve la marca de tiempo actual del servidor (ISO-8601 UTC, epoch Unix) y la zona horaria solicitada. Prueba el camino E2E; no requiere credenciales.","tags":["core"],"security":[{"apiKey":[]},{"oauth2":["core:read"]}],"requestBody":{"required":true,"description":"La entrada de la tool, envuelta en 'input'. Manda '{\"input\": {}}' cuando la tool no toma argumentos: el sobre es obligatorio aunque esté vacío.","content":{"application/json":{"schema":{"type":"object","properties":{"input":{"$ref":"#/components/schemas/core__timestamp__now__Input"}},"required":["input"]}}}},"responses":{"200":{"description":"La tool corrió bien. 'data' es la salida de la tool tal cual, y 'meta' trae el 'request_id' que identifica esta llamada en la bitácora.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/core__timestamp__now__Output"},"meta":{"$ref":"#/components/schemas/ResponseMeta"}},"required":["data"]}}}},"400":{"$ref":"#/components/responses/Error_validation_error"},"401":{"$ref":"#/components/responses/Error_unauthorized"},"403":{"description":"scope_not_granted | alcance_not_enabled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"$ref":"#/components/responses/Error_tool_not_found"},"409":{"description":"connection_ambiguous | connection_busy","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"428":{"$ref":"#/components/responses/Error_connection_credential_required"},"500":{"$ref":"#/components/responses/Error_internal_error"}}}},"/v1/tools/echo.message.reflect/execute":{"post":{"operationId":"echo__message__reflect","summary":"Reflejar mensaje","description":"Devuelve el texto recibido junto con su longitud. Conector de ejemplo que prueba que el patrón del registry generaliza; no requiere credenciales.","tags":["echo"],"security":[{"apiKey":[]},{"oauth2":["echo:read"]}],"requestBody":{"required":true,"description":"La entrada de la tool, envuelta en 'input'. Manda '{\"input\": {}}' cuando la tool no toma argumentos: el sobre es obligatorio aunque esté vacío.","content":{"application/json":{"schema":{"type":"object","properties":{"input":{"$ref":"#/components/schemas/echo__message__reflect__Input"}},"required":["input"]}}}},"responses":{"200":{"description":"La tool corrió bien. 'data' es la salida de la tool tal cual, y 'meta' trae el 'request_id' que identifica esta llamada en la bitácora.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/echo__message__reflect__Output"},"meta":{"$ref":"#/components/schemas/ResponseMeta"}},"required":["data"]}}}},"400":{"$ref":"#/components/responses/Error_validation_error"},"401":{"$ref":"#/components/responses/Error_unauthorized"},"403":{"description":"scope_not_granted | alcance_not_enabled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"$ref":"#/components/responses/Error_tool_not_found"},"409":{"description":"connection_ambiguous | connection_busy","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"428":{"$ref":"#/components/responses/Error_connection_credential_required"},"500":{"$ref":"#/components/responses/Error_internal_error"}}}},"/v1/tools/indicadores.serie.consultar/execute":{"post":{"operationId":"indicadores__serie__consultar","summary":"Serie histórica del indicador","description":"Devuelve la serie de valores de un indicador entre dos fechas (AAAA-MM-DD), en orden ascendente, acotada por 'limite' (tope duro 1000), leída del almacén de referencia global.","tags":["indicadores"],"security":[{"apiKey":[]},{"oauth2":["indicadores:read"]}],"requestBody":{"required":true,"description":"La entrada de la tool, envuelta en 'input'. Manda '{\"input\": {}}' cuando la tool no toma argumentos: el sobre es obligatorio aunque esté vacío.","content":{"application/json":{"schema":{"type":"object","properties":{"input":{"$ref":"#/components/schemas/indicadores__serie__consultar__Input"}},"required":["input"]}}}},"responses":{"200":{"description":"La tool corrió bien. 'data' es la salida de la tool tal cual, y 'meta' trae el 'request_id' que identifica esta llamada en la bitácora.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/indicadores__serie__consultar__Output"},"meta":{"$ref":"#/components/schemas/ResponseMeta"}},"required":["data"]}}}},"400":{"$ref":"#/components/responses/Error_validation_error"},"401":{"$ref":"#/components/responses/Error_unauthorized"},"403":{"description":"scope_not_granted | alcance_not_enabled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"$ref":"#/components/responses/Error_tool_not_found"},"409":{"description":"connection_ambiguous | connection_busy","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"428":{"$ref":"#/components/responses/Error_connection_credential_required"},"500":{"$ref":"#/components/responses/Error_internal_error"}}}},"/v1/tools/indicadores.valor.actual/execute":{"post":{"operationId":"indicadores__valor__actual","summary":"Valor actual del indicador","description":"Devuelve el ÚLTIMO valor disponible de un indicador económico chileno (UF, DÓLAR, EURO, IPC, UTM), leído del almacén de referencia global; no consulta fuentes externas en tiempo real. 'último disponible' NO es lo mismo que 'el de hoy', y hay que mirar 'fecha' antes de usar el número: la UF y la UTM se publican por ADELANTADO, así que su fecha puede ser futura; y si la ingesta se atrasa, la fecha queda en el pasado. 'antiguedadDias' resuelve las dos de una vez: 0 = es el de hoy, positivo = días de atraso, negativo = está fechado en el futuro.","tags":["indicadores"],"security":[{"apiKey":[]},{"oauth2":["indicadores:read"]}],"requestBody":{"required":true,"description":"La entrada de la tool, envuelta en 'input'. Manda '{\"input\": {}}' cuando la tool no toma argumentos: el sobre es obligatorio aunque esté vacío.","content":{"application/json":{"schema":{"type":"object","properties":{"input":{"$ref":"#/components/schemas/indicadores__valor__actual__Input"}},"required":["input"]}}}},"responses":{"200":{"description":"La tool corrió bien. 'data' es la salida de la tool tal cual, y 'meta' trae el 'request_id' que identifica esta llamada en la bitácora.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/indicadores__valor__actual__Output"},"meta":{"$ref":"#/components/schemas/ResponseMeta"}},"required":["data"]}}}},"400":{"$ref":"#/components/responses/Error_validation_error"},"401":{"$ref":"#/components/responses/Error_unauthorized"},"403":{"description":"scope_not_granted | alcance_not_enabled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"$ref":"#/components/responses/Error_tool_not_found"},"409":{"description":"connection_ambiguous | connection_busy","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"428":{"$ref":"#/components/responses/Error_connection_credential_required"},"500":{"$ref":"#/components/responses/Error_internal_error"}}}},"/v1/tools/indicadores.valor.consultar/execute":{"post":{"operationId":"indicadores__valor__consultar","summary":"Valor del indicador a una fecha","description":"Devuelve el valor de un indicador vigente a una fecha dada (AAAA-MM-DD) CON ARRASTRE: si esa fecha no tiene dato propio (un fin de semana, un feriado, o una fuente que no se ha actualizado) devuelve el último valor anterior. La 'fecha' de la respuesta puede ser DISTINTA de la solicitada, y 'esArrastre' lo marca: false = ese día tiene dato propio; true = el valor corresponde a la 'fecha' devuelta, que es anterior. Pedir una fecha futura devuelve el último valor conocido con 'esArrastre: true', no un error. Todo se lee del almacén de referencia global.","tags":["indicadores"],"security":[{"apiKey":[]},{"oauth2":["indicadores:read"]}],"requestBody":{"required":true,"description":"La entrada de la tool, envuelta en 'input'. Manda '{\"input\": {}}' cuando la tool no toma argumentos: el sobre es obligatorio aunque esté vacío.","content":{"application/json":{"schema":{"type":"object","properties":{"input":{"$ref":"#/components/schemas/indicadores__valor__consultar__Input"}},"required":["input"]}}}},"responses":{"200":{"description":"La tool corrió bien. 'data' es la salida de la tool tal cual, y 'meta' trae el 'request_id' que identifica esta llamada en la bitácora.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/indicadores__valor__consultar__Output"},"meta":{"$ref":"#/components/schemas/ResponseMeta"}},"required":["data"]}}}},"400":{"$ref":"#/components/responses/Error_validation_error"},"401":{"$ref":"#/components/responses/Error_unauthorized"},"403":{"description":"scope_not_granted | alcance_not_enabled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"$ref":"#/components/responses/Error_tool_not_found"},"409":{"description":"connection_ambiguous | connection_busy","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"428":{"$ref":"#/components/responses/Error_connection_credential_required"},"500":{"$ref":"#/components/responses/Error_internal_error"}}}},"/v1/tools/notta.conexion.verificar/execute":{"post":{"operationId":"notta__conexion__verificar","summary":"Verificar conexión Notta","description":"Prueba las credenciales de la conexión contra Notta haciendo un login real (y su logout, a cargo del pipeline). No sincroniza ni devuelve datos: solo confirma si las credenciales sirven.","tags":["notta"],"security":[{"apiKey":[]},{"oauth2":["notta:read"]}],"parameters":[{"name":"X-Connect-Connection","in":"header","required":true,"description":"Cuál conexión (conn_…) ejecuta esta llamada. Obligatoria en todo sistema conectable y sin resolución implícita, ni siquiera cuando la organización tiene una sola conexión activa: la conexión ES la empresa, y elegir por ti una que hoy acierta mañana acierta distinto sin que nadie cambie nada. Los ids salen de la tool 'conexiones.estado.consultar'. Si falta, la respuesta es 'validation_error' y no se contacta al sistema externo.","schema":{"type":"string","pattern":"^conn_"},"example":"conn_9tKfR2mQx4Vb"}],"requestBody":{"required":true,"description":"La entrada de la tool, envuelta en 'input'. Manda '{\"input\": {}}' cuando la tool no toma argumentos: el sobre es obligatorio aunque esté vacío.","content":{"application/json":{"schema":{"type":"object","properties":{"input":{"$ref":"#/components/schemas/notta__conexion__verificar__Input"}},"required":["input"]}}}},"responses":{"200":{"description":"La tool corrió bien. 'data' es la salida de la tool tal cual, y 'meta' trae el 'request_id' que identifica esta llamada en la bitácora.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/notta__conexion__verificar__Output"},"meta":{"$ref":"#/components/schemas/ResponseMeta"}},"required":["data"]}}}},"400":{"$ref":"#/components/responses/Error_validation_error"},"401":{"$ref":"#/components/responses/Error_unauthorized"},"403":{"description":"scope_not_granted | alcance_not_enabled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"$ref":"#/components/responses/Error_tool_not_found"},"409":{"description":"connection_ambiguous | connection_busy","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"428":{"$ref":"#/components/responses/Error_connection_credential_required"},"500":{"$ref":"#/components/responses/Error_internal_error"}}}},"/v1/tools/notta.dte.consultar/execute":{"post":{"operationId":"notta__dte__consultar","summary":"Consultar un DTE","description":"Consulta el estado actual de un DTE en Notta por su id. Es el seguimiento del flujo asíncrono que abre notta.dte.emitir: el estado avanza de 'queued' a 'EPR' (aceptado por el SII) o a un rechazo terminal (RFR/RCT/RSC), y en ese caso sii_glosa trae el motivo que dio el SII. Devuelve también folio, montos calculados y ambiente SII.","tags":["notta"],"security":[{"apiKey":[]},{"oauth2":["notta:read"]}],"parameters":[{"name":"X-Connect-Connection","in":"header","required":true,"description":"Cuál conexión (conn_…) ejecuta esta llamada. Obligatoria en todo sistema conectable y sin resolución implícita, ni siquiera cuando la organización tiene una sola conexión activa: la conexión ES la empresa, y elegir por ti una que hoy acierta mañana acierta distinto sin que nadie cambie nada. Los ids salen de la tool 'conexiones.estado.consultar'. Si falta, la respuesta es 'validation_error' y no se contacta al sistema externo.","schema":{"type":"string","pattern":"^conn_"},"example":"conn_9tKfR2mQx4Vb"}],"requestBody":{"required":true,"description":"La entrada de la tool, envuelta en 'input'. Manda '{\"input\": {}}' cuando la tool no toma argumentos: el sobre es obligatorio aunque esté vacío.","content":{"application/json":{"schema":{"type":"object","properties":{"input":{"$ref":"#/components/schemas/notta__dte__consultar__Input"}},"required":["input"]}}}},"responses":{"200":{"description":"La tool corrió bien. 'data' es la salida de la tool tal cual, y 'meta' trae el 'request_id' que identifica esta llamada en la bitácora.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/notta__dte__consultar__Output"},"meta":{"$ref":"#/components/schemas/ResponseMeta"}},"required":["data"]}}}},"400":{"$ref":"#/components/responses/Error_validation_error"},"401":{"$ref":"#/components/responses/Error_unauthorized"},"403":{"description":"scope_not_granted | alcance_not_enabled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"$ref":"#/components/responses/Error_tool_not_found"},"409":{"description":"connection_ambiguous | connection_busy","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"428":{"$ref":"#/components/responses/Error_connection_credential_required"},"500":{"$ref":"#/components/responses/Error_internal_error"}}}},"/v1/tools/notta.dte.descargar/execute":{"post":{"operationId":"notta__dte__descargar","summary":"Descargar el XML o el PDF de un DTE","description":"Devuelve el XML firmado o el PDF de un DTE como base64. Para consumo programático (REST/SDK). En conversación prefiere notta.dte.reenviar: el base64 de un PDF es inmanejable en chat. Un documento recién emitido todavía no está firmado: hasta que lo esté, la descarga falla de forma reintentable.","tags":["notta"],"security":[{"apiKey":[]},{"oauth2":["notta:read"]}],"parameters":[{"name":"X-Connect-Connection","in":"header","required":true,"description":"Cuál conexión (conn_…) ejecuta esta llamada. Obligatoria en todo sistema conectable y sin resolución implícita, ni siquiera cuando la organización tiene una sola conexión activa: la conexión ES la empresa, y elegir por ti una que hoy acierta mañana acierta distinto sin que nadie cambie nada. Los ids salen de la tool 'conexiones.estado.consultar'. Si falta, la respuesta es 'validation_error' y no se contacta al sistema externo.","schema":{"type":"string","pattern":"^conn_"},"example":"conn_9tKfR2mQx4Vb"}],"requestBody":{"required":true,"description":"La entrada de la tool, envuelta en 'input'. Manda '{\"input\": {}}' cuando la tool no toma argumentos: el sobre es obligatorio aunque esté vacío.","content":{"application/json":{"schema":{"type":"object","properties":{"input":{"$ref":"#/components/schemas/notta__dte__descargar__Input"}},"required":["input"]}}}},"responses":{"200":{"description":"La tool corrió bien. 'data' es la salida de la tool tal cual, y 'meta' trae el 'request_id' que identifica esta llamada en la bitácora.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/notta__dte__descargar__Output"},"meta":{"$ref":"#/components/schemas/ResponseMeta"}},"required":["data"]}}}},"400":{"$ref":"#/components/responses/Error_validation_error"},"401":{"$ref":"#/components/responses/Error_unauthorized"},"403":{"description":"scope_not_granted | alcance_not_enabled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"$ref":"#/components/responses/Error_tool_not_found"},"409":{"description":"connection_ambiguous | connection_busy","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"428":{"$ref":"#/components/responses/Error_connection_credential_required"},"500":{"$ref":"#/components/responses/Error_internal_error"}}}},"/v1/tools/notta.dte.emitir/execute":{"post":{"operationId":"notta__dte__emitir","summary":"Emitir DTE (factura o nota)","description":"Emite un DTE ante el SII vía Notta: factura afecta (33), exenta (34), nota de débito (56) o nota de crédito (61, que exige references[] al documento original, y este solo puede ser una factura 33 o 34). Cada item declara si es exento y su monto_item (cantidad × precio_unitario, ya con el descuento de la línea aplicado); los TOTALES del documento (neto, exento, IVA, total) los calcula Notta. Las NOTAS (56/61) exigen además rut_emisor (el RUT de la empresa de esta conexión, que Notta no deriva en esa ruta) y la nota de débito (56) exige nd_reason; a cambio, no llevan forma_pago ni descuento_global. La emisión es ASÍNCRONA: esta llamada devuelve el documento con folio asignado y estado 'queued'; haz el seguimiento con notta.dte.consultar hasta EPR (aceptado) o un rechazo. Si un intento anterior falló por transporte o timeout, revisa los documentos RECIENTES con notta.dte.listar antes de reintentar, para no duplicar. Con correo_receptor, Notta envía el PDF+XML al receptor cuando el SII acepta.","tags":["notta"],"security":[{"apiKey":[]},{"oauth2":["notta:write"]}],"parameters":[{"name":"X-Connect-Connection","in":"header","required":true,"description":"Cuál conexión (conn_…) ejecuta esta llamada. Obligatoria en todo sistema conectable y sin resolución implícita, ni siquiera cuando la organización tiene una sola conexión activa: la conexión ES la empresa, y elegir por ti una que hoy acierta mañana acierta distinto sin que nadie cambie nada. Los ids salen de la tool 'conexiones.estado.consultar'. Si falta, la respuesta es 'validation_error' y no se contacta al sistema externo.","schema":{"type":"string","pattern":"^conn_"},"example":"conn_9tKfR2mQx4Vb"},{"name":"Idempotency-Key","in":"header","required":false,"description":"Clave de idempotencia para esta acción destructiva. Reenviar la MISMA clave con la misma entrada devuelve la respuesta ya emitida en vez de repetir el efecto; con una entrada distinta responde 'idempotency_conflict', y mientras el primer intento sigue en curso, 'idempotency_in_progress'. Un intento fallido nunca consume la clave. Sin cabecera, el pipeline genera una por ejecución, o sea que no hay deduplicación entre reintentos tuyos: mándala siempre que puedas reintentar.","schema":{"type":"string","maxLength":255},"example":"9d1f4c2a-7b30-4e58-9c11-2f6a8de5b743"}],"requestBody":{"required":true,"description":"La entrada de la tool, envuelta en 'input'. Manda '{\"input\": {}}' cuando la tool no toma argumentos: el sobre es obligatorio aunque esté vacío.","content":{"application/json":{"schema":{"type":"object","properties":{"input":{"$ref":"#/components/schemas/notta__dte__emitir__Input"}},"required":["input"]}}}},"responses":{"200":{"description":"La tool corrió bien. 'data' es la salida de la tool tal cual, y 'meta' trae el 'request_id' que identifica esta llamada en la bitácora.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/notta__dte__emitir__Output"},"meta":{"$ref":"#/components/schemas/ResponseMeta"}},"required":["data"]}}}},"400":{"$ref":"#/components/responses/Error_validation_error"},"401":{"$ref":"#/components/responses/Error_unauthorized"},"403":{"description":"scope_not_granted | alcance_not_enabled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"$ref":"#/components/responses/Error_tool_not_found"},"409":{"description":"connection_ambiguous | connection_busy","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"428":{"$ref":"#/components/responses/Error_connection_credential_required"},"500":{"$ref":"#/components/responses/Error_internal_error"}}}},"/v1/tools/notta.dte.listar/execute":{"post":{"operationId":"notta__dte__listar","summary":"Listar los DTEs recientes","description":"Lista los DTEs MÁS RECIENTES emitidos por esta empresa en Notta (del más nuevo al más antiguo). El API de Notta NO ofrece filtros por tipo, fecha, estado ni receptor: solo un límite de cuántos traer, así que si buscas uno concreto pide más documentos y descarta tú los que no son. Úsalo como red antes de reintentar una emisión que falló por transporte o timeout: si el documento ya aparece entre los recientes, no lo vuelvas a emitir. Devuelve menos campos que notta.dte.consultar (sin neto, IVA ni ambiente): para el detalle completo consulta por id.","tags":["notta"],"security":[{"apiKey":[]},{"oauth2":["notta:read"]}],"parameters":[{"name":"X-Connect-Connection","in":"header","required":true,"description":"Cuál conexión (conn_…) ejecuta esta llamada. Obligatoria en todo sistema conectable y sin resolución implícita, ni siquiera cuando la organización tiene una sola conexión activa: la conexión ES la empresa, y elegir por ti una que hoy acierta mañana acierta distinto sin que nadie cambie nada. Los ids salen de la tool 'conexiones.estado.consultar'. Si falta, la respuesta es 'validation_error' y no se contacta al sistema externo.","schema":{"type":"string","pattern":"^conn_"},"example":"conn_9tKfR2mQx4Vb"}],"requestBody":{"required":true,"description":"La entrada de la tool, envuelta en 'input'. Manda '{\"input\": {}}' cuando la tool no toma argumentos: el sobre es obligatorio aunque esté vacío.","content":{"application/json":{"schema":{"type":"object","properties":{"input":{"$ref":"#/components/schemas/notta__dte__listar__Input"}},"required":["input"]}}}},"responses":{"200":{"description":"La tool corrió bien. 'data' es la salida de la tool tal cual, y 'meta' trae el 'request_id' que identifica esta llamada en la bitácora.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/notta__dte__listar__Output"},"meta":{"$ref":"#/components/schemas/ResponseMeta"}},"required":["data"]}}}},"400":{"$ref":"#/components/responses/Error_validation_error"},"401":{"$ref":"#/components/responses/Error_unauthorized"},"403":{"description":"scope_not_granted | alcance_not_enabled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"$ref":"#/components/responses/Error_tool_not_found"},"409":{"description":"connection_ambiguous | connection_busy","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"428":{"$ref":"#/components/responses/Error_connection_credential_required"},"500":{"$ref":"#/components/responses/Error_internal_error"}}}},"/v1/tools/notta.dte.reenviar/execute":{"post":{"operationId":"notta__dte__reenviar","summary":"Reenviar un DTE por correo","description":"Reenvía el PDF y el XML de un DTE ya emitido al correo del receptor. Sin correo_receptor usa el que ya tiene guardado el documento; con él, lo envía a esa dirección y la recuerda. Es el camino conversacional para entregar un documento: no descarga nada, lo envía. No emite ni modifica el DTE.","tags":["notta"],"security":[{"apiKey":[]},{"oauth2":["notta:write"]}],"parameters":[{"name":"X-Connect-Connection","in":"header","required":true,"description":"Cuál conexión (conn_…) ejecuta esta llamada. Obligatoria en todo sistema conectable y sin resolución implícita, ni siquiera cuando la organización tiene una sola conexión activa: la conexión ES la empresa, y elegir por ti una que hoy acierta mañana acierta distinto sin que nadie cambie nada. Los ids salen de la tool 'conexiones.estado.consultar'. Si falta, la respuesta es 'validation_error' y no se contacta al sistema externo.","schema":{"type":"string","pattern":"^conn_"},"example":"conn_9tKfR2mQx4Vb"}],"requestBody":{"required":true,"description":"La entrada de la tool, envuelta en 'input'. Manda '{\"input\": {}}' cuando la tool no toma argumentos: el sobre es obligatorio aunque esté vacío.","content":{"application/json":{"schema":{"type":"object","properties":{"input":{"$ref":"#/components/schemas/notta__dte__reenviar__Input"}},"required":["input"]}}}},"responses":{"200":{"description":"La tool corrió bien. 'data' es la salida de la tool tal cual, y 'meta' trae el 'request_id' que identifica esta llamada en la bitácora.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/notta__dte__reenviar__Output"},"meta":{"$ref":"#/components/schemas/ResponseMeta"}},"required":["data"]}}}},"400":{"$ref":"#/components/responses/Error_validation_error"},"401":{"$ref":"#/components/responses/Error_unauthorized"},"403":{"description":"scope_not_granted | alcance_not_enabled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"$ref":"#/components/responses/Error_tool_not_found"},"409":{"description":"connection_ambiguous | connection_busy","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"428":{"$ref":"#/components/responses/Error_connection_credential_required"},"500":{"$ref":"#/components/responses/Error_internal_error"}}}},"/v1/tools/previred.certificados.consultar/execute":{"post":{"operationId":"previred__certificados__consultar","summary":"Consultar certificados de cotizaciones de Previred","description":"Lee los certificados oficiales de cotizaciones ya emitidos para esta conexión, uno por trabajador. Es el documento que Previred firma y que una persona pide para probar lo que se le cotizó: 'certificadoUrl' es un enlace firmado para descargarlo. Hay un certificado VIGENTE por trabajador, que cada sincronización reemplaza, y cubre la ventana máxima que Previred admite terminando en el período sincronizado; 'periodoDesde' y 'periodoHasta' dicen cuál es. Si lo que buscas son los montos y no el documento, 'previred.cotizaciones.consultar' los tiene sin descargar nada. Lectura pura: NO contacta a Previred ni dispara una sincronización. Si el período nunca se sincronizó devuelve una lista vacía, que NO significa que no haya datos en Previred. Para traer datos nuevos, usa 'previred.conexion.sincronizar' primero. Pagina con 'cursor': cuando la respuesta trae 'cursor' distinto de null hay más filas, reenvía ese valor tal cual; nunca lo construyas a mano.","tags":["previred"],"security":[{"apiKey":[]},{"oauth2":["previred:read"]}],"parameters":[{"name":"X-Connect-Connection","in":"header","required":true,"description":"Cuál conexión (conn_…) ejecuta esta llamada. Obligatoria en todo sistema conectable y sin resolución implícita, ni siquiera cuando la organización tiene una sola conexión activa: la conexión ES la empresa, y elegir por ti una que hoy acierta mañana acierta distinto sin que nadie cambie nada. Los ids salen de la tool 'conexiones.estado.consultar'. Si falta, la respuesta es 'validation_error' y no se contacta al sistema externo.","schema":{"type":"string","pattern":"^conn_"},"example":"conn_9tKfR2mQx4Vb"}],"requestBody":{"required":true,"description":"La entrada de la tool, envuelta en 'input'. Manda '{\"input\": {}}' cuando la tool no toma argumentos: el sobre es obligatorio aunque esté vacío.","content":{"application/json":{"schema":{"type":"object","properties":{"input":{"$ref":"#/components/schemas/previred__certificados__consultar__Input"}},"required":["input"]}}}},"responses":{"200":{"description":"La tool corrió bien. 'data' es la salida de la tool tal cual, y 'meta' trae el 'request_id' que identifica esta llamada en la bitácora.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/previred__certificados__consultar__Output"},"meta":{"$ref":"#/components/schemas/ResponseMeta"}},"required":["data"]}}}},"400":{"$ref":"#/components/responses/Error_validation_error"},"401":{"$ref":"#/components/responses/Error_unauthorized"},"403":{"description":"scope_not_granted | alcance_not_enabled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"$ref":"#/components/responses/Error_tool_not_found"},"409":{"description":"connection_ambiguous | connection_busy","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"428":{"$ref":"#/components/responses/Error_connection_credential_required"},"500":{"$ref":"#/components/responses/Error_internal_error"}}}},"/v1/tools/previred.conexion.sincronizar/execute":{"post":{"operationId":"previred__conexion__sincronizar","summary":"Sincronizar conexión Previred","description":"Sincroniza los alcances solicitados (planillas, cotizaciones, deuda, f301) para un período en una sola sesión de portal. Es el ÚNICO camino que trae datos de Previred: las tools '.consultar' leen lo que esto haya guardado. 'deuda' es el estado del momento y no del período, así que solo se sincroniza cuando se pide el período corriente. 'f301' trae el archivo de 106 campos con que la Dirección del Trabajo emite el Certificado F30-1 de ese período. 'certificados' emite el certificado oficial de cotizaciones de CADA trabajador y por eso es el alcance más caro: cuesta una petición al portal por persona. 'empresas' lista las empresas que la credencial administra y no cuesta ninguna petición: ese listado ya llega al iniciar sesión.","tags":["previred"],"security":[{"apiKey":[]},{"oauth2":["previred:read"]}],"parameters":[{"name":"X-Connect-Connection","in":"header","required":true,"description":"Cuál conexión (conn_…) ejecuta esta llamada. Obligatoria en todo sistema conectable y sin resolución implícita, ni siquiera cuando la organización tiene una sola conexión activa: la conexión ES la empresa, y elegir por ti una que hoy acierta mañana acierta distinto sin que nadie cambie nada. Los ids salen de la tool 'conexiones.estado.consultar'. Si falta, la respuesta es 'validation_error' y no se contacta al sistema externo.","schema":{"type":"string","pattern":"^conn_"},"example":"conn_9tKfR2mQx4Vb"}],"requestBody":{"required":true,"description":"La entrada de la tool, envuelta en 'input'. Manda '{\"input\": {}}' cuando la tool no toma argumentos: el sobre es obligatorio aunque esté vacío.","content":{"application/json":{"schema":{"type":"object","properties":{"input":{"$ref":"#/components/schemas/previred__conexion__sincronizar__Input"}},"required":["input"]}}}},"responses":{"200":{"description":"La tool corrió bien. 'data' es la salida de la tool tal cual, y 'meta' trae el 'request_id' que identifica esta llamada en la bitácora.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/previred__conexion__sincronizar__Output"},"meta":{"$ref":"#/components/schemas/ResponseMeta"}},"required":["data"]}}}},"400":{"$ref":"#/components/responses/Error_validation_error"},"401":{"$ref":"#/components/responses/Error_unauthorized"},"403":{"description":"scope_not_granted | alcance_not_enabled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"$ref":"#/components/responses/Error_tool_not_found"},"409":{"description":"connection_ambiguous | connection_busy","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"428":{"$ref":"#/components/responses/Error_connection_credential_required"},"500":{"$ref":"#/components/responses/Error_internal_error"}}}},"/v1/tools/previred.conexion.verificar/execute":{"post":{"operationId":"previred__conexion__verificar","summary":"Verificar conexión Previred","description":"Prueba las credenciales de la conexión contra Previred haciendo un login real (y su logout, a cargo del pipeline). No sincroniza ni devuelve datos: solo confirma si las credenciales sirven.","tags":["previred"],"security":[{"apiKey":[]},{"oauth2":["previred:read"]}],"parameters":[{"name":"X-Connect-Connection","in":"header","required":true,"description":"Cuál conexión (conn_…) ejecuta esta llamada. Obligatoria en todo sistema conectable y sin resolución implícita, ni siquiera cuando la organización tiene una sola conexión activa: la conexión ES la empresa, y elegir por ti una que hoy acierta mañana acierta distinto sin que nadie cambie nada. Los ids salen de la tool 'conexiones.estado.consultar'. Si falta, la respuesta es 'validation_error' y no se contacta al sistema externo.","schema":{"type":"string","pattern":"^conn_"},"example":"conn_9tKfR2mQx4Vb"}],"requestBody":{"required":true,"description":"La entrada de la tool, envuelta en 'input'. Manda '{\"input\": {}}' cuando la tool no toma argumentos: el sobre es obligatorio aunque esté vacío.","content":{"application/json":{"schema":{"type":"object","properties":{"input":{"$ref":"#/components/schemas/previred__conexion__verificar__Input"}},"required":["input"]}}}},"responses":{"200":{"description":"La tool corrió bien. 'data' es la salida de la tool tal cual, y 'meta' trae el 'request_id' que identifica esta llamada en la bitácora.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/previred__conexion__verificar__Output"},"meta":{"$ref":"#/components/schemas/ResponseMeta"}},"required":["data"]}}}},"400":{"$ref":"#/components/responses/Error_validation_error"},"401":{"$ref":"#/components/responses/Error_unauthorized"},"403":{"description":"scope_not_granted | alcance_not_enabled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"$ref":"#/components/responses/Error_tool_not_found"},"409":{"description":"connection_ambiguous | connection_busy","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"428":{"$ref":"#/components/responses/Error_connection_credential_required"},"500":{"$ref":"#/components/responses/Error_internal_error"}}}},"/v1/tools/previred.cotizaciones.consultar/execute":{"post":{"operationId":"previred__cotizaciones__consultar","summary":"Consultar cotizaciones por trabajador de Previred","description":"Lee las cotizaciones ya sincronizadas de esta conexión, por trabajador, período e institución. Es la materia prima del «certificado de cotizaciones» que emite Previred: el certificado en sí es un PDF que se genera para el rango que se pida, así que aquí viven los HECHOS (quién cotizó cuánto, a qué institución, en qué mes) y no el documento. Un mismo trabajador y mes trae varias filas, una por institución. Lectura pura: NO contacta a Previred ni dispara una sincronización. Si el período nunca se sincronizó devuelve una lista vacía, que NO significa que no haya datos en Previred. Para traer datos nuevos, usa 'previred.conexion.sincronizar' primero. Pagina con 'cursor': cuando la respuesta trae 'cursor' distinto de null hay más filas, reenvía ese valor tal cual; nunca lo construyas a mano.","tags":["previred"],"security":[{"apiKey":[]},{"oauth2":["previred:read"]}],"parameters":[{"name":"X-Connect-Connection","in":"header","required":true,"description":"Cuál conexión (conn_…) ejecuta esta llamada. Obligatoria en todo sistema conectable y sin resolución implícita, ni siquiera cuando la organización tiene una sola conexión activa: la conexión ES la empresa, y elegir por ti una que hoy acierta mañana acierta distinto sin que nadie cambie nada. Los ids salen de la tool 'conexiones.estado.consultar'. Si falta, la respuesta es 'validation_error' y no se contacta al sistema externo.","schema":{"type":"string","pattern":"^conn_"},"example":"conn_9tKfR2mQx4Vb"}],"requestBody":{"required":true,"description":"La entrada de la tool, envuelta en 'input'. Manda '{\"input\": {}}' cuando la tool no toma argumentos: el sobre es obligatorio aunque esté vacío.","content":{"application/json":{"schema":{"type":"object","properties":{"input":{"$ref":"#/components/schemas/previred__cotizaciones__consultar__Input"}},"required":["input"]}}}},"responses":{"200":{"description":"La tool corrió bien. 'data' es la salida de la tool tal cual, y 'meta' trae el 'request_id' que identifica esta llamada en la bitácora.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/previred__cotizaciones__consultar__Output"},"meta":{"$ref":"#/components/schemas/ResponseMeta"}},"required":["data"]}}}},"400":{"$ref":"#/components/responses/Error_validation_error"},"401":{"$ref":"#/components/responses/Error_unauthorized"},"403":{"description":"scope_not_granted | alcance_not_enabled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"$ref":"#/components/responses/Error_tool_not_found"},"409":{"description":"connection_ambiguous | connection_busy","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"428":{"$ref":"#/components/responses/Error_connection_credential_required"},"500":{"$ref":"#/components/responses/Error_internal_error"}}}},"/v1/tools/previred.deuda.consultar/execute":{"post":{"operationId":"previred__deuda__consultar","summary":"Consultar deuda previsional en Previred","description":"Lee la deuda previsional ya sincronizada de esta conexión, y responde la pregunta del mes: ¿está al día? Trae las dos mitades. 'dnp' son declaraciones sin pago, con su institución y sus cargos legales. 'por_pagar' son las nóminas cuyo plazo CORRE y aún no se pagan: ahí 'institucion' es \"Todas\" y solo viene 'montoTotal', porque el portal da un total por nómina sin desglosarlo. Recuerda el calendario: el plazo vence el día 13 del mes siguiente al de las remuneraciones. Ojo con 'montoTotal': Previred lo recalcula según la fecha en que efectivamente se pague, así que el valor guardado es el del momento de la sincronización (por eso cada fila trae 'observadoEn') y NO una cifra a la que uno pueda comprometerse. Lectura pura: NO contacta a Previred ni dispara una sincronización. Si el período nunca se sincronizó devuelve una lista vacía, que NO significa que no haya datos en Previred. Para traer datos nuevos, usa 'previred.conexion.sincronizar' primero. Pagina con 'cursor': cuando la respuesta trae 'cursor' distinto de null hay más filas, reenvía ese valor tal cual; nunca lo construyas a mano.","tags":["previred"],"security":[{"apiKey":[]},{"oauth2":["previred:read"]}],"parameters":[{"name":"X-Connect-Connection","in":"header","required":true,"description":"Cuál conexión (conn_…) ejecuta esta llamada. Obligatoria en todo sistema conectable y sin resolución implícita, ni siquiera cuando la organización tiene una sola conexión activa: la conexión ES la empresa, y elegir por ti una que hoy acierta mañana acierta distinto sin que nadie cambie nada. Los ids salen de la tool 'conexiones.estado.consultar'. Si falta, la respuesta es 'validation_error' y no se contacta al sistema externo.","schema":{"type":"string","pattern":"^conn_"},"example":"conn_9tKfR2mQx4Vb"}],"requestBody":{"required":true,"description":"La entrada de la tool, envuelta en 'input'. Manda '{\"input\": {}}' cuando la tool no toma argumentos: el sobre es obligatorio aunque esté vacío.","content":{"application/json":{"schema":{"type":"object","properties":{"input":{"$ref":"#/components/schemas/previred__deuda__consultar__Input"}},"required":["input"]}}}},"responses":{"200":{"description":"La tool corrió bien. 'data' es la salida de la tool tal cual, y 'meta' trae el 'request_id' que identifica esta llamada en la bitácora.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/previred__deuda__consultar__Output"},"meta":{"$ref":"#/components/schemas/ResponseMeta"}},"required":["data"]}}}},"400":{"$ref":"#/components/responses/Error_validation_error"},"401":{"$ref":"#/components/responses/Error_unauthorized"},"403":{"description":"scope_not_granted | alcance_not_enabled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"$ref":"#/components/responses/Error_tool_not_found"},"409":{"description":"connection_ambiguous | connection_busy","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"428":{"$ref":"#/components/responses/Error_connection_credential_required"},"500":{"$ref":"#/components/responses/Error_internal_error"}}}},"/v1/tools/previred.empresas.consultar/execute":{"post":{"operationId":"previred__empresas__consultar","summary":"Consultar empresas de la credencial de Previred","description":"Lista las empresas que la credencial de esta conexión administra en Previred. Sirve para saber qué OTRAS empresas se podrían conectar con la misma clave, que es la pregunta típica de un contador con varias empresas a cargo. Ojo: cada conexión de Connect es UNA empresa, así que ver una empresa aquí no significa poder leer sus datos; para eso hay que crear su propia conexión. Lectura pura: NO contacta a Previred ni dispara una sincronización. Si el período nunca se sincronizó devuelve una lista vacía, que NO significa que no haya datos en Previred. Para traer datos nuevos, usa 'previred.conexion.sincronizar' primero. Pagina con 'cursor': cuando la respuesta trae 'cursor' distinto de null hay más filas, reenvía ese valor tal cual; nunca lo construyas a mano.","tags":["previred"],"security":[{"apiKey":[]},{"oauth2":["previred:read"]}],"parameters":[{"name":"X-Connect-Connection","in":"header","required":true,"description":"Cuál conexión (conn_…) ejecuta esta llamada. Obligatoria en todo sistema conectable y sin resolución implícita, ni siquiera cuando la organización tiene una sola conexión activa: la conexión ES la empresa, y elegir por ti una que hoy acierta mañana acierta distinto sin que nadie cambie nada. Los ids salen de la tool 'conexiones.estado.consultar'. Si falta, la respuesta es 'validation_error' y no se contacta al sistema externo.","schema":{"type":"string","pattern":"^conn_"},"example":"conn_9tKfR2mQx4Vb"}],"requestBody":{"required":true,"description":"La entrada de la tool, envuelta en 'input'. Manda '{\"input\": {}}' cuando la tool no toma argumentos: el sobre es obligatorio aunque esté vacío.","content":{"application/json":{"schema":{"type":"object","properties":{"input":{"$ref":"#/components/schemas/previred__empresas__consultar__Input"}},"required":["input"]}}}},"responses":{"200":{"description":"La tool corrió bien. 'data' es la salida de la tool tal cual, y 'meta' trae el 'request_id' que identifica esta llamada en la bitácora.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/previred__empresas__consultar__Output"},"meta":{"$ref":"#/components/schemas/ResponseMeta"}},"required":["data"]}}}},"400":{"$ref":"#/components/responses/Error_validation_error"},"401":{"$ref":"#/components/responses/Error_unauthorized"},"403":{"description":"scope_not_granted | alcance_not_enabled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"$ref":"#/components/responses/Error_tool_not_found"},"409":{"description":"connection_ambiguous | connection_busy","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"428":{"$ref":"#/components/responses/Error_connection_credential_required"},"500":{"$ref":"#/components/responses/Error_internal_error"}}}},"/v1/tools/previred.f301.consultar/execute":{"post":{"operationId":"previred__f301__consultar","summary":"Consultar archivos para el F30-1 de Previred","description":"Lee los archivos ya sincronizados con que la Dirección del Trabajo emite el Certificado F30-1 de Cumplimiento de Obligaciones Laborales y Previsionales, el que una empresa contratista tiene que entregarle a su mandante para que le paguen. Cada fila es el archivo de 106 campos de un período y una nómina, y 'archivoUrl' es un enlace firmado para descargarlo y subirlo al sitio de la Dirección del Trabajo. Connect NO emite el certificado: entrega el archivo con que se pide. Lectura pura: NO contacta a Previred ni dispara una sincronización. Si el período nunca se sincronizó devuelve una lista vacía, que NO significa que no haya datos en Previred. Para traer datos nuevos, usa 'previred.conexion.sincronizar' primero. Pagina con 'cursor': cuando la respuesta trae 'cursor' distinto de null hay más filas, reenvía ese valor tal cual; nunca lo construyas a mano.","tags":["previred"],"security":[{"apiKey":[]},{"oauth2":["previred:read"]}],"parameters":[{"name":"X-Connect-Connection","in":"header","required":true,"description":"Cuál conexión (conn_…) ejecuta esta llamada. Obligatoria en todo sistema conectable y sin resolución implícita, ni siquiera cuando la organización tiene una sola conexión activa: la conexión ES la empresa, y elegir por ti una que hoy acierta mañana acierta distinto sin que nadie cambie nada. Los ids salen de la tool 'conexiones.estado.consultar'. Si falta, la respuesta es 'validation_error' y no se contacta al sistema externo.","schema":{"type":"string","pattern":"^conn_"},"example":"conn_9tKfR2mQx4Vb"}],"requestBody":{"required":true,"description":"La entrada de la tool, envuelta en 'input'. Manda '{\"input\": {}}' cuando la tool no toma argumentos: el sobre es obligatorio aunque esté vacío.","content":{"application/json":{"schema":{"type":"object","properties":{"input":{"$ref":"#/components/schemas/previred__f301__consultar__Input"}},"required":["input"]}}}},"responses":{"200":{"description":"La tool corrió bien. 'data' es la salida de la tool tal cual, y 'meta' trae el 'request_id' que identifica esta llamada en la bitácora.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/previred__f301__consultar__Output"},"meta":{"$ref":"#/components/schemas/ResponseMeta"}},"required":["data"]}}}},"400":{"$ref":"#/components/responses/Error_validation_error"},"401":{"$ref":"#/components/responses/Error_unauthorized"},"403":{"description":"scope_not_granted | alcance_not_enabled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"$ref":"#/components/responses/Error_tool_not_found"},"409":{"description":"connection_ambiguous | connection_busy","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"428":{"$ref":"#/components/responses/Error_connection_credential_required"},"500":{"$ref":"#/components/responses/Error_internal_error"}}}},"/v1/tools/previred.planillas.consultar/execute":{"post":{"operationId":"previred__planillas__consultar","summary":"Consultar planillas pagadas de Previred","description":"Lee las planillas de cotizaciones ya sincronizadas de esta conexión, de la más reciente a la más antigua, filtrables por período (AAAA-MM) y por institución. Un pago de un período se abre en VARIAS planillas, una por cada institución previsional (AFP, Fonasa o Isapre, AFC, mutual, CCAF): por eso un mismo período trae varias filas y eso es lo normal, no una duplicación. Cada fila trae su 'folio', que es el identificador con que Previred la direcciona, y 'comprobanteUrl' cuando el PDF ya está descargado. Lectura pura: NO contacta a Previred ni dispara una sincronización. Si el período nunca se sincronizó devuelve una lista vacía, que NO significa que no haya datos en Previred. Para traer datos nuevos, usa 'previred.conexion.sincronizar' primero. Pagina con 'cursor': cuando la respuesta trae 'cursor' distinto de null hay más filas, reenvía ese valor tal cual; nunca lo construyas a mano.","tags":["previred"],"security":[{"apiKey":[]},{"oauth2":["previred:read"]}],"parameters":[{"name":"X-Connect-Connection","in":"header","required":true,"description":"Cuál conexión (conn_…) ejecuta esta llamada. Obligatoria en todo sistema conectable y sin resolución implícita, ni siquiera cuando la organización tiene una sola conexión activa: la conexión ES la empresa, y elegir por ti una que hoy acierta mañana acierta distinto sin que nadie cambie nada. Los ids salen de la tool 'conexiones.estado.consultar'. Si falta, la respuesta es 'validation_error' y no se contacta al sistema externo.","schema":{"type":"string","pattern":"^conn_"},"example":"conn_9tKfR2mQx4Vb"}],"requestBody":{"required":true,"description":"La entrada de la tool, envuelta en 'input'. Manda '{\"input\": {}}' cuando la tool no toma argumentos: el sobre es obligatorio aunque esté vacío.","content":{"application/json":{"schema":{"type":"object","properties":{"input":{"$ref":"#/components/schemas/previred__planillas__consultar__Input"}},"required":["input"]}}}},"responses":{"200":{"description":"La tool corrió bien. 'data' es la salida de la tool tal cual, y 'meta' trae el 'request_id' que identifica esta llamada en la bitácora.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/previred__planillas__consultar__Output"},"meta":{"$ref":"#/components/schemas/ResponseMeta"}},"required":["data"]}}}},"400":{"$ref":"#/components/responses/Error_validation_error"},"401":{"$ref":"#/components/responses/Error_unauthorized"},"403":{"description":"scope_not_granted | alcance_not_enabled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"$ref":"#/components/responses/Error_tool_not_found"},"409":{"description":"connection_ambiguous | connection_busy","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"428":{"$ref":"#/components/responses/Error_connection_credential_required"},"500":{"$ref":"#/components/responses/Error_internal_error"}}}},"/v1/tools/sii.boletas_honorarios.consultar/execute":{"post":{"operationId":"sii__boletas_honorarios__consultar","summary":"Consultar boletas de honorarios del SII","description":"Lee las boletas de honorarios electrónicas (BHE) ya sincronizadas para esta conexión, filtradas por período y/o perspectiva (emitidas = las que emitió esta empresa; recibidas = las que le emitieron, donde esta empresa es el agente retenedor). Lectura pura: NO dispara una sincronización nueva ni contacta al SII. Si el período nunca se sincronizó, devuelve una lista vacía y 'sincronizacion: null'. Para traer datos nuevos, usa 'sii.conexion.sincronizar' primero. El filtro tributario canónico es 'estado' distinto de 'S' sobre el código crudo: 'V' (anulación pendiente), 'R' y 'U' (observadas) siguen VIGENTES; solo 'S' está anulada: nunca filtres por 'estadoNormalizado' igual a 'vigente'. El 'estado' es el observado en la última sincronización del período, no el estado final: una BHE puede anularse, o revertir de anulación pendiente a vigente, hasta el 1 de marzo del año siguiente, y por petición administrativa sin plazo después. Resincroniza el período para refrescarlo; 'ultimaLecturaEn' dice cuándo se observó cada fila. La suma de 'retencion_receptor' es el insumo para cuadrar el F29 código 151, no el código 151: ese además incluye las retenciones por BTE y se imputa al mes del pago. Pagina con 'cursor': cuando la respuesta trae 'cursor' distinto de null, hay más filas. reenvía ese valor tal cual en 'cursor' para pedir la página siguiente; nunca lo construyas a mano.","tags":["sii"],"security":[{"apiKey":[]},{"oauth2":["sii:read"]}],"parameters":[{"name":"X-Connect-Connection","in":"header","required":true,"description":"Cuál conexión (conn_…) ejecuta esta llamada. Obligatoria en todo sistema conectable y sin resolución implícita, ni siquiera cuando la organización tiene una sola conexión activa: la conexión ES la empresa, y elegir por ti una que hoy acierta mañana acierta distinto sin que nadie cambie nada. Los ids salen de la tool 'conexiones.estado.consultar'. Si falta, la respuesta es 'validation_error' y no se contacta al sistema externo.","schema":{"type":"string","pattern":"^conn_"},"example":"conn_9tKfR2mQx4Vb"}],"requestBody":{"required":true,"description":"La entrada de la tool, envuelta en 'input'. Manda '{\"input\": {}}' cuando la tool no toma argumentos: el sobre es obligatorio aunque esté vacío.","content":{"application/json":{"schema":{"type":"object","properties":{"input":{"$ref":"#/components/schemas/sii__boletas_honorarios__consultar__Input"}},"required":["input"]}}}},"responses":{"200":{"description":"La tool corrió bien. 'data' es la salida de la tool tal cual, y 'meta' trae el 'request_id' que identifica esta llamada en la bitácora.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/sii__boletas_honorarios__consultar__Output"},"meta":{"$ref":"#/components/schemas/ResponseMeta"}},"required":["data"]}}}},"400":{"$ref":"#/components/responses/Error_validation_error"},"401":{"$ref":"#/components/responses/Error_unauthorized"},"403":{"description":"scope_not_granted | alcance_not_enabled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"$ref":"#/components/responses/Error_tool_not_found"},"409":{"description":"connection_ambiguous | connection_busy","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"428":{"$ref":"#/components/responses/Error_connection_credential_required"},"500":{"$ref":"#/components/responses/Error_internal_error"}}}},"/v1/tools/sii.boletas.consultar/execute":{"post":{"operationId":"sii__boletas__consultar","summary":"Consultar boletas electrónicas del SII","description":"Lee el resumen diario de boletas electrónicas ya sincronizado para esta conexión, filtrado por período. Lectura pura: NO dispara una sincronización nueva ni contacta al SII. Si el período nunca se sincronizó, devuelve una lista vacía y 'sincronizacion: null'. Para traer datos nuevos, use 'sii.conexion.sincronizar' primero. Pagina con 'cursor': cuando la respuesta trae 'cursor' distinto de null, hay más filas. reenvía ese valor tal cual en 'cursor' para pedir la página siguiente; nunca lo construyas a mano.","tags":["sii"],"security":[{"apiKey":[]},{"oauth2":["sii:read"]}],"parameters":[{"name":"X-Connect-Connection","in":"header","required":true,"description":"Cuál conexión (conn_…) ejecuta esta llamada. Obligatoria en todo sistema conectable y sin resolución implícita, ni siquiera cuando la organización tiene una sola conexión activa: la conexión ES la empresa, y elegir por ti una que hoy acierta mañana acierta distinto sin que nadie cambie nada. Los ids salen de la tool 'conexiones.estado.consultar'. Si falta, la respuesta es 'validation_error' y no se contacta al sistema externo.","schema":{"type":"string","pattern":"^conn_"},"example":"conn_9tKfR2mQx4Vb"}],"requestBody":{"required":true,"description":"La entrada de la tool, envuelta en 'input'. Manda '{\"input\": {}}' cuando la tool no toma argumentos: el sobre es obligatorio aunque esté vacío.","content":{"application/json":{"schema":{"type":"object","properties":{"input":{"$ref":"#/components/schemas/sii__boletas__consultar__Input"}},"required":["input"]}}}},"responses":{"200":{"description":"La tool corrió bien. 'data' es la salida de la tool tal cual, y 'meta' trae el 'request_id' que identifica esta llamada en la bitácora.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/sii__boletas__consultar__Output"},"meta":{"$ref":"#/components/schemas/ResponseMeta"}},"required":["data"]}}}},"400":{"$ref":"#/components/responses/Error_validation_error"},"401":{"$ref":"#/components/responses/Error_unauthorized"},"403":{"description":"scope_not_granted | alcance_not_enabled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"$ref":"#/components/responses/Error_tool_not_found"},"409":{"description":"connection_ambiguous | connection_busy","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"428":{"$ref":"#/components/responses/Error_connection_credential_required"},"500":{"$ref":"#/components/responses/Error_internal_error"}}}},"/v1/tools/sii.conexion.sincronizar/execute":{"post":{"operationId":"sii__conexion__sincronizar","summary":"Sincronizar conexión SII","description":"Sincroniza los alcances solicitados (rcv, boletas, guias, boletas_honorarios, documentos) para un período en una sola sesión (un login, un logout).","tags":["sii"],"security":[{"apiKey":[]},{"oauth2":["sii:read"]}],"parameters":[{"name":"X-Connect-Connection","in":"header","required":true,"description":"Cuál conexión (conn_…) ejecuta esta llamada. Obligatoria en todo sistema conectable y sin resolución implícita, ni siquiera cuando la organización tiene una sola conexión activa: la conexión ES la empresa, y elegir por ti una que hoy acierta mañana acierta distinto sin que nadie cambie nada. Los ids salen de la tool 'conexiones.estado.consultar'. Si falta, la respuesta es 'validation_error' y no se contacta al sistema externo.","schema":{"type":"string","pattern":"^conn_"},"example":"conn_9tKfR2mQx4Vb"}],"requestBody":{"required":true,"description":"La entrada de la tool, envuelta en 'input'. Manda '{\"input\": {}}' cuando la tool no toma argumentos: el sobre es obligatorio aunque esté vacío.","content":{"application/json":{"schema":{"type":"object","properties":{"input":{"$ref":"#/components/schemas/sii__conexion__sincronizar__Input"}},"required":["input"]}}}},"responses":{"200":{"description":"La tool corrió bien. 'data' es la salida de la tool tal cual, y 'meta' trae el 'request_id' que identifica esta llamada en la bitácora.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/sii__conexion__sincronizar__Output"},"meta":{"$ref":"#/components/schemas/ResponseMeta"}},"required":["data"]}}}},"400":{"$ref":"#/components/responses/Error_validation_error"},"401":{"$ref":"#/components/responses/Error_unauthorized"},"403":{"description":"scope_not_granted | alcance_not_enabled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"$ref":"#/components/responses/Error_tool_not_found"},"409":{"description":"connection_ambiguous | connection_busy","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"428":{"$ref":"#/components/responses/Error_connection_credential_required"},"500":{"$ref":"#/components/responses/Error_internal_error"}}}},"/v1/tools/sii.conexion.verificar/execute":{"post":{"operationId":"sii__conexion__verificar","summary":"Verificar conexión SII","description":"Prueba las credenciales de la conexión contra el SII haciendo un login real (y su logout, a cargo del pipeline). No sincroniza ni devuelve datos: solo confirma si las credenciales sirven.","tags":["sii"],"security":[{"apiKey":[]},{"oauth2":["sii:read"]}],"parameters":[{"name":"X-Connect-Connection","in":"header","required":true,"description":"Cuál conexión (conn_…) ejecuta esta llamada. Obligatoria en todo sistema conectable y sin resolución implícita, ni siquiera cuando la organización tiene una sola conexión activa: la conexión ES la empresa, y elegir por ti una que hoy acierta mañana acierta distinto sin que nadie cambie nada. Los ids salen de la tool 'conexiones.estado.consultar'. Si falta, la respuesta es 'validation_error' y no se contacta al sistema externo.","schema":{"type":"string","pattern":"^conn_"},"example":"conn_9tKfR2mQx4Vb"}],"requestBody":{"required":true,"description":"La entrada de la tool, envuelta en 'input'. Manda '{\"input\": {}}' cuando la tool no toma argumentos: el sobre es obligatorio aunque esté vacío.","content":{"application/json":{"schema":{"type":"object","properties":{"input":{"$ref":"#/components/schemas/sii__conexion__verificar__Input"}},"required":["input"]}}}},"responses":{"200":{"description":"La tool corrió bien. 'data' es la salida de la tool tal cual, y 'meta' trae el 'request_id' que identifica esta llamada en la bitácora.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/sii__conexion__verificar__Output"},"meta":{"$ref":"#/components/schemas/ResponseMeta"}},"required":["data"]}}}},"400":{"$ref":"#/components/responses/Error_validation_error"},"401":{"$ref":"#/components/responses/Error_unauthorized"},"403":{"description":"scope_not_granted | alcance_not_enabled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"$ref":"#/components/responses/Error_tool_not_found"},"409":{"description":"connection_ambiguous | connection_busy","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"428":{"$ref":"#/components/responses/Error_connection_credential_required"},"500":{"$ref":"#/components/responses/Error_internal_error"}}}},"/v1/tools/sii.documentos.consultar/execute":{"post":{"operationId":"sii__documentos__consultar","summary":"Consultar documentos respaldados del SII","description":"Lista los documentos tributarios (DTE) cuyo XML firmado ya se respaldó para esta conexión, filtrables por período, perspectiva y tipo de documento. Devuelve SOLO las columnas de cabecera: ni el XML ni el detalle de ítems viaja aquí. Para el detalle de UN documento (sus ítems con cantidad, unidad y precio, los giros y direcciones de emisor y receptor, y la forma de pago) usa 'sii.documentos.detallar' con el 'tipoDte', el 'folio' y el 'rutEmisor' de la fila correspondiente. Lectura pura: NO dispara una sincronización nueva ni contacta al SII. Si el período nunca se sincronizó, devuelve una lista vacía y 'sincronizacion: null'; para traer datos nuevos usa 'sii.conexion.sincronizar' primero. Este respaldo es lo que el RCV no tiene y no puede tener: el RCV dice qué documentos EXISTEN, este respaldo trae el documento. Sólo lo sirven las conexiones cuya credencial es la clave tributaria de una persona que representa a la empresa. Pagina con 'cursor': cuando la respuesta trae 'cursor' distinto de null, hay más filas. Reenvía ese valor tal cual en 'cursor' para pedir la página siguiente; nunca lo construyas a mano.","tags":["sii"],"security":[{"apiKey":[]},{"oauth2":["sii:read"]}],"parameters":[{"name":"X-Connect-Connection","in":"header","required":true,"description":"Cuál conexión (conn_…) ejecuta esta llamada. Obligatoria en todo sistema conectable y sin resolución implícita, ni siquiera cuando la organización tiene una sola conexión activa: la conexión ES la empresa, y elegir por ti una que hoy acierta mañana acierta distinto sin que nadie cambie nada. Los ids salen de la tool 'conexiones.estado.consultar'. Si falta, la respuesta es 'validation_error' y no se contacta al sistema externo.","schema":{"type":"string","pattern":"^conn_"},"example":"conn_9tKfR2mQx4Vb"}],"requestBody":{"required":true,"description":"La entrada de la tool, envuelta en 'input'. Manda '{\"input\": {}}' cuando la tool no toma argumentos: el sobre es obligatorio aunque esté vacío.","content":{"application/json":{"schema":{"type":"object","properties":{"input":{"$ref":"#/components/schemas/sii__documentos__consultar__Input"}},"required":["input"]}}}},"responses":{"200":{"description":"La tool corrió bien. 'data' es la salida de la tool tal cual, y 'meta' trae el 'request_id' que identifica esta llamada en la bitácora.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/sii__documentos__consultar__Output"},"meta":{"$ref":"#/components/schemas/ResponseMeta"}},"required":["data"]}}}},"400":{"$ref":"#/components/responses/Error_validation_error"},"401":{"$ref":"#/components/responses/Error_unauthorized"},"403":{"description":"scope_not_granted | alcance_not_enabled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"$ref":"#/components/responses/Error_tool_not_found"},"409":{"description":"connection_ambiguous | connection_busy","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"428":{"$ref":"#/components/responses/Error_connection_credential_required"},"500":{"$ref":"#/components/responses/Error_internal_error"}}}},"/v1/tools/sii.documentos.detallar/execute":{"post":{"operationId":"sii__documentos__detallar","summary":"Detallar un documento respaldado del SII","description":"Devuelve UN documento tributario respaldado, con su detalle completo: los ítems (nombre, cantidad, unidad, precio unitario y monto), los giros, direcciones y comunas de emisor y receptor, y la forma de pago. El documento se identifica con las tres partes que lo hacen único ('tipoDte', 'folio' y 'rutEmisor'), y las tres salen de una fila de 'sii.documentos.consultar'. Lectura pura: NO contacta al SII, lee el XML que ya se respaldó y lo parsea en el momento. Si ese documento no está sincronizado, devuelve 'documento: null'. No es un error: es que no lo tenemos, así que sincroniza su período con 'sii.conexion.sincronizar' y vuelve a preguntar. El XML firmado sólo viaja si se pide 'incluirXml: true'; sin eso la respuesta trae el detalle ya estructurado, que es lo que casi siempre se necesita. Un ítem con 'cantidad', 'unidad' o 'precioUnitario' en null es un ítem que no los declaró (un flete, un descuento): no debe leerse como cero.","tags":["sii"],"security":[{"apiKey":[]},{"oauth2":["sii:read"]}],"parameters":[{"name":"X-Connect-Connection","in":"header","required":true,"description":"Cuál conexión (conn_…) ejecuta esta llamada. Obligatoria en todo sistema conectable y sin resolución implícita, ni siquiera cuando la organización tiene una sola conexión activa: la conexión ES la empresa, y elegir por ti una que hoy acierta mañana acierta distinto sin que nadie cambie nada. Los ids salen de la tool 'conexiones.estado.consultar'. Si falta, la respuesta es 'validation_error' y no se contacta al sistema externo.","schema":{"type":"string","pattern":"^conn_"},"example":"conn_9tKfR2mQx4Vb"}],"requestBody":{"required":true,"description":"La entrada de la tool, envuelta en 'input'. Manda '{\"input\": {}}' cuando la tool no toma argumentos: el sobre es obligatorio aunque esté vacío.","content":{"application/json":{"schema":{"type":"object","properties":{"input":{"$ref":"#/components/schemas/sii__documentos__detallar__Input"}},"required":["input"]}}}},"responses":{"200":{"description":"La tool corrió bien. 'data' es la salida de la tool tal cual, y 'meta' trae el 'request_id' que identifica esta llamada en la bitácora.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/sii__documentos__detallar__Output"},"meta":{"$ref":"#/components/schemas/ResponseMeta"}},"required":["data"]}}}},"400":{"$ref":"#/components/responses/Error_validation_error"},"401":{"$ref":"#/components/responses/Error_unauthorized"},"403":{"description":"scope_not_granted | alcance_not_enabled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"$ref":"#/components/responses/Error_tool_not_found"},"409":{"description":"connection_ambiguous | connection_busy","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"428":{"$ref":"#/components/responses/Error_connection_credential_required"},"500":{"$ref":"#/components/responses/Error_internal_error"}}}},"/v1/tools/sii.guias.consultar/execute":{"post":{"operationId":"sii__guias__consultar","summary":"Consultar guías de despacho del SII","description":"Lee las guías de despacho electrónicas (DTE 52) ya sincronizadas para esta conexión, filtradas por período y/o perspectiva (emitidas = las que emitió esta empresa; recibidas = las que le emitieron). Lectura pura: NO dispara una sincronización nueva ni contacta al SII. Si el período nunca se sincronizó, devuelve una lista vacía y 'sincronizacion: null'. Para traer datos nuevos, use 'sii.conexion.sincronizar' primero. Ojo: el SII solo conserva el detalle de guías de los últimos 6 meses, así que un período más viejo no se puede sincronizar aunque exista. Pagina con 'cursor': cuando la respuesta trae 'cursor' distinto de null, hay más filas. reenvía ese valor tal cual en 'cursor' para pedir la página siguiente; nunca lo construyas a mano.","tags":["sii"],"security":[{"apiKey":[]},{"oauth2":["sii:read"]}],"parameters":[{"name":"X-Connect-Connection","in":"header","required":true,"description":"Cuál conexión (conn_…) ejecuta esta llamada. Obligatoria en todo sistema conectable y sin resolución implícita, ni siquiera cuando la organización tiene una sola conexión activa: la conexión ES la empresa, y elegir por ti una que hoy acierta mañana acierta distinto sin que nadie cambie nada. Los ids salen de la tool 'conexiones.estado.consultar'. Si falta, la respuesta es 'validation_error' y no se contacta al sistema externo.","schema":{"type":"string","pattern":"^conn_"},"example":"conn_9tKfR2mQx4Vb"}],"requestBody":{"required":true,"description":"La entrada de la tool, envuelta en 'input'. Manda '{\"input\": {}}' cuando la tool no toma argumentos: el sobre es obligatorio aunque esté vacío.","content":{"application/json":{"schema":{"type":"object","properties":{"input":{"$ref":"#/components/schemas/sii__guias__consultar__Input"}},"required":["input"]}}}},"responses":{"200":{"description":"La tool corrió bien. 'data' es la salida de la tool tal cual, y 'meta' trae el 'request_id' que identifica esta llamada en la bitácora.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/sii__guias__consultar__Output"},"meta":{"$ref":"#/components/schemas/ResponseMeta"}},"required":["data"]}}}},"400":{"$ref":"#/components/responses/Error_validation_error"},"401":{"$ref":"#/components/responses/Error_unauthorized"},"403":{"description":"scope_not_granted | alcance_not_enabled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"$ref":"#/components/responses/Error_tool_not_found"},"409":{"description":"connection_ambiguous | connection_busy","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"428":{"$ref":"#/components/responses/Error_connection_credential_required"},"500":{"$ref":"#/components/responses/Error_internal_error"}}}},"/v1/tools/sii.rcv.consultar/execute":{"post":{"operationId":"sii__rcv__consultar","summary":"Consultar RCV del SII","description":"Lee el Registro de Compra-Venta ya sincronizado para esta conexión, filtrable por período, perspectiva, tipo de documento (tipoDte) y estado del registro. Lectura pura: NO dispara una sincronización nueva ni contacta al SII. Si el período nunca se sincronizó, devuelve una lista vacía y 'sincronizacion: null'. Para traer datos nuevos, use 'sii.conexion.sincronizar' primero. Pagina con 'cursor': cuando la respuesta trae 'cursor' distinto de null, hay más filas. reenvía ese valor tal cual en 'cursor' para pedir la página siguiente; nunca lo construyas a mano.","tags":["sii"],"security":[{"apiKey":[]},{"oauth2":["sii:read"]}],"parameters":[{"name":"X-Connect-Connection","in":"header","required":true,"description":"Cuál conexión (conn_…) ejecuta esta llamada. Obligatoria en todo sistema conectable y sin resolución implícita, ni siquiera cuando la organización tiene una sola conexión activa: la conexión ES la empresa, y elegir por ti una que hoy acierta mañana acierta distinto sin que nadie cambie nada. Los ids salen de la tool 'conexiones.estado.consultar'. Si falta, la respuesta es 'validation_error' y no se contacta al sistema externo.","schema":{"type":"string","pattern":"^conn_"},"example":"conn_9tKfR2mQx4Vb"}],"requestBody":{"required":true,"description":"La entrada de la tool, envuelta en 'input'. Manda '{\"input\": {}}' cuando la tool no toma argumentos: el sobre es obligatorio aunque esté vacío.","content":{"application/json":{"schema":{"type":"object","properties":{"input":{"$ref":"#/components/schemas/sii__rcv__consultar__Input"}},"required":["input"]}}}},"responses":{"200":{"description":"La tool corrió bien. 'data' es la salida de la tool tal cual, y 'meta' trae el 'request_id' que identifica esta llamada en la bitácora.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/sii__rcv__consultar__Output"},"meta":{"$ref":"#/components/schemas/ResponseMeta"}},"required":["data"]}}}},"400":{"$ref":"#/components/responses/Error_validation_error"},"401":{"$ref":"#/components/responses/Error_unauthorized"},"403":{"description":"scope_not_granted | alcance_not_enabled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"$ref":"#/components/responses/Error_tool_not_found"},"409":{"description":"connection_ambiguous | connection_busy","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"428":{"$ref":"#/components/responses/Error_connection_credential_required"},"500":{"$ref":"#/components/responses/Error_internal_error"}}}}},"components":{"schemas":{"banco_estado__conexion__sincronizar__Input":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"periodo":{"type":"string","pattern":"^\\d{4}-\\d{2}$","description":"Un mes, en formato AAAA-MM y en calendario chileno (por ejemplo '2026-07'). Cada sitio de uso afina qué significa ahí: en una sincronización es el mes que se va a traer, y en una consulta a la caché es el filtro. Esta descripción base existe para que el campo nunca llegue pelado a quien lee el contrato."},"alcances":{"minItems":1,"type":"array","items":{"type":"string","enum":["saldos","movimientos"]},"description":"Qué módulos de datos traer en esta corrida, al menos uno. Todos se sincronizan sobre UNA sola sesión (un login, un logout), así que pedir varios en una llamada cuesta menos que llamar una vez por cada uno. Un alcance debe estar habilitado en la conexión; si no lo está, la llamada responde 'alcance_not_enabled'."}},"required":["periodo","alcances"]},"banco_estado__conexion__sincronizar__Output":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"periodo":{"type":"string","description":"Eco del período que se pidió, para poder correlacionar la respuesta sin guardarlo tú."},"results":{"type":"array","items":{"type":"object","properties":{"alcance":{"type":"string","description":"Cuál de los alcances pedidos describe esta fila. Hay una fila por alcance solicitado, en el orden canónico del conector, no en el orden en que los pediste."},"status":{"type":"string","enum":["ok","failed"],"description":"'ok' = el alcance terminó bien; que 'recordsSynced' sea 0 no lo vuelve un fallo. 'failed' = no terminó bien, y la causa va en 'error'. Ojo con un 'failed': NO garantiza que no se haya escrito nada. Cuando el sistema externo trunca un listado, el alcance queda 'failed' con las filas que alcanzó en 'recordsSynced'. Mira siempre las dos cosas juntas. Y revisa fila por fila: un alcance puede fallar mientras los otros de la misma corrida terminan bien."},"recordsSynced":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Cuántos registros de este alcance escribió ESTA corrida. Es el trabajo de esta llamada, no el total acumulado que tienes guardado: para saber cuánto hay, consulta. Un 0 no significa por sí solo «no hay datos»; cuando el cero tiene una explicación, viene en 'detalle'."},"error":{"description":"Por qué este alcance no terminó bien. Presente solo cuando 'status' es 'failed'. Normalmente es un código del catálogo de errores; cuando el sistema externo truncó el listado es una etiqueta de resultado ('movimientos_truncated', 'cartolas_truncated') que no está en ese catálogo y que significa «se escribió lo que alcanzó a venir». Decide por el valor, nunca por el texto libre.","type":"string"},"detalle":{"description":"Explicación en lenguaje llano, presente solo cuando el resultado necesita una. Existe para que un cero se pueda transmitir tal cual en vez de concluir «no hay datos»: transmítelo a quien pregunte en lugar de resumir el número solo.","type":"string"}},"required":["alcance","status","recordsSynced"],"additionalProperties":false},"description":"Una fila por alcance pedido, con cómo le fue a cada uno."}},"required":["periodo","results"],"additionalProperties":false},"banco_estado__conexion__verificar__Input":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{}},"banco_estado__conexion__verificar__Output":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"verificadoEn":{"type":"string","description":"Instante (ISO 8601) en que el login de prueba terminó bien. Es la única salida de esta tool: recibirla ya significa que la credencial sirve. Si no sirviera, la respuesta sería un error con su código de catálogo, nunca este objeto con un booleano en false."}},"required":["verificadoEn"],"additionalProperties":false},"banco_estado__movimientos__consultar__Input":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"numeroCuenta":{"description":"Filtra por un número de cuenta. Omítelo para ver los movimientos de todas las cuentas de la conexión.","type":"string"},"periodo":{"type":"string","pattern":"^\\d{4}-\\d{2}$","description":"Un mes, en formato AAAA-MM y en calendario chileno (por ejemplo '2026-07'). Cada sitio de uso afina qué significa ahí: en una sincronización es el mes que se va a traer, y en una consulta a la caché es el filtro. Esta descripción base existe para que el campo nunca llegue pelado a quien lee el contrato."},"cursor":{"description":"Puntero opaco a la página siguiente. Reenvía tal cual el 'cursor' que devolvió la llamada anterior; nunca lo construyas a mano. Omítelo para pedir la primera página.","type":"string"},"limit":{"default":100,"description":"Cuántas filas trae la página, entre 1 y 500. Por omisión, 100.","type":"integer","minimum":1,"maximum":500}}},"banco_estado__movimientos__consultar__Output":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"movimientos":{"type":"array","items":{"type":"object","properties":{"numeroCuenta":{"type":"string","description":"El número de la cuenta a la que pertenece el movimiento."},"periodo":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"El mes (AAAA-MM) con el que se sincronizó esta fila. Es cómo se pidió el dato, no una propiedad del movimiento: no entra en su identidad, así que volver a traerlo bajo otro período no crea una fila nueva ni infla los totales."},"fecha":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Fecha del movimiento, en formato AAAA-MM-DD. No trae hora: la cartola no la informa. null si el banco no trajo la celda."},"descripcion":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"La glosa del movimiento tal como aparece en la cartola (por ejemplo 'PAGO PROVEEDOR')."},"documento":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"El número de documento asociado al movimiento, cuando el banco lo trae."},"monto":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Magnitud del movimiento SIN signo. El sentido lo da 'type' y el signo visible lo trae 'display'. Un null significa que el banco no trajo la celda, que no es lo mismo que cero."},"type":{"anyOf":[{"type":"string","enum":["credit","debit"]},{"type":"null"}],"description":"Eje crédito/débito del LIBRO DEL BANCO, no el de la cartola: 'debit' es plata que ENTRA a la cuenta (un abono) y 'credit' es plata que SALE (un cargo). Es al revés de la lectura intuitiva y está así a propósito. El campo 'monto' es la magnitud SIN signo; el signo lo lleva 'display' ('credit' → negativo). 'null' significa que el banco no informó el tipo: no asumas ninguno de los dos."},"display":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"El monto ya formateado a la chilena y CON signo, derivado de 'type' ('credit', plata que sale, se muestra negativo). Es una comodidad de presentación: se calcula en la lectura y no se persiste. Para operar con el número usa 'monto' (magnitud sin signo) junto con 'type'."},"saldo":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"El saldo que queda en la cuenta después de este movimiento. Es un balance: no lleva 'type' y conserva su propio signo."},"oficina":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"La oficina que el banco asocia al movimiento, en su propio texto (por ejemplo 'STGO.PRINCIPAL')."},"origen":{"type":"string","enum":["linea","historica"],"description":"Por cuál de las dos cartolas del banco se trajo la fila: 'linea' es la del mes en curso e 'historica' la de los meses ya cerrados. Es metadato de procedencia y no entra en la identidad del movimiento, así que el mismo movimiento traído por las dos no se duplica."},"syncedAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Cuándo se leyó esta fila del banco (ISO 8601). Si está vieja, la caché puede haber dejado de moverse (por ejemplo, con la conexión pausada tras varios fallos de credencial) mientras esta tool sigue respondiendo con filas antiguas."}},"required":["numeroCuenta","periodo","fecha","descripcion","documento","monto","type","display","saldo","oficina","origen","syncedAt"],"additionalProperties":false},"description":"Los movimientos guardados que calzan con los filtros, del más reciente al más antiguo. Una lista vacía significa que ese período no se ha sincronizado, no que no haya movimientos."},"cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Puntero a la página siguiente. Si viene distinto de null hay más filas: vuelve a llamar reenviándolo tal cual en 'cursor'. Un null significa que no queda nada por traer."}},"required":["movimientos","cursor"],"additionalProperties":false},"banco_estado__saldos__consultar__Input":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"observedDay":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Filtra por el día de la foto de saldo, en formato AAAA-MM-DD. Si lo omites, la primera página ya trae las fotos más recientes que haya guardadas."},"numeroCuenta":{"description":"Filtra por un número de cuenta. Omítelo para ver todas las cuentas de la conexión.","type":"string"},"cursor":{"description":"Puntero opaco a la página siguiente. Reenvía tal cual el 'cursor' que devolvió la llamada anterior; nunca lo construyas a mano. Omítelo para pedir la primera página.","type":"string"},"limit":{"default":100,"description":"Cuántas filas trae la página, entre 1 y 500. Por omisión, 100.","type":"integer","minimum":1,"maximum":500}}},"banco_estado__saldos__consultar__Output":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"saldos":{"type":"array","items":{"type":"object","properties":{"numeroCuenta":{"type":"string","description":"El número de la cuenta a la que corresponde esta foto de saldo."},"moneda":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"La moneda de la cuenta, en el texto del propio banco (por ejemplo 'PESOS'). null cuando el listado de cuentas no la trae."},"observedDay":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"El día de esta foto de saldo, en formato AAAA-MM-DD. Hay una foto por cuenta y por día: volver a sincronizar el mismo día actualiza esta fila en vez de agregar otra. Se llama 'observedDay' y no 'fecha' para que sea el mismo nombre que en los otros bancos de Connect."},"hora":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"La hora en que el banco reportó esta foto, en su propio formato (por ejemplo '14:30'). BancoEstado la entrega y los otros bancos de Connect no, así que conserva el nombre del banco."},"saldoContable":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"El saldo contable de la cuenta. Es un balance, no una operación: conserva su propio signo (un sobregiro es negativo) y no lleva 'type'. Un null significa que el banco no trajo la celda, que no es lo mismo que cero."},"saldoDisponible":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"El saldo disponible de la cuenta. Es un balance: conserva su propio signo y no lleva 'type'. Un null significa que el banco no trajo la celda, que no es lo mismo que cero."},"retencionUnDia":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Lo retenido a un día. Un 0 afirma que no hay retención; un null dice que el banco no informó la celda, que es un dato distinto."},"retencionDosDias":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Lo retenido a dos días. Un 0 afirma que no hay retención; un null dice que el banco no informó la celda."},"retencionOtras":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"El resto de las retenciones, sumando las dos celdas que el banco publica por separado. null si no vino ninguna de las dos; un 0 sí afirma que no hay retención."},"retencionTotal":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"El total de retenciones según el banco. null significa que no informó la celda."},"syncedAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Cuándo se leyó esta fila del banco (ISO 8601). Si está vieja, la caché puede haber dejado de moverse (por ejemplo, con la conexión pausada tras varios fallos de credencial) mientras esta tool sigue respondiendo con filas antiguas."}},"required":["numeroCuenta","moneda","observedDay","hora","saldoContable","saldoDisponible","retencionUnDia","retencionDosDias","retencionOtras","retencionTotal","syncedAt"],"additionalProperties":false},"description":"Las fotos de saldo guardadas que calzan con los filtros, de la más reciente a la más antigua. Una lista vacía significa que la conexión nunca sincronizó saldos, no que la empresa no tenga cuentas."},"cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Puntero a la página siguiente. Si viene distinto de null hay más filas: vuelve a llamar reenviándolo tal cual en 'cursor'. Un null significa que no queda nada por traer."}},"required":["saldos","cursor"],"additionalProperties":false},"banco_security__conexion__sincronizar__Input":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"periodo":{"type":"string","pattern":"^\\d{4}-\\d{2}$","description":"Un mes, en formato AAAA-MM y en calendario chileno (por ejemplo '2026-07'). Cada sitio de uso afina qué significa ahí: en una sincronización es el mes que se va a traer, y en una consulta a la caché es el filtro. Esta descripción base existe para que el campo nunca llegue pelado a quien lee el contrato."},"alcances":{"minItems":1,"type":"array","items":{"type":"string","enum":["transferencias","nominas","saldos","movimientos"]},"description":"Qué módulos de datos traer en esta corrida, al menos uno. Todos se sincronizan sobre UNA sola sesión (un login, un logout), así que pedir varios en una llamada cuesta menos que llamar una vez por cada uno. Un alcance debe estar habilitado en la conexión; si no lo está, la llamada responde 'alcance_not_enabled'."}},"required":["periodo","alcances"]},"banco_security__conexion__sincronizar__Output":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"periodo":{"type":"string","description":"Eco del período que se pidió, para poder correlacionar la respuesta sin guardarlo tú."},"results":{"type":"array","items":{"type":"object","properties":{"alcance":{"type":"string","description":"Cuál de los alcances pedidos describe esta fila. Hay una fila por alcance solicitado, en el orden canónico del conector, no en el orden en que los pediste."},"status":{"type":"string","enum":["ok","failed"],"description":"'ok' = el alcance terminó bien; que 'recordsSynced' sea 0 no lo vuelve un fallo. 'failed' = no terminó bien, y la causa va en 'error'. Ojo con un 'failed': NO garantiza que no se haya escrito nada. Cuando el sistema externo trunca un listado, el alcance queda 'failed' con las filas que alcanzó en 'recordsSynced'. Mira siempre las dos cosas juntas. Y revisa fila por fila: un alcance puede fallar mientras los otros de la misma corrida terminan bien."},"recordsSynced":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Cuántos registros de este alcance escribió ESTA corrida. Es el trabajo de esta llamada, no el total acumulado que tienes guardado: para saber cuánto hay, consulta. Un 0 no significa por sí solo «no hay datos»; cuando el cero tiene una explicación, viene en 'detalle'."},"error":{"description":"Por qué este alcance no terminó bien. Presente solo cuando 'status' es 'failed'. Normalmente es un código del catálogo de errores; cuando el sistema externo truncó el listado es una etiqueta de resultado ('movimientos_truncated', 'cartolas_truncated') que no está en ese catálogo y que significa «se escribió lo que alcanzó a venir». Decide por el valor, nunca por el texto libre.","type":"string"},"detalle":{"description":"Explicación en lenguaje llano, presente solo cuando el resultado necesita una. Existe para que un cero se pueda transmitir tal cual en vez de concluir «no hay datos»: transmítelo a quien pregunte en lugar de resumir el número solo.","type":"string"}},"required":["alcance","status","recordsSynced"],"additionalProperties":false},"description":"Una fila por alcance pedido, con cómo le fue a cada uno."}},"required":["periodo","results"],"additionalProperties":false},"banco_security__conexion__verificar__Input":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{}},"banco_security__conexion__verificar__Output":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"verificadoEn":{"type":"string","description":"Instante (ISO 8601) en que el login de prueba terminó bien. Es la única salida de esta tool: recibirla ya significa que la credencial sirve. Si no sirviera, la respuesta sería un error con su código de catálogo, nunca este objeto con un booleano en false."}},"required":["verificadoEn"],"additionalProperties":false},"banco_security__movimientos__consultar__Input":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"periodo":{"type":"string","pattern":"^\\d{4}-\\d{2}$","description":"Un mes, en formato AAAA-MM y en calendario chileno (por ejemplo '2026-07'). Cada sitio de uso afina qué significa ahí: en una sincronización es el mes que se va a traer, y en una consulta a la caché es el filtro. Esta descripción base existe para que el campo nunca llegue pelado a quien lee el contrato."},"cursor":{"description":"Puntero opaco a la página siguiente. Reenvía tal cual el 'cursor' que devolvió la llamada anterior; nunca lo construyas a mano. Omítelo para pedir la primera página.","type":"string"},"limit":{"default":100,"description":"Cuántas filas trae la página, entre 1 y 500. Por omisión, 100.","type":"integer","minimum":1,"maximum":500}}},"banco_security__movimientos__consultar__Output":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"movimientos":{"type":"array","items":{"type":"object","properties":{"numeroCuenta":{"type":"string","description":"El número de la cuenta corriente a la que pertenece el movimiento."},"periodo":{"type":"string","description":"El mes (AAAA-MM) con el que se sincronizó esta fila. Es cómo se pidió el dato, no una propiedad del objeto: no entra en su identidad, así que volver a traerlo bajo otro período no crea una fila nueva."},"fechaMovimiento":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Fecha del movimiento en la cartola (ISO 8601). null si el banco no la trajo."},"monto":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Magnitud del movimiento SIN signo. El sentido lo da 'type' y el signo visible lo trae 'display'. Reemplaza al par cargo/abono del portal, que obligaba a mirar cuál de las dos celdas venía llena. Un null significa que el banco no trajo la celda, que no es lo mismo que cero."},"type":{"anyOf":[{"type":"string","enum":["credit","debit"]},{"type":"null"}],"description":"Eje crédito/débito del LIBRO DEL BANCO, no el de la cartola: 'debit' es plata que ENTRA a la cuenta (un abono) y 'credit' es plata que SALE (un cargo). Es al revés de la lectura intuitiva y está así a propósito. El campo 'monto' es la magnitud SIN signo; el signo lo lleva 'display' ('credit' → negativo). 'null' significa que el banco no informó el tipo: no asumas ninguno de los dos."},"display":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"El monto ya formateado a la chilena y CON signo, derivado de 'type' ('credit', plata que sale, se muestra negativo). Es una comodidad de presentación: se calcula en la lectura y no se persiste. Para operar con el número usa 'monto' (magnitud sin signo) junto con 'type'."},"saldo":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"El saldo que queda en la cuenta después de este movimiento. Es un balance: no lleva 'type' y conserva su propio signo."},"descripcion":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"La glosa del movimiento tal como aparece en la cartola (por ejemplo 'TEF A PROVEEDOR LTDA')."},"documento":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"El número de documento asociado al movimiento, cuando el banco lo trae."},"ultimaLecturaEn":{"type":"string","description":"Cuándo se leyó esta fila del banco (ISO 8601). Si está vieja, la caché puede haber dejado de moverse (por ejemplo, con la conexión pausada tras varios fallos de credencial) mientras esta tool sigue respondiendo con filas antiguas. Entre dos filas del mismo hecho, gana la de 'ultimaLecturaEn' mayor."},"currency":{"type":"string","description":"Moneda de la cuenta, en código ISO. Se deriva de la cuenta, así que viene igual por las dos cartolas del banco y nunca es null."}},"required":["numeroCuenta","periodo","fechaMovimiento","monto","type","display","saldo","descripcion","documento","ultimaLecturaEn","currency"],"additionalProperties":false},"description":"Los movimientos guardados que calzan con los filtros, del más reciente al más antiguo. Una lista vacía significa que ese período no se ha sincronizado, no que no haya movimientos."},"cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Puntero a la página siguiente. Si viene distinto de null hay más filas: vuelve a llamar reenviándolo tal cual en 'cursor'. Un null significa que no queda nada por traer."}},"required":["movimientos","cursor"],"additionalProperties":false},"banco_security__nomina_pagos__consultar__Input":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"idNomina":{"type":"string","minLength":1,"description":"La nómina cuyas líneas de pago quieres leer. Sale del campo 'idNomina' de una cabecera de 'banco_security.nominas.consultar'; no es el 'numeroNomina' que el banco muestra en su listado."},"cursor":{"description":"Puntero opaco a la página siguiente. Reenvía tal cual el 'cursor' que devolvió la llamada anterior; nunca lo construyas a mano. Omítelo para pedir la primera página.","type":"string"},"limit":{"default":100,"description":"Cuántas filas trae la página, entre 1 y 500. Por omisión, 100.","type":"integer","minimum":1,"maximum":500}},"required":["idNomina"]},"banco_security__nomina_pagos__consultar__Output":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"pagos":{"type":"array","items":{"type":"object","properties":{"idNomina":{"type":"string","description":"El identificador de la nómina a la que pertenece esta línea: el mismo que pediste en la entrada."},"linea":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Posición de esta línea dentro de la nómina, empezando en 1. Es un ordinal de la nómina completa, no de la página del portal de donde se leyó."},"tipoCuenta":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Tipo de cuenta del beneficiario según el banco (por ejemplo 'Cuenta Corriente' o 'Cuenta Vista')."},"estado":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Estado del pago en el texto del propio banco (por ejemplo 'Pagado'). Cuando el banco lo rechazó, el motivo va en 'motivoRechazo'."},"periodo":{"type":"string","description":"El mes (AAAA-MM) con el que se sincronizó esta fila. Es cómo se pidió el dato, no una propiedad del objeto: no entra en su identidad, así que volver a traerlo bajo otro período no crea una fila nueva."},"rut":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"RUT del beneficiario del pago, tal como lo escribe el banco."},"nombre":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Nombre del beneficiario del pago."},"numeroCuenta":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"La cuenta de destino del beneficiario. Esta tool no ofrece filtro por cuenta: la columna va cifrada y un filtro sobre ella devolvería cero filas."},"banco":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Banco del beneficiario, en el texto del portal."},"mail":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Correo al que el banco avisó el pago al beneficiario, cuando lo hay."},"monto":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"El monto de esta línea, como magnitud SIN signo. El sentido lo da 'type', que en un pago de nómina es siempre 'credit' porque la plata sale de la empresa."},"type":{"anyOf":[{"type":"string","enum":["credit","debit"]},{"type":"null"}],"description":"Eje crédito/débito del LIBRO DEL BANCO, no el de la cartola: 'debit' es plata que ENTRA a la cuenta (un abono) y 'credit' es plata que SALE (un cargo). Es al revés de la lectura intuitiva y está así a propósito. El campo 'monto' es la magnitud SIN signo; el signo lo lleva 'display' ('credit' → negativo). 'null' significa que el banco no informó el tipo: no asumas ninguno de los dos."},"display":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"El monto ya formateado a la chilena y CON signo, derivado de 'type' ('credit', plata que sale, se muestra negativo). Es una comodidad de presentación: se calcula en la lectura y no se persiste. Para operar con el número usa 'monto' (magnitud sin signo) junto con 'type'."},"glosa":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"La glosa con que el pago se identifica ante el beneficiario (por ejemplo 'Sueldo julio 2026')."},"motivoRechazo":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Por qué el banco rechazó este pago, en su propio texto. null cuando no hubo rechazo."},"ultimaLecturaEn":{"type":"string","description":"Cuándo se leyó esta fila del banco (ISO 8601). Si está vieja, la caché puede haber dejado de moverse (por ejemplo, con la conexión pausada tras varios fallos de credencial) mientras esta tool sigue respondiendo con filas antiguas. Entre dos filas del mismo hecho, gana la de 'ultimaLecturaEn' mayor."}},"required":["idNomina","linea","tipoCuenta","estado","periodo","rut","nombre","numeroCuenta","banco","mail","monto","type","display","glosa","motivoRechazo","ultimaLecturaEn"],"additionalProperties":false},"description":"Las líneas de pago de la nómina pedida, en orden ascendente de 'linea'. Una lista vacía significa que esa nómina no se ha sincronizado."},"cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Puntero a la página siguiente. Si viene distinto de null hay más filas: vuelve a llamar reenviándolo tal cual en 'cursor'. Un null significa que no queda nada por traer."}},"required":["pagos","cursor"],"additionalProperties":false},"banco_security__nominas__consultar__Input":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"periodo":{"type":"string","pattern":"^\\d{4}-\\d{2}$","description":"Un mes, en formato AAAA-MM y en calendario chileno (por ejemplo '2026-07'). Cada sitio de uso afina qué significa ahí: en una sincronización es el mes que se va a traer, y en una consulta a la caché es el filtro. Esta descripción base existe para que el campo nunca llegue pelado a quien lee el contrato."},"cursor":{"description":"Puntero opaco a la página siguiente. Reenvía tal cual el 'cursor' que devolvió la llamada anterior; nunca lo construyas a mano. Omítelo para pedir la primera página.","type":"string"},"limit":{"default":100,"description":"Cuántas filas trae la página, entre 1 y 500. Por omisión, 100.","type":"integer","minimum":1,"maximum":500}}},"banco_security__nominas__consultar__Output":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"nominas":{"type":"array","items":{"type":"object","properties":{"idNomina":{"type":"string","description":"El identificador de la nómina en el banco. Es el valor que pide 'banco_security.nomina_pagos.consultar' para traer sus líneas de pago."},"numeroNomina":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"El número con que el banco rotula la nómina en su listado. No sirve para pedir el detalle: para eso va 'idNomina'."},"fecha":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Fecha de la nómina según el banco (ISO 8601). null si no la informa."},"tipo":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Tipo de nómina en el texto del propio banco (por ejemplo 'Remuneraciones'), sin traducir."},"estado":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Estado de la nómina en el texto del propio banco (por ejemplo 'Procesada'), sin traducir."},"numRegistros":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}],"description":"Cuántas líneas de pago tiene la nómina. Está aquí para que dimensiones antes de pedir el detalle con 'banco_security.nomina_pagos.consultar': hay nóminas de más de mil líneas."},"cuentaCargo":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"La cuenta corriente de la empresa contra la que se cargó la nómina."},"periodo":{"type":"string","description":"El mes (AAAA-MM) con el que se sincronizó esta fila. Es cómo se pidió el dato, no una propiedad del objeto: no entra en su identidad, así que volver a traerlo bajo otro período no crea una fila nueva."},"monto":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"El total de la nómina, como magnitud SIN signo. El sentido lo da 'type', que en una nómina es siempre 'credit' porque es un desembolso que la empresa origina."},"type":{"anyOf":[{"type":"string","enum":["credit","debit"]},{"type":"null"}],"description":"Eje crédito/débito del LIBRO DEL BANCO, no el de la cartola: 'debit' es plata que ENTRA a la cuenta (un abono) y 'credit' es plata que SALE (un cargo). Es al revés de la lectura intuitiva y está así a propósito. El campo 'monto' es la magnitud SIN signo; el signo lo lleva 'display' ('credit' → negativo). 'null' significa que el banco no informó el tipo: no asumas ninguno de los dos."},"display":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"El monto ya formateado a la chilena y CON signo, derivado de 'type' ('credit', plata que sale, se muestra negativo). Es una comodidad de presentación: se calcula en la lectura y no se persiste. Para operar con el número usa 'monto' (magnitud sin signo) junto con 'type'."},"ultimaLecturaEn":{"type":"string","description":"Cuándo se leyó esta fila del banco (ISO 8601). Si está vieja, la caché puede haber dejado de moverse (por ejemplo, con la conexión pausada tras varios fallos de credencial) mientras esta tool sigue respondiendo con filas antiguas. Entre dos filas del mismo hecho, gana la de 'ultimaLecturaEn' mayor."}},"required":["idNomina","numeroNomina","fecha","tipo","estado","numRegistros","cuentaCargo","periodo","monto","type","display","ultimaLecturaEn"],"additionalProperties":false},"description":"Las cabeceras de nómina guardadas que calzan con los filtros, de la más reciente a la más antigua. Las líneas de pago no vienen aquí: se piden con 'banco_security.nomina_pagos.consultar'."},"cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Puntero a la página siguiente. Si viene distinto de null hay más filas: vuelve a llamar reenviándolo tal cual en 'cursor'. Un null significa que no queda nada por traer."}},"required":["nominas","cursor"],"additionalProperties":false},"banco_security__saldos__consultar__Input":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"observedDay":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Filtra por el día de la foto de saldo, en formato AAAA-MM-DD. Si lo omites, la primera página ya trae las fotos más recientes que haya guardadas."},"numeroCuenta":{"description":"Filtra por un número de cuenta. Omítelo para ver todas las cuentas de la conexión.","type":"string"},"cursor":{"description":"Puntero opaco a la página siguiente. Reenvía tal cual el 'cursor' que devolvió la llamada anterior; nunca lo construyas a mano. Omítelo para pedir la primera página.","type":"string"},"limit":{"default":100,"description":"Cuántas filas trae la página, entre 1 y 500. Por omisión, 100.","type":"integer","minimum":1,"maximum":500}}},"banco_security__saldos__consultar__Output":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"saldos":{"type":"array","items":{"type":"object","properties":{"numeroCuenta":{"type":"string","description":"El número de la cuenta a la que corresponde esta foto de saldo."},"currency":{"type":"string","description":"Moneda de la cuenta, en código ISO ('CLP' o 'USD'). La misma empresa puede tener cuentas en pesos y en dólares, y cada una trae su propia fila."},"observedDay":{"type":"string","description":"El día de esta foto de saldo, en formato AAAA-MM-DD. Hay una foto por cuenta y por día: volver a sincronizar el mismo día actualiza esta fila en vez de agregar otra."},"observedAt":{"type":"string","description":"El instante (ISO 8601) en que se tomó la foto dentro de ese día."},"saldoContable":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"El saldo contable de la cuenta. Es un balance, no una operación: conserva su propio signo (un sobregiro es negativo) y no lleva 'type'. Un null significa que el banco no trajo la celda, que no es lo mismo que cero."},"saldoDisponible":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"El saldo disponible de la cuenta. Es un balance: conserva su propio signo y no lleva 'type'. Un null significa que el banco no trajo la celda, que no es lo mismo que cero."},"saldoProvisorio":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"El saldo provisorio de la cuenta, tal como lo publica el portal. Es un balance: conserva su propio signo y no lleva 'type'. Un null significa que el banco no trajo la celda."},"ultimaLecturaEn":{"type":"string","description":"Cuándo se leyó esta fila del banco (ISO 8601). Si está vieja, la caché puede haber dejado de moverse (por ejemplo, con la conexión pausada tras varios fallos de credencial) mientras esta tool sigue respondiendo con filas antiguas. Entre dos filas del mismo hecho, gana la de 'ultimaLecturaEn' mayor."}},"required":["numeroCuenta","currency","observedDay","observedAt","saldoContable","saldoDisponible","saldoProvisorio","ultimaLecturaEn"],"additionalProperties":false},"description":"Las fotos de saldo guardadas que calzan con los filtros, de la más reciente a la más antigua. Una lista vacía significa que la conexión nunca sincronizó saldos, no que la empresa no tenga cuentas."},"cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Puntero a la página siguiente. Si viene distinto de null hay más filas: vuelve a llamar reenviándolo tal cual en 'cursor'. Un null significa que no queda nada por traer."}},"required":["saldos","cursor"],"additionalProperties":false},"banco_security__transferencias__consultar__Input":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"periodo":{"type":"string","pattern":"^\\d{4}-\\d{2}$","description":"Un mes, en formato AAAA-MM y en calendario chileno (por ejemplo '2026-07'). Cada sitio de uso afina qué significa ahí: en una sincronización es el mes que se va a traer, y en una consulta a la caché es el filtro. Esta descripción base existe para que el campo nunca llegue pelado a quien lee el contrato."},"direccion":{"description":"Filtra por dirección: 'enviadas' son las que la empresa cursó y 'recibidas' las que le llegaron. Omítelo para traer las dos juntas; el campo 'direction' de cada fila las distingue.","type":"string","enum":["enviadas","recibidas"]},"cursor":{"description":"Puntero opaco a la página siguiente. Reenvía tal cual el 'cursor' que devolvió la llamada anterior; nunca lo construyas a mano. Omítelo para pedir la primera página.","type":"string"},"limit":{"default":100,"description":"Cuántas filas trae la página, entre 1 y 500. Por omisión, 100.","type":"integer","minimum":1,"maximum":500}}},"banco_security__transferencias__consultar__Output":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"transferencias":{"type":"array","items":{"type":"object","properties":{"sourceTransferId":{"type":"string","description":"Identificador estable de la transferencia dentro de Connect, compuesto por la dirección y el número de transacción (por ejemplo 'issued:39262015878491'). Sirve para reconocer la misma transferencia entre dos lecturas; el banco no lo muestra."},"direction":{"type":"string","enum":["issued","received"],"description":"'issued' es una transferencia que la empresa envió y 'received' una que recibió. Es el campo que las distingue cuando consultas sin filtrar por 'direccion'."},"periodo":{"type":"string","description":"El mes (AAAA-MM) con el que se sincronizó esta fila. Es cómo se pidió el dato, no una propiedad del objeto: no entra en su identidad, así que volver a traerlo bajo otro período no crea una fila nueva."},"numeroTransaccion":{"type":"string","description":"El número de transacción que emite el banco. Viene como texto a propósito: tiene unos 14 dígitos y no cabe en un entero de 32 bits. Trátalo como identificador y no lo conviertas a número."},"transferredAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Cuándo se cursó la transferencia (ISO 8601). null si el banco no trajo la fecha."},"currency":{"type":"string","description":"Moneda de la transferencia, en código ISO ('CLP' o 'USD')."},"statusCode":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}],"description":"El código de estado que el banco asigna a la transferencia, tal cual, sin traducir. Solo viene en las enviadas ('issued'); en las recibidas es null."},"transferType":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Tipo de transferencia en el texto del propio banco (por ejemplo 'Transferencia a terceros'). null cuando no lo informa."},"nominaNumber":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}],"description":"Número de la nómina de pago masiva de la que salió esta transferencia. null significa que no vino de una nómina."},"ownRut":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"RUT del lado propio de la operación: el de origen si la empresa envió la transferencia, el de destino si la recibió."},"ownAccount":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Número de la cuenta propia en esta transferencia: la de origen si la empresa la envió, la de destino si la recibió."},"monto":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Magnitud de la transferencia SIN signo. El sentido lo da 'type' y el signo visible lo trae 'display'. Un null significa que el banco no trajo la celda, que no es lo mismo que cero."},"type":{"anyOf":[{"type":"string","enum":["credit","debit"]},{"type":"null"}],"description":"Eje crédito/débito del LIBRO DEL BANCO, no el de la cartola: 'debit' es plata que ENTRA a la cuenta (un abono) y 'credit' es plata que SALE (un cargo). Es al revés de la lectura intuitiva y está así a propósito. El campo 'monto' es la magnitud SIN signo; el signo lo lleva 'display' ('credit' → negativo). 'null' significa que el banco no informó el tipo: no asumas ninguno de los dos."},"display":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"El monto ya formateado a la chilena y CON signo, derivado de 'type' ('credit', plata que sale, se muestra negativo). Es una comodidad de presentación: se calcula en la lectura y no se persiste. Para operar con el número usa 'monto' (magnitud sin signo) junto con 'type'."},"subject":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"El asunto con que se cursó la transferencia, tal como lo escribió quien la hizo (por ejemplo 'Pago factura 10452')."},"counterpartyRut":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"RUT de la contraparte: el destinatario si la transferencia salió, el emisor si entró."},"counterpartyName":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Nombre de la contraparte, tal como lo informa el banco."},"counterpartyBank":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Banco de la contraparte, en el texto del portal (por ejemplo 'Banco de Chile')."},"counterpartyAccount":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Número de cuenta de la contraparte."},"counterpartyEmail":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Correo al que el banco avisó la transferencia a la contraparte, cuando lo hay."},"creatorRut":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"RUT de quien creó la transferencia en el portal. Solo viene en las enviadas ('issued'); en las recibidas es null."},"approverRut":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"RUT de quien la aprobó en el portal. Solo viene en las enviadas ('issued'); en las recibidas es null."},"payerRut":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"RUT que el banco registra como pagador de la transferencia. Solo viene en las enviadas ('issued'); en las recibidas es null."},"ultimaLecturaEn":{"type":"string","description":"Cuándo se leyó esta fila del banco (ISO 8601). Si está vieja, la caché puede haber dejado de moverse (por ejemplo, con la conexión pausada tras varios fallos de credencial) mientras esta tool sigue respondiendo con filas antiguas. Entre dos filas del mismo hecho, gana la de 'ultimaLecturaEn' mayor."}},"required":["sourceTransferId","direction","periodo","numeroTransaccion","transferredAt","currency","statusCode","transferType","nominaNumber","ownRut","ownAccount","monto","type","display","subject","counterpartyRut","counterpartyName","counterpartyBank","counterpartyAccount","counterpartyEmail","creatorRut","approverRut","payerRut","ultimaLecturaEn"],"additionalProperties":false},"description":"Las transferencias guardadas que calzan con los filtros, de la más reciente a la más antigua. Una lista vacía significa que ese período no se ha sincronizado, no que no haya transferencias."},"cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Puntero a la página siguiente. Si viene distinto de null hay más filas: vuelve a llamar reenviándolo tal cual en 'cursor'. Un null significa que no queda nada por traer."}},"required":["transferencias","cursor"],"additionalProperties":false},"bch_empresas__cartolas__consultar__Input":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"fechaEmisionDay":{"description":"Filtra por el día en que el banco emitió el extracto, en formato AAAA-MM-DD.","type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"periodo":{"description":"Filtra por el mes (AAAA-MM) con el que se BUSCÓ la cartola, que no es su fecha de emisión: para esa usa 'fechaEmisionDay'. Sin él, la respuesta cruza todos los períodos guardados.","type":"string","pattern":"^\\d{4}-\\d{2}$"},"numeroCuenta":{"description":"Filtra por una sola cuenta, escrita igual que el 'numeroCuenta' de las filas. Sin él vienen todas las cuentas de la conexión.","type":"string"},"cursor":{"description":"Para pedir la página siguiente: el valor que la respuesta anterior devolvió en 'cursor', tal cual. Nunca lo construyas ni lo edites a mano. Omítelo para empezar por la primera página.","type":"string"},"limit":{"default":100,"description":"Cuántas filas trae una página, entre 1 y 500. Por defecto, 100.","type":"integer","minimum":1,"maximum":500}}},"bch_empresas__cartolas__consultar__Output":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"cartolas":{"type":"array","items":{"type":"object","properties":{"numeroCuenta":{"type":"string","description":"La cuenta a la que pertenece esta fila, con el código de producto adelante y sin el relleno de ceros del banco (por ejemplo 'CTD12345678'). Es el mismo valor en saldos, movimientos y cartolas, y el que espera el filtro 'numeroCuenta'."},"tipoProducto":{"type":"string","description":"El tipo de producto de la cuenta según el índice de cartolas del banco (por ejemplo 'CTD'). Cuando el índice no lo trae, cae al código de producto de la cuenta."},"currency":{"type":"string","description":"La moneda de la cuenta, en código de tres letras (por ejemplo 'CLP'). Sale de la cuenta y nunca se asume: hoy el conector solo persiste cuentas en pesos chilenos y saltea las demás, avisándolo en el 'detalle' de la sincronización."},"fechaEmisionDay":{"type":"string","description":"El día (AAAA-MM-DD) en que el banco emitió este extracto. Junto con la cuenta es lo que identifica a la cartola, y es lo que filtra el 'fechaEmisionDay' de la entrada."},"periodo":{"type":"string","description":"El mes (AAAA-MM) con el que se buscó esta cartola, que no es la fecha del extracto: esa es 'fechaEmisionDay'."},"numeroCartola":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"El número correlativo del extracto (tag 28C del MT940), SIEMPRE como texto: convertirlo a número le come los ceros a la izquierda. 'null' cuando el extracto descargado no trae el tag."},"saldoInicial":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"El saldo de apertura del extracto (tag 60 del MT940), con su propio signo: en MT940 la marca 'D' es un sobregiro y sale negativa. No cuadra necesariamente con la suma de 'movimientos' del mismo mes, porque el extracto encadena por fecha contable y el feed vivo por fecha del movimiento. 'null' cuando el extracto no lo declara."},"saldoFinal":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"El saldo de cierre del extracto (tag 62 del MT940), con el mismo criterio de signo y la misma advertencia de cuadratura que 'saldoInicial'."},"ultimaLecturaEn":{"type":"string","description":"Instante (ISO 8601) en que esta cartola se leyó del banco por última vez."}},"required":["numeroCuenta","tipoProducto","currency","fechaEmisionDay","periodo","numeroCartola","saldoInicial","saldoFinal","ultimaLecturaEn"],"additionalProperties":false},"description":"Las cartolas guardadas, la más reciente primero. Una lista vacía significa que ese período todavía no se sincronizó, no que el banco no tenga extractos de esa cuenta."},"cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"El cursor de la página siguiente. Distinto de null significa que quedan más filas: reenvíalo tal cual en 'cursor'. 'null' significa que esta es la última página."}},"required":["cartolas","cursor"],"additionalProperties":false},"bch_empresas__conexion__sincronizar__Input":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"periodo":{"type":"string","pattern":"^\\d{4}-\\d{2}$","description":"El mes que se va a sincronizar, en formato AAAA-MM y en calendario chileno (por ejemplo '2026-07'). Traer varios meses son varias llamadas, una por mes."},"alcances":{"minItems":1,"type":"array","items":{"type":"string","enum":["saldos","movimientos","cartolas"]},"description":"Qué módulos de datos traer en esta corrida, al menos uno. Todos se sincronizan sobre UNA sola sesión (un login, un logout), así que pedir varios en una llamada cuesta menos que llamar una vez por cada uno. Un alcance debe estar habilitado en la conexión; si no lo está, la llamada responde 'alcance_not_enabled'."}},"required":["periodo","alcances"]},"bch_empresas__conexion__sincronizar__Output":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"periodo":{"type":"string","description":"Eco del período que se pidió, para poder correlacionar la respuesta sin guardarlo tú."},"results":{"type":"array","items":{"type":"object","properties":{"alcance":{"type":"string","description":"Cuál de los alcances pedidos describe esta fila. Hay una fila por alcance solicitado, en el orden canónico del conector, no en el orden en que los pediste."},"status":{"type":"string","enum":["ok","failed"],"description":"'ok' = el alcance terminó bien; que 'recordsSynced' sea 0 no lo vuelve un fallo. 'failed' = no terminó bien, y la causa va en 'error'. Ojo con un 'failed': NO garantiza que no se haya escrito nada. Cuando el sistema externo trunca un listado, el alcance queda 'failed' con las filas que alcanzó en 'recordsSynced'. Mira siempre las dos cosas juntas. Y revisa fila por fila: un alcance puede fallar mientras los otros de la misma corrida terminan bien."},"recordsSynced":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Cuántos registros de este alcance escribió ESTA corrida. Es el trabajo de esta llamada, no el total acumulado que tienes guardado: para saber cuánto hay, consulta. Un 0 no significa por sí solo «no hay datos»; cuando el cero tiene una explicación, viene en 'detalle'."},"error":{"description":"Por qué este alcance no terminó bien. Presente solo cuando 'status' es 'failed'. Normalmente es un código del catálogo de errores; cuando el sistema externo truncó el listado es una etiqueta de resultado ('movimientos_truncated', 'cartolas_truncated') que no está en ese catálogo y que significa «se escribió lo que alcanzó a venir». Decide por el valor, nunca por el texto libre.","type":"string"},"detalle":{"description":"Explicación en lenguaje llano, presente solo cuando el resultado necesita una. Existe para que un cero se pueda transmitir tal cual en vez de concluir «no hay datos»: transmítelo a quien pregunte en lugar de resumir el número solo.","type":"string"}},"required":["alcance","status","recordsSynced"],"additionalProperties":false},"description":"Una fila por alcance pedido, en el orden canónico del conector. Revísalas todas: un alcance puede fallar mientras los otros de la misma corrida terminan bien."}},"required":["periodo","results"],"additionalProperties":false},"bch_empresas__conexion__verificar__Input":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{}},"bch_empresas__conexion__verificar__Output":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"verificadoEn":{"type":"string","description":"Instante (ISO 8601) en que el login de prueba terminó bien. Es la única salida de esta tool: recibirla ya significa que la credencial sirve. Si no sirviera, la respuesta sería un error con su código de catálogo, nunca este objeto con un booleano en false."}},"required":["verificadoEn"],"additionalProperties":false},"bch_empresas__movimientos__consultar__Input":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"periodo":{"description":"Filtra por el mes (AAAA-MM) con el que se sincronizó la fila. Sin él, la respuesta cruza todos los períodos guardados de esta conexión.","type":"string","pattern":"^\\d{4}-\\d{2}$"},"numeroCuenta":{"description":"Filtra por una sola cuenta, escrita igual que el 'numeroCuenta' de las filas. Sin él vienen todas las cuentas de la conexión.","type":"string"},"cursor":{"description":"Para pedir la página siguiente: el valor que la respuesta anterior devolvió en 'cursor', tal cual. Nunca lo construyas ni lo edites a mano. Omítelo para empezar por la primera página.","type":"string"},"limit":{"default":100,"description":"Cuántas filas trae una página, entre 1 y 500. Por defecto, 100.","type":"integer","minimum":1,"maximum":500}}},"bch_empresas__movimientos__consultar__Output":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"movimientos":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"La identidad estable del movimiento: el 'id' que entrega el propio Banco de Chile, con el relleno de ceros de la cuenta canonizado. El mismo movimiento visto en dos sincronizaciones solapadas trae el mismo 'id', así que sirve para deduplicar sin comparar campos de presentación."},"numeroCuenta":{"type":"string","description":"La cuenta a la que pertenece esta fila, con el código de producto adelante y sin el relleno de ceros del banco (por ejemplo 'CTD12345678'). Es el mismo valor en saldos, movimientos y cartolas, y el que espera el filtro 'numeroCuenta'."},"codigoProducto":{"type":"string","description":"Las tres letras del tipo de producto de la cuenta (por ejemplo 'CTD'), tal como las entrega el banco. Es el prefijo de 'numeroCuenta'."},"currency":{"type":"string","description":"La moneda de la cuenta, en código de tres letras (por ejemplo 'CLP'). Sale de la cuenta y nunca se asume: hoy el conector solo persiste cuentas en pesos chilenos y saltea las demás, avisándolo en el 'detalle' de la sincronización."},"periodo":{"type":"string","description":"El mes (AAAA-MM) con el que se sincronizó esta fila. Es la ventana con que se pidió, no una propiedad del movimiento: la fecha del movimiento vive en 'fechaMovimiento'. Es el valor con el que filtra el 'periodo' de la entrada."},"fechaMovimiento":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Fecha y hora del movimiento (ISO 8601), tal como la entrega el banco. 'null' cuando el banco no la trajo."},"fechaContable":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"La fecha contable en formato AAAA-MM-DD, sin hora, y distinta de 'fechaMovimiento'. El banco la manda como dd/mm/aaaa y aquí ya viene convertida a ISO. 'null' cuando llegó en una forma que no se reconoció: nunca se adivina una fecha ni se deja pasar la celda cruda."},"codigoTransaccion":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"El código de transacción del núcleo del banco, tal cual. Es una etiqueta interna sin catálogo publicado: sirve para agrupar movimientos del mismo tipo, no para deducir qué fue la operación. 'null' cuando el banco no lo trae."},"monto":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"La magnitud del movimiento SIN signo. El sentido lo da 'type' y el signo visible, 'display'. 'null' significa que el banco no trajo la celda, nunca 0."},"type":{"anyOf":[{"type":"string","enum":["credit","debit"]},{"type":"null"}],"description":"Eje crédito/débito del LIBRO DEL BANCO, no el de la cartola: 'debit' es plata que ENTRA a la cuenta (un abono) y 'credit' es plata que SALE (un cargo). Es al revés de la lectura intuitiva y está así a propósito. El campo 'monto' es la magnitud SIN signo; el signo lo lleva 'display' ('credit' → negativo). 'null' significa que el banco no informó el tipo: no asumas ninguno de los dos."},"display":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"El monto ya formateado a la chilena y CON signo, derivado de 'type' ('credit', plata que sale, se muestra negativo). Es una comodidad de presentación: se calcula en la lectura y no se persiste. Para operar con el número usa 'monto' (magnitud sin signo) junto con 'type'."},"saldoContable":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"El saldo de la cuenta después de este movimiento. Es un balance: no lleva 'type' y conserva su propio signo, así que un sobregiro es negativo."},"descripcion":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"La glosa del movimiento, tal como la escribe el banco. 'null' cuando llega vacía."},"canal":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"El canal por el que se cursó el movimiento, con la etiqueta del propio banco (por ejemplo 'INTERNET'). 'null' cuando el banco no lo informa."},"detalleGlosa":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Las etiquetas extra del movimiento (RUT y nombre de la contraparte, entre otras) aplanadas en un solo texto, separadas por ' | '. Trae datos personales de terceros: trátalo como tal. 'null' cuando el banco no adjunta ninguna."},"ultimaLecturaEn":{"type":"string","description":"Instante (ISO 8601) en que esta fila se leyó del banco por última vez. Una corrección del banco entra como fila NUEVA en vez de reemplazar a la anterior, así que ante dos filas del mismo movimiento vale la de 'ultimaLecturaEn' mayor."}},"required":["id","numeroCuenta","codigoProducto","currency","periodo","fechaMovimiento","fechaContable","codigoTransaccion","monto","type","display","saldoContable","descripcion","canal","detalleGlosa","ultimaLecturaEn"],"additionalProperties":false},"description":"Los movimientos guardados, del más reciente al más antiguo. Una lista vacía significa que ese período todavía no se sincronizó, no que no haya movimientos."},"cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"El cursor de la página siguiente. Distinto de null significa que quedan más filas: reenvíalo tal cual en 'cursor'. 'null' significa que esta es la última página."}},"required":["movimientos","cursor"],"additionalProperties":false},"bch_empresas__saldos__consultar__Input":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"observedDay":{"description":"Filtra por el día del snapshot, en formato AAAA-MM-DD. Sin él, la primera página ya trae los saldos más recientes que hay guardados de cada cuenta.","type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"numeroCuenta":{"description":"Filtra por una sola cuenta, escrita igual que el 'numeroCuenta' de las filas. Sin él vienen todas las cuentas de la conexión.","type":"string"},"cursor":{"description":"Para pedir la página siguiente: el valor que la respuesta anterior devolvió en 'cursor', tal cual. Nunca lo construyas ni lo edites a mano. Omítelo para empezar por la primera página.","type":"string"},"limit":{"default":100,"description":"Cuántas filas trae una página, entre 1 y 500. Por defecto, 100.","type":"integer","minimum":1,"maximum":500}}},"bch_empresas__saldos__consultar__Output":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"saldos":{"type":"array","items":{"type":"object","properties":{"numeroCuenta":{"type":"string","description":"La cuenta a la que pertenece esta fila, con el código de producto adelante y sin el relleno de ceros del banco (por ejemplo 'CTD12345678'). Es el mismo valor en saldos, movimientos y cartolas, y el que espera el filtro 'numeroCuenta'."},"codigoProducto":{"type":"string","description":"Las tres letras con que Banco de Chile identifica el tipo de producto de la cuenta (por ejemplo 'CTD'). Es el prefijo de 'numeroCuenta' y viene del propio banco."},"currency":{"type":"string","description":"La moneda de la cuenta, en código de tres letras (por ejemplo 'CLP'). Sale de la cuenta y nunca se asume: hoy el conector solo persiste cuentas en pesos chilenos y saltea las demás, avisándolo en el 'detalle' de la sincronización."},"observedDay":{"type":"string","description":"El día (AAAA-MM-DD) de esta foto de saldos. Los saldos se guardan como un snapshot por día, así que sin filtro de fecha la primera página ya trae el más reciente de cada cuenta."},"saldoDisponible":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"El saldo disponible de la cuenta ese día, como número y con su propio signo (un sobregiro es negativo). 'null' significa que el banco no trajo la celda, nunca 0: un 0 es un saldo real."},"saldoContable":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"El saldo contable de la cuenta ese día. Difiere del disponible por retenciones y cheques en canje. Viene 'null' en las filas sincronizadas antes del 2026-08-11, que es cuando se empezó a leer; ese 'null' significa «no se leyó», nunca cero."},"lineaCredito":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"El monto disponible de la línea de crédito de la cuenta, tal como lo informa el banco. 'null' significa que el banco no trajo la celda, nunca 0."},"ultimaLecturaEn":{"type":"string","description":"Instante (ISO 8601) en que esta fila se leyó del banco por última vez. La caché puede quedarse quieta sin que la consulta falle (una conexión se auto-pausa tras tres fallos de credencial), así que este campo es lo que distingue un saldo recién leído de uno viejo."}},"required":["numeroCuenta","codigoProducto","currency","observedDay","saldoDisponible","saldoContable","lineaCredito","ultimaLecturaEn"],"additionalProperties":false},"description":"Los snapshots de saldo guardados, el más reciente primero. Una lista vacía significa que esta conexión todavía no se sincronizó, no que la empresa no tenga cuentas."},"cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"El cursor de la página siguiente. Distinto de null significa que quedan más filas: reenvíalo tal cual en 'cursor'. 'null' significa que esta es la última página."}},"required":["saldos","cursor"],"additionalProperties":false},"bci_pyme__conexion__sincronizar__Input":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"periodo":{"type":"string","pattern":"^\\d{4}-\\d{2}$","description":"El mes que se va a sincronizar, en formato AAAA-MM y en calendario chileno (por ejemplo '2026-07'). Traer varios meses son varias llamadas, una por mes."},"alcances":{"minItems":1,"type":"array","items":{"type":"string","enum":["saldos","movimientos"]},"description":"Qué módulos de datos traer en esta corrida, al menos uno. Todos se sincronizan sobre UNA sola sesión (un login, un logout), así que pedir varios en una llamada cuesta menos que llamar una vez por cada uno. Un alcance debe estar habilitado en la conexión; si no lo está, la llamada responde 'alcance_not_enabled'."}},"required":["periodo","alcances"]},"bci_pyme__conexion__sincronizar__Output":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"periodo":{"type":"string","description":"Eco del período que se pidió, para poder correlacionar la respuesta sin guardarlo tú."},"results":{"type":"array","items":{"type":"object","properties":{"alcance":{"type":"string","description":"Cuál de los alcances pedidos describe esta fila. Hay una fila por alcance solicitado, en el orden canónico del conector, no en el orden en que los pediste."},"status":{"type":"string","enum":["ok","failed"],"description":"'ok' = el alcance terminó bien; que 'recordsSynced' sea 0 no lo vuelve un fallo. 'failed' = no terminó bien, y la causa va en 'error'. Ojo con un 'failed': NO garantiza que no se haya escrito nada. Cuando el sistema externo trunca un listado, el alcance queda 'failed' con las filas que alcanzó en 'recordsSynced'. Mira siempre las dos cosas juntas. Y revisa fila por fila: un alcance puede fallar mientras los otros de la misma corrida terminan bien."},"recordsSynced":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Cuántos registros de este alcance escribió ESTA corrida. Es el trabajo de esta llamada, no el total acumulado que tienes guardado: para saber cuánto hay, consulta. Un 0 no significa por sí solo «no hay datos»; cuando el cero tiene una explicación, viene en 'detalle'."},"error":{"description":"Por qué este alcance no terminó bien. Presente solo cuando 'status' es 'failed'. Normalmente es un código del catálogo de errores; cuando el sistema externo truncó el listado es una etiqueta de resultado ('movimientos_truncated', 'cartolas_truncated') que no está en ese catálogo y que significa «se escribió lo que alcanzó a venir». Decide por el valor, nunca por el texto libre.","type":"string"},"detalle":{"description":"Explicación en lenguaje llano, presente solo cuando el resultado necesita una. Existe para que un cero se pueda transmitir tal cual en vez de concluir «no hay datos»: transmítelo a quien pregunte en lugar de resumir el número solo.","type":"string"}},"required":["alcance","status","recordsSynced"],"additionalProperties":false},"description":"Una fila por alcance pedido, en el orden canónico del conector. Revísalas todas: un alcance puede fallar mientras los otros de la misma corrida terminan bien."}},"required":["periodo","results"],"additionalProperties":false},"bci_pyme__conexion__verificar__Input":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{}},"bci_pyme__conexion__verificar__Output":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"verificadoEn":{"type":"string","description":"Instante (ISO 8601) en que el login de prueba terminó bien. Es la única salida de esta tool: recibirla ya significa que la credencial sirve. Si no sirviera, la respuesta sería un error con su código de catálogo, nunca este objeto con un booleano en false."}},"required":["verificadoEn"],"additionalProperties":false},"bci_pyme__movimientos__consultar__Input":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"periodo":{"description":"Filtra por el mes (AAAA-MM) con el que se sincronizó la fila. Sin él, la respuesta cruza todos los períodos guardados y 'completo' llega en null.","type":"string","pattern":"^\\d{4}-\\d{2}$"},"numeroCuenta":{"description":"Filtra por una sola cuenta, escrita igual que el 'numeroCuenta' de las filas. Sin él vienen todas las cuentas de la conexión.","type":"string"},"cursor":{"description":"Para pedir la página siguiente: el valor que la respuesta anterior devolvió en 'cursor', tal cual. Nunca lo construyas ni lo edites a mano. Omítelo para empezar por la primera página.","type":"string"},"limit":{"default":100,"description":"Cuántas filas trae una página, entre 1 y 500. Por defecto, 100.","type":"integer","minimum":1,"maximum":500}}},"bci_pyme__movimientos__consultar__Output":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"movimientos":{"type":"array","items":{"type":"object","properties":{"numeroCuenta":{"type":"string","description":"El número de la cuenta a la que pertenece esta fila, tal como lo entrega el portal de BCI. Es el mismo valor en saldos y movimientos, y el que espera el filtro 'numeroCuenta'."},"periodo":{"type":"string","description":"El mes (AAAA-MM) con el que se sincronizó esta fila. Es la ventana con que se pidió, no una propiedad del movimiento: la fecha vive en 'fechaMovimiento'. Es el valor con el que filtra el 'periodo' de la entrada."},"fechaMovimiento":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"La fecha del movimiento (ISO 8601), tal como la entrega el banco. 'null' cuando no la trajo."},"fechaContable":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"La fecha contable del movimiento (ISO 8601), que puede diferir de 'fechaMovimiento'. 'null' cuando el banco no la trajo."},"descripcion":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"La glosa del movimiento, tal como la escribe el banco. 'null' cuando llega vacía."},"monto":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"La magnitud del movimiento SIN signo. El sentido lo da 'type' y el signo visible, 'display'. 'null' significa que el banco no trajo la celda, nunca 0."},"type":{"anyOf":[{"type":"string","enum":["credit","debit"]},{"type":"null"}],"description":"Eje crédito/débito del LIBRO DEL BANCO, no el de la cartola: 'debit' es plata que ENTRA a la cuenta (un abono) y 'credit' es plata que SALE (un cargo). Es al revés de la lectura intuitiva y está así a propósito. El campo 'monto' es la magnitud SIN signo; el signo lo lleva 'display' ('credit' → negativo). 'null' significa que el banco no informó el tipo: no asumas ninguno de los dos."},"display":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"El monto ya formateado a la chilena y CON signo, derivado de 'type' ('credit', plata que sale, se muestra negativo). Es una comodidad de presentación: se calcula en la lectura y no se persiste. Para operar con el número usa 'monto' (magnitud sin signo) junto con 'type'."},"saldoContable":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"El saldo de la cuenta después de este movimiento. Es un balance: no lleva 'type' y conserva su propio signo, así que un sobregiro es negativo."},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"La categoría con que el propio BCI clasifica el movimiento (por ejemplo 'Transferencias'). Es una etiqueta del banco, no un vocabulario de Connect: puede cambiar sin aviso. 'null' cuando el banco no la trae."},"mnemonico":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"El código corto de transacción del propio BCI (por ejemplo 'TRF'). Es una etiqueta del banco sin catálogo publicado: sirve para agrupar movimientos del mismo tipo, no para deducir qué fue la operación. 'null' cuando el banco no lo trae."},"counterparty":{"type":"object","properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"El nombre o razón social de la contraparte. 'null' cuando el detalle no lo trae."},"rut":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"El RUT de la contraparte, tal cual. 'null' cuando el detalle no lo trae."},"bank":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"El banco de la contraparte. 'null' cuando el detalle no lo trae."},"account":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"El número de cuenta de la contraparte. 'null' cuando el detalle no lo trae."}},"required":["name","rut","bank","account"],"additionalProperties":false,"description":"La contraparte del movimiento, extraída del detalle que adjunta el banco. Los cuatro campos vienen en 'null' cuando el movimiento no trae detalle, que es lo normal fuera de las transferencias. Son datos personales de terceros: trátalos como tales."},"ultimaLecturaEn":{"type":"string","description":"Instante (ISO 8601) en que esta fila se leyó del banco por última vez. Una corrección del banco entra como fila NUEVA en vez de reemplazar a la anterior, así que ante dos filas del mismo movimiento vale la de 'ultimaLecturaEn' mayor."}},"required":["numeroCuenta","periodo","fechaMovimiento","fechaContable","descripcion","monto","type","display","saldoContable","category","mnemonico","counterparty","ultimaLecturaEn"],"additionalProperties":false},"description":"Los movimientos guardados, del más reciente al más antiguo. Una lista vacía significa que ese período todavía no se sincronizó, no que no haya movimientos."},"cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"El cursor de la página siguiente. Distinto de null significa que quedan más filas: reenvíalo tal cual en 'cursor'. 'null' significa que esta es la última página."},"completo":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Si el último sync de ESE período trajo todo. BCI corta en 1000 movimientos por cuenta y mes, así que 'false' significa que faltan filas del mes. 'null' significa «no se sabe», y es lo que devuelve una consulta sin filtro de 'periodo': nunca lo leas como un 'true'."}},"required":["movimientos","cursor","completo"],"additionalProperties":false},"bci_pyme__saldos__consultar__Input":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"observedDay":{"description":"Filtra por el día del snapshot, en formato AAAA-MM-DD. Sin él, la primera página ya trae los saldos más recientes que hay guardados de cada cuenta.","type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"numeroCuenta":{"description":"Filtra por una sola cuenta, escrita igual que el 'numeroCuenta' de las filas. Sin él vienen todas las cuentas de la conexión.","type":"string"},"cursor":{"description":"Para pedir la página siguiente: el valor que la respuesta anterior devolvió en 'cursor', tal cual. Nunca lo construyas ni lo edites a mano. Omítelo para empezar por la primera página.","type":"string"},"limit":{"default":100,"description":"Cuántas filas trae una página, entre 1 y 500. Por defecto, 100.","type":"integer","minimum":1,"maximum":500}}},"bci_pyme__saldos__consultar__Output":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"saldos":{"type":"array","items":{"type":"object","properties":{"numeroCuenta":{"type":"string","description":"El número de la cuenta a la que pertenece esta fila, tal como lo entrega el portal de BCI. Es el mismo valor en saldos y movimientos, y el que espera el filtro 'numeroCuenta'."},"currency":{"type":"string","description":"La moneda de la cuenta, en código de tres letras (por ejemplo 'CLP'). Sale de la cuenta."},"observedDay":{"type":"string","description":"El día (AAAA-MM-DD) de esta foto de saldos. Los saldos se guardan como un snapshot por día, así que sin filtro de fecha la primera página ya trae el más reciente de cada cuenta."},"observedAt":{"type":"string","description":"El instante exacto (ISO 8601) en que se tomó la foto, dentro del día de 'observedDay'. Todas las cuentas de una misma sincronización comparten este valor."},"saldoContable":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"El saldo contable de la cuenta, como número y con su propio signo (un sobregiro es negativo). 'null' significa que el banco no trajo la celda, nunca 0: un 0 es un saldo real."},"saldoDisponible":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"El saldo disponible de la cuenta, con el mismo criterio de signo y de 'null' que 'saldoContable'."},"saldoContable9am":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"El saldo contable de las 9 de la mañana, que BCI publica como un campo aparte de los otros tres. Mismo criterio de signo y de 'null' que 'saldoContable'."},"retencion":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"El monto retenido que BCI informa junto a los saldos. 'null' significa que el banco no trajo la celda, nunca 0."},"ultimaLecturaEn":{"type":"string","description":"Instante (ISO 8601) en que esta fila se leyó del banco por última vez. La caché puede quedarse quieta sin que la consulta falle (una conexión se auto-pausa tras tres fallos de credencial), así que este campo es lo que distingue un saldo recién leído de uno viejo."}},"required":["numeroCuenta","currency","observedDay","observedAt","saldoContable","saldoDisponible","saldoContable9am","retencion","ultimaLecturaEn"],"additionalProperties":false},"description":"Los snapshots de saldo guardados, el más reciente primero. Una lista vacía significa que esta conexión todavía no se sincronizó, no que la empresa no tenga cuentas."},"cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"El cursor de la página siguiente. Distinto de null significa que quedan más filas: reenvíalo tal cual en 'cursor'. 'null' significa que esta es la última página."}},"required":["saldos","cursor"],"additionalProperties":false},"bice_empresas__conexion__sincronizar__Input":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"periodo":{"type":"string","pattern":"^\\d{4}-\\d{2}$","description":"El mes que se va a sincronizar, en formato AAAA-MM y en calendario chileno (por ejemplo '2026-07'). Traer varios meses son varias llamadas, una por mes."},"alcances":{"minItems":1,"type":"array","items":{"type":"string","enum":["saldos","movimientos"]},"description":"Qué módulos de datos traer en esta corrida, al menos uno. Todos se sincronizan sobre UNA sola sesión (un login, un logout), así que pedir varios en una llamada cuesta menos que llamar una vez por cada uno. Un alcance debe estar habilitado en la conexión; si no lo está, la llamada responde 'alcance_not_enabled'."}},"required":["periodo","alcances"]},"bice_empresas__conexion__sincronizar__Output":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"periodo":{"type":"string","description":"Eco del período que se pidió, para poder correlacionar la respuesta sin guardarlo tú."},"results":{"type":"array","items":{"type":"object","properties":{"alcance":{"type":"string","description":"Cuál de los alcances pedidos describe esta fila. Hay una fila por alcance solicitado, en el orden canónico del conector, no en el orden en que los pediste."},"status":{"type":"string","enum":["ok","failed"],"description":"'ok' = el alcance terminó bien; que 'recordsSynced' sea 0 no lo vuelve un fallo. 'failed' = no terminó bien, y la causa va en 'error'. Ojo con un 'failed': NO garantiza que no se haya escrito nada. Cuando el sistema externo trunca un listado, el alcance queda 'failed' con las filas que alcanzó en 'recordsSynced'. Mira siempre las dos cosas juntas. Y revisa fila por fila: un alcance puede fallar mientras los otros de la misma corrida terminan bien."},"recordsSynced":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Cuántos registros de este alcance escribió ESTA corrida. Es el trabajo de esta llamada, no el total acumulado que tienes guardado: para saber cuánto hay, consulta. Un 0 no significa por sí solo «no hay datos»; cuando el cero tiene una explicación, viene en 'detalle'."},"error":{"description":"Por qué este alcance no terminó bien. Presente solo cuando 'status' es 'failed'. Normalmente es un código del catálogo de errores; cuando el sistema externo truncó el listado es una etiqueta de resultado ('movimientos_truncated', 'cartolas_truncated') que no está en ese catálogo y que significa «se escribió lo que alcanzó a venir». Decide por el valor, nunca por el texto libre.","type":"string"},"cuentasConsultadas":{"description":"Cuántas cuentas se alcanzaron a consultar. Es lo que vuelve interpretable un 'recordsSynced: 0': cero con una cuenta consultada significa que el banco no tiene movimientos ahí, y cero con cero cuentas significa que ni siquiera se llegó a preguntar. Los dos casos traen el mismo 0, así que revisa este campo antes de reportar «no hay datos».","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"fueraDeVentana":{"description":"'true' cuando el banco no ofrece cartola para ese período en esa cuenta: el mes no está disponible, que es distinto de un mes sin movimientos. No lo reportes como «no hubo movimientos»; prueba un mes más reciente.","type":"boolean"},"detalle":{"description":"Explicación en lenguaje llano, presente solo cuando el resultado necesita una. Existe para que un cero se pueda transmitir tal cual en vez de concluir «no hay datos»: transmítelo a quien pregunte en lugar de resumir el número solo.","type":"string"}},"required":["alcance","status","recordsSynced"],"additionalProperties":false},"description":"Una fila por alcance pedido, en el orden canónico del conector. Revísalas todas: un alcance puede fallar mientras los otros de la misma corrida terminan bien."}},"required":["periodo","results"],"additionalProperties":false},"bice_empresas__conexion__verificar__Input":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{}},"bice_empresas__conexion__verificar__Output":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"verificadoEn":{"type":"string","description":"Instante (ISO 8601) en que el login de prueba terminó bien. Es la única salida de esta tool: recibirla ya significa que la credencial sirve. Si no sirviera, la respuesta sería un error con su código de catálogo, nunca este objeto con un booleano en false."}},"required":["verificadoEn"],"additionalProperties":false},"bice_empresas__movimientos__consultar__Input":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"periodo":{"description":"Filtra por el mes (AAAA-MM) con el que se sincronizó la fila. Como la cartola de BICE corre de fin de mes a fin de mes, un período puede traer movimientos fechados en los últimos días del mes anterior. Sin él, la respuesta cruza todos los períodos guardados.","type":"string","pattern":"^\\d{4}-\\d{2}$"},"numeroCuenta":{"description":"Filtra por una sola cuenta, escrita igual que el 'numeroCuenta' de las filas. Sin él vienen todas las cuentas de la conexión.","type":"string"},"type":{"description":"Eje crédito/débito del LIBRO DEL BANCO, no el de la cartola: 'debit' es plata que ENTRA a la cuenta (un abono) y 'credit' es plata que SALE (un cargo). Es al revés de la lectura intuitiva y está así a propósito. El campo 'monto' es la magnitud SIN signo; el signo lo lleva 'display' ('credit' → negativo). 'null' significa que el banco no informó el tipo: no asumas ninguno de los dos.","type":"string","enum":["credit","debit"]},"cursor":{"description":"Para pedir la página siguiente: el valor que la respuesta anterior devolvió en 'cursor', tal cual. Nunca lo construyas ni lo edites a mano. Omítelo para empezar por la primera página.","type":"string"},"limit":{"default":100,"description":"Cuántas filas trae una página, entre 1 y 500. Por defecto, 100.","type":"integer","minimum":1,"maximum":500}}},"bice_empresas__movimientos__consultar__Output":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"movimientos":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"La identidad estable del movimiento: la huella con la que se guardó. El mismo movimiento llega por dos rutas del banco con formatos distintos y por las dos trae este mismo 'id', así que sirve para deduplicar el día que comparten dos cartolas sin comparar campos de presentación."},"numeroCuenta":{"type":"string","description":"El identificador ESTABLE de la cuenta a la que pertenece esta fila. No es la máscara que muestra el portal en pantalla, que cambia en cada sesión: es el mismo valor en saldos y movimientos, y el que espera el filtro 'numeroCuenta'."},"currency":{"type":"string","description":"La moneda de la cuenta, en código de tres letras (por ejemplo 'CLP'). BICE la manda a veces como código numérico y aquí ya viene traducida a las tres letras."},"periodo":{"type":"string","description":"El mes (AAAA-MM) con el que se sincronizó esta fila. Es la ventana con que se pidió, no una propiedad del movimiento: la cartola de BICE corre de fin de mes a fin de mes, así que el período '2026-07' incluye movimientos fechados el 30 de junio. La fecha vive en 'fecha'."},"fecha":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"La fecha del movimiento (ISO 8601), tal como la entrega el banco. Puede caer en el mes anterior al de 'periodo', porque la cartola de BICE corre de fin de mes a fin de mes. 'null' cuando el banco no la trajo en una forma reconocible."},"monto":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"La magnitud del movimiento SIN signo. El sentido lo da 'type' y el signo visible, 'display'. 'null' cuando ni el débito ni el crédito traen un valor distinto de cero: el banco manda las dos celdas siempre y escribe 0 en la que no aplica, así que ese 0 no es un movimiento de cero."},"type":{"anyOf":[{"type":"string","enum":["credit","debit"]},{"type":"null"}],"description":"Eje crédito/débito del LIBRO DEL BANCO, no el de la cartola: 'debit' es plata que ENTRA a la cuenta (un abono) y 'credit' es plata que SALE (un cargo). Es al revés de la lectura intuitiva y está así a propósito. El campo 'monto' es la magnitud SIN signo; el signo lo lleva 'display' ('credit' → negativo). 'null' significa que el banco no informó el tipo: no asumas ninguno de los dos."},"display":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"El monto ya formateado a la chilena y CON signo, derivado de 'type' ('credit', plata que sale, se muestra negativo). Es una comodidad de presentación: se calcula en la lectura y no se persiste. Para operar con el número usa 'monto' (magnitud sin signo) junto con 'type'."},"saldoContable":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"El saldo de la cuenta después de este movimiento. Es un balance: no lleva 'type' y conserva su propio signo, así que un sobregiro es negativo."},"descripcion":{"type":"string","description":"La glosa del movimiento, tal como la escribe el banco. Cadena vacía cuando el banco no la trae."},"documento":{"type":"string","description":"El número de documento del movimiento, tal como lo entrega el banco. Ojo al compararlo: una ruta del banco lo manda con nueve dígitos y la otra truncado a los últimos ocho, así que dos textos distintos pueden ser el mismo documento. Para saber si dos filas son el mismo movimiento usa 'id'. Cadena vacía cuando el banco no lo trae."}},"required":["id","numeroCuenta","currency","periodo","fecha","monto","type","display","saldoContable","descripcion","documento"],"additionalProperties":false},"description":"Los movimientos guardados, del más reciente al más antiguo. Una lista vacía significa que ese período todavía no se sincronizó, no que no haya movimientos."},"cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"El cursor de la página siguiente. Distinto de null significa que quedan más filas: reenvíalo tal cual en 'cursor'. 'null' significa que esta es la última página."}},"required":["movimientos","cursor"],"additionalProperties":false},"bice_empresas__saldos__consultar__Input":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"observedDay":{"description":"Filtra por el día del snapshot, en formato AAAA-MM-DD. Sin él, la primera página ya trae los saldos más recientes que hay guardados de cada cuenta.","type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"numeroCuenta":{"description":"Filtra por una sola cuenta, escrita igual que el 'numeroCuenta' de las filas. Sin él vienen todas las cuentas de la conexión.","type":"string"},"cursor":{"description":"Para pedir la página siguiente: el valor que la respuesta anterior devolvió en 'cursor', tal cual. Nunca lo construyas ni lo edites a mano. Omítelo para empezar por la primera página.","type":"string"},"limit":{"default":100,"description":"Cuántas filas trae una página, entre 1 y 500. Por defecto, 100.","type":"integer","minimum":1,"maximum":500}}},"bice_empresas__saldos__consultar__Output":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"saldos":{"type":"array","items":{"type":"object","properties":{"numeroCuenta":{"type":"string","description":"El identificador ESTABLE de la cuenta a la que pertenece esta fila. No es la máscara que muestra el portal en pantalla, que cambia en cada sesión: es el mismo valor en saldos y movimientos, y el que espera el filtro 'numeroCuenta'."},"numProducto":{"type":"string","description":"El mismo identificador estable de la cuenta que 'numeroCuenta'. Los dos campos traen el mismo valor a propósito: es el nombre con el que el propio BICE lo pide en sus llamadas."},"currency":{"type":"string","description":"La moneda de la cuenta, en código de tres letras (por ejemplo 'CLP'). BICE la manda a veces como código numérico y aquí ya viene traducida a las tres letras."},"observedDay":{"type":"string","description":"El día (AAAA-MM-DD) de esta foto de saldos. Los saldos se guardan como un snapshot por día, así que sin filtro de fecha la primera página ya trae el más reciente de cada cuenta."},"observedAt":{"type":"string","description":"El instante exacto (ISO 8601) en que se tomó la foto, dentro del día de 'observedDay'."},"saldoContable":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"El saldo contable de la cuenta, como número y con su propio signo (un sobregiro es negativo). 'null' significa que el banco no trajo la celda, nunca 0: un 0 es un saldo real."},"saldoDisponible":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"El saldo disponible de la cuenta, con el mismo criterio de signo y de 'null' que 'saldoContable'."}},"required":["numeroCuenta","numProducto","currency","observedDay","observedAt","saldoContable","saldoDisponible"],"additionalProperties":false},"description":"Los snapshots de saldo guardados, el más reciente primero. Una lista vacía significa que esta conexión todavía no se sincronizó, no que la empresa no tenga cuentas."},"cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"El cursor de la página siguiente. Distinto de null significa que quedan más filas: reenvíalo tal cual en 'cursor'. 'null' significa que esta es la última página."}},"required":["saldos","cursor"],"additionalProperties":false},"conexiones__enlace__crear__Input":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"sistema":{"type":"string","description":"Código del sistema, tal como lo devuelve conexiones.sistemas.listar."},"modo":{"default":"crear","description":"'crear' para una conexión nueva; 'reconectar' para renovar la credencial de una que ya existe.","type":"string","enum":["crear","reconectar"]},"conexionId":{"description":"conn_…, obligatorio cuando modo es 'reconectar'.","type":"string"}},"required":["sistema"]},"conexiones__enlace__crear__Output":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"url":{"type":"string","description":"El enlace de un solo uso. Compártelo tal cual, con el dominio visible."},"dominio":{"type":"string","description":"El dominio del enlace, ya extraído para mostrarlo junto a la URL."},"sistema":{"type":"string","description":"Código del sistema que se va a conectar."},"sistemaNombre":{"type":"string","description":"Nombre del sistema, para presentar el enlace con claridad."},"modo":{"type":"string","enum":["crear","reconectar"],"description":"Si el enlace crea una conexión nueva o renueva la credencial de una existente."},"expiraEn":{"type":"string","description":"Cuándo vence el enlace (ISO 8601). Vencido, hay que crear otro."},"intentosMaximos":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Cuántos intentos de login admite antes de agotarse."},"advertencia":{"type":"string","description":"Texto de presentación segura del enlace, listo para mostrar a la persona."}},"required":["url","dominio","sistema","sistemaNombre","modo","expiraEn","intentosMaximos","advertencia"],"additionalProperties":false},"conexiones__estado__consultar__Input":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"sistema":{"description":"Filtra por código de sistema.","type":"string"},"conexionId":{"description":"conn_…, filtra una conexión puntual.","type":"string"}}},"conexiones__estado__consultar__Output":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"conexiones":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"El id de la conexión (conn_…). Es lo que va en la cabecera 'X-Connect-Connection' de cada llamada a este sistema."},"sistema":{"type":"string","description":"El código del sistema al que pertenece esta conexión."},"nombre":{"type":"string","description":"El nombre con que se creó la conexión, normalmente la empresa a la que pertenece la credencial."},"estado":{"type":"string","enum":["active","disabled","pending"],"description":"En qué estado está la conexión. 'active' = utilizable. 'disabled' = pausada, sus tools responden 'connection_disabled'. 'pending' = creada pero todavía sin credencial vinculada."},"credencial":{"type":"string","enum":["linked","invalid","revoked","ausente"],"description":"En qué estado está la credencial de esta conexión. 'linked' = vinculada y utilizable. 'invalid' = el sistema externo la rechazó, hay que reconectar. 'revoked' = se revocó a propósito. 'ausente' = nunca se entregó. Todo lo que no sea 'linked' se arregla con 'conexiones.enlace.crear' en modo 'reconectar'."},"verificadaEn":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Cuándo se probó por última vez la credencial contra el sistema externo (ISO 8601). 'null' si nunca se probó. Una fecha vieja no invalida la credencial por sí sola."},"alcances":{"type":"array","items":{"type":"string"},"description":"Los módulos de datos habilitados en esta conexión. Pedir uno que no esté en esta lista responde 'alcance_not_enabled'."},"cadencia":{"anyOf":[{"type":"string","enum":["off","daily","12h","6h"]},{"type":"null"}],"description":"Cada cuánto sincroniza sola esta conexión. 'off' o 'null' significan que nadie la sincroniza por ti: llama a la tool 'conexion.sincronizar' del sistema cuando quieras datos frescos."},"trabajos":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"El id de esta sincronización programada (sjb_…)."},"estado":{"type":"string","enum":["queued","running","succeeded","failed","partial"],"description":"En qué va la sincronización. 'queued' y 'running' significan que todavía está trabajando: espera antes de concluir que no hay datos. 'succeeded' terminó bien, 'partial' escribió una parte y 'failed' no escribió nada, con la causa en 'error'."},"periodo":{"type":"string","description":"El mes que sincronizó esta corrida, en formato AAAA-MM."},"alcances":{"type":"array","items":{"type":"string"},"description":"Qué módulos de datos abarcó esta corrida."},"registros":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}],"description":"Cuántos registros escribió. 'null' significa que todavía no se sabe (la corrida no terminó), y es distinto de un 0, que sí es un resultado: ese período no tenía nada."},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"La causa de la falla cuando 'estado' es 'failed'. 'null' en cualquier otro caso."}},"required":["id","estado","periodo","alcances","registros","error"],"additionalProperties":false},"description":"Las últimas sincronizaciones programadas de esta conexión, de la más reciente a la más antigua."},"datosListos":{"type":"boolean","description":"La respuesta a «¿ya puedo leer?»: alguna sincronización terminó bien y ninguna está en curso. Revísalo antes de concluir que no hay datos, porque un listado vacío con 'datosListos' en false significa «espera», no «no tienes nada». Un período legítimamente sin registros cuenta como sincronización exitosa: este campo no mira si hay filas."},"herramientas":{"type":"array","items":{"type":"string"},"description":"Los ids de tool que ya puedes invocar sobre esta conexión. Si tu cliente MCP todavía no los muestra, llámalos con 'execute' pasando el id en 'tool'."}},"required":["id","sistema","nombre","estado","credencial","verificadaEn","alcances","cadencia","trabajos","datosListos","herramientas"],"additionalProperties":false},"description":"Las conexiones de esta organización que pasan el filtro, con su estado y sus últimas sincronizaciones."}},"required":["conexiones"],"additionalProperties":false},"conexiones__sistemas__listar__Input":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"sistema":{"description":"Filtra por código de sistema. Omítelo para verlos todos.","type":"string"}}},"conexiones__sistemas__listar__Output":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"sistemas":{"type":"array","items":{"type":"object","properties":{"codigo":{"type":"string","description":"El código del sistema. Es el valor exacto que espera 'conexiones.enlace.crear'; no lo adivines a partir del nombre."},"nombre":{"type":"string","description":"El nombre largo del sistema, para escribirlo completo la primera vez."},"nombreCorto":{"type":"string","description":"El nombre corto, para listas y selectores."},"insignia":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"La categoría que muestra el selector (por ejemplo 'TRIBUTARIO' o 'BANCO EMPRESAS'). Solo presentación."},"dominio":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"El dominio del sistema externo, solo para mostrarlo. Nunca es la dirección a la que se llama."},"requiereNavegador":{"type":"boolean","description":"'true' significa que el login de este sistema abre un navegador remoto y tarda decenas de segundos. Avísalo antes de empezar, para que la espera no parezca que algo se colgó."},"alcances":{"type":"array","items":{"type":"object","properties":{"codigo":{"type":"string","description":"El código del módulo de datos, tal como se pasa en 'alcances' al sincronizar."},"etiqueta":{"type":"string","description":"El nombre del módulo en lenguaje de producto, para mostrárselo a una persona."}},"required":["codigo","etiqueta"],"additionalProperties":false},"description":"Los módulos de datos que este sistema ofrece. Al conectarlo eliges cuáles quedan habilitados."},"conectado":{"type":"boolean","description":"'true' si esta organización ya tiene al menos una conexión de este sistema. Si es 'false', el camino es 'conexiones.enlace.crear'."},"conexiones":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"El id de la conexión (conn_…). Es lo que va en la cabecera 'X-Connect-Connection' de cada llamada a este sistema."},"nombre":{"type":"string","description":"El nombre con que se creó la conexión, normalmente la empresa a la que pertenece la credencial."},"estado":{"type":"string","enum":["active","disabled","pending"],"description":"En qué estado está la conexión. 'active' = utilizable. 'disabled' = pausada, sus tools responden 'connection_disabled'. 'pending' = creada pero todavía sin credencial vinculada."},"credencial":{"type":"string","enum":["linked","invalid","revoked","ausente"],"description":"En qué estado está la credencial de esta conexión. 'linked' = vinculada y utilizable. 'invalid' = el sistema externo la rechazó, hay que reconectar. 'revoked' = se revocó a propósito. 'ausente' = nunca se entregó. Todo lo que no sea 'linked' se arregla con 'conexiones.enlace.crear' en modo 'reconectar'."}},"required":["id","nombre","estado","credencial"],"additionalProperties":false},"description":"Las conexiones que esta organización ya tiene de este sistema. Vacío cuando 'conectado' es false."},"herramientas":{"type":"array","items":{"type":"string"},"description":"Los ids de tool que quedan disponibles al conectar este sistema. Los puedes aprender ANTES de conectar e invocarlos con 'execute' pasando el id en 'tool', sin esperar a que tu cliente MCP refresque su lista."}},"required":["codigo","nombre","nombreCorto","insignia","dominio","requiereNavegador","alcances","conectado","conexiones","herramientas"],"additionalProperties":false},"description":"El catálogo de sistemas conectables, con el estado de cada uno para esta organización."}},"required":["sistemas"],"additionalProperties":false},"core__timestamp__now__Input":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"timezone":{"default":"UTC","description":"IANA tz, p.ej. America/Santiago","type":"string"}}},"core__timestamp__now__Output":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"iso":{"type":"string","description":"La hora del servidor en ISO 8601, SIEMPRE en UTC. No se convierte a la zona que pediste."},"unix":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"La misma hora como epoch Unix, en segundos."},"timezone":{"type":"string","description":"Eco de la zona horaria que pediste. Confirma qué se recibió; no cambia el valor de 'iso'."}},"required":["iso","unix","timezone"],"additionalProperties":false},"echo__message__reflect__Input":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"text":{"type":"string","description":"Texto a reflejar"}},"required":["text"]},"echo__message__reflect__Output":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"text":{"type":"string","description":"El mismo texto que mandaste, sin cambios."},"length":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Cuántos caracteres tiene ese texto."}},"required":["text","length"],"additionalProperties":false},"indicadores__serie__consultar__Input":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"codigo":{"type":"string","enum":["UF","DOLAR","EURO","IPC","UTM"],"description":"Código del indicador económico"},"desde":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Primer día del rango, inclusive, en formato AAAA-MM-DD."},"hasta":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Último día del rango, inclusive, en formato AAAA-MM-DD."},"limite":{"default":1000,"description":"Máximo de puntos a devolver (tope duro 1000)","type":"integer","minimum":1,"maximum":1000}},"required":["codigo","desde","hasta"]},"indicadores__serie__consultar__Output":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"codigo":{"type":"string","description":"Eco del código del indicador al que corresponde este valor."},"unidad":{"type":"string","description":"En qué unidad está expresada la serie. UF, DOLAR, EURO y UTM vienen en pesos chilenos ('CLP'); el IPC viene en 'pct', porque es la variación mensual en por ciento y no un monto. Cuando 'valores' llega vacío este campo es la cadena vacía, porque la unidad se toma del primer punto."},"valores":{"type":"array","items":{"type":"object","properties":{"fecha":{"type":"string","description":"El día de este punto, en formato AAAA-MM-DD."},"valor":{"type":"number","description":"El valor de ese día, en la unidad que dice 'unidad'."}},"required":["fecha","valor"],"additionalProperties":false},"description":"Los puntos de la serie dentro del rango, en orden ascendente por fecha. Solo trae los días que tienen dato propio: esta tool no arrastra, a diferencia de 'indicadores.valor.consultar', así que un rango con fines de semana devuelve menos puntos que días pedidos. Puede venir recortada por 'limite'."}},"required":["codigo","unidad","valores"],"additionalProperties":false},"indicadores__valor__actual__Input":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"codigo":{"type":"string","enum":["UF","DOLAR","EURO","IPC","UTM"],"description":"Código del indicador económico"}},"required":["codigo"]},"indicadores__valor__actual__Output":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"codigo":{"type":"string","description":"Eco del código del indicador al que corresponde este valor."},"fecha":{"type":"string","description":"La fecha del valor devuelto. Puede ser futura (UF/UTM se publican por adelantado) o pasada (ingesta atrasada)."},"valor":{"type":"number","description":"El valor del indicador en esa fecha, en la unidad que dice 'unidad'."},"unidad":{"type":"string","description":"En qué unidad está expresado el valor. UF, DOLAR, EURO y UTM vienen en pesos chilenos ('CLP'); el IPC viene en 'pct', porque es la variación mensual en por ciento y no un monto. Lee este campo antes de tratar el número como plata."},"antiguedadDias":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Días entre 'fecha' y hoy en America/Santiago. 0 = el valor es de hoy; POSITIVO = está atrasado ese número de días (la fuente no se actualiza); NEGATIVO = está fechado en el futuro, normal en UF y UTM que se publican por adelantado. Compáralo contra tu propia tolerancia antes de calcular plata con este número."}},"required":["codigo","fecha","valor","unidad","antiguedadDias"],"additionalProperties":false},"indicadores__valor__consultar__Input":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"codigo":{"type":"string","enum":["UF","DOLAR","EURO","IPC","UTM"],"description":"Código del indicador económico"},"fecha":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"La fecha a la que quieres el valor vigente, en formato AAAA-MM-DD. Si ese día no tiene dato propio se arrastra el último anterior, así que pedir un fin de semana o una fecha futura responde 200 con 'esArrastre' en true, nunca un error."}},"required":["codigo","fecha"]},"indicadores__valor__consultar__Output":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"codigo":{"type":"string","description":"Eco del código del indicador al que corresponde este valor."},"fecha":{"type":"string","description":"La fecha del valor DEVUELTO. Si 'esArrastre' es true, es anterior a 'fechaSolicitada'."},"valor":{"type":"number","description":"El valor del indicador vigente a esa fecha, en la unidad que dice 'unidad'."},"unidad":{"type":"string","description":"En qué unidad está expresado el valor. UF, DOLAR, EURO y UTM vienen en pesos chilenos ('CLP'); el IPC viene en 'pct', porque es la variación mensual en por ciento y no un monto. Lee este campo antes de tratar el número como plata."},"fechaSolicitada":{"type":"string","description":"Eco de la fecha que pediste, para poder compararla sin guardarla tú."},"esArrastre":{"type":"boolean","description":"true = la fecha pedida NO tiene dato propio y este valor viene de una fecha anterior ('fecha'). false = es el valor de esa fecha exacta. Míralo antes de usar el número: un arrastre de un día sobre un fin de semana es normal, uno de tres semanas significa que la fuente está caída."}},"required":["codigo","fecha","valor","unidad","fechaSolicitada","esArrastre"],"additionalProperties":false},"notta__conexion__verificar__Input":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{}},"notta__conexion__verificar__Output":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"verificadoEn":{"type":"string","description":"Instante (ISO 8601) en que el login de prueba terminó bien. Es la única salida de esta tool: recibirla ya significa que la credencial sirve. Si no sirviera, la respuesta sería un error con su código de catálogo, nunca este objeto con un booleano en false."}},"required":["verificadoEn"],"additionalProperties":false},"notta__dte__consultar__Input":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"id":{"type":"string","minLength":1,"description":"El id del documento en Notta: el que devolvió notta.dte.emitir, o el de una fila de notta.dte.listar."}},"required":["id"]},"notta__dte__consultar__Output":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"id":{"type":"string","description":"El identificador del documento en Notta. Es lo que reciben notta.dte.consultar, notta.dte.descargar y notta.dte.reenviar."},"tipo_dte":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"El código de tipo de documento del catálogo del SII. Los que esta conexión emite son 33 (factura afecta), 34 (factura exenta), 56 (nota de débito) y 61 (nota de crédito)."},"folio":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}],"description":"El folio del documento: el correlativo que sale de los folios autorizados (CAF) y con el que el SII lo identifica. Se consume una sola vez y no se reutiliza, así que emitir dos veces por error gasta dos. Viene en null cuando Notta todavía no lo informó."},"estado":{"type":"string","description":"El estado del documento. 'queued' es recién encolado con el folio ya asignado; 'EPR' es aceptado por el SII; 'RPR' y 'aceptado_con_reparos' son aceptado con reparos; 'RFR', 'RCT' y 'RSC' son rechazos terminales que ya no cambian. Decide por este campo, nunca por 'estado_legible'."},"rut_receptor":{"description":"El RUT de quien recibe el documento, sin puntos y con guion. Ausente cuando Notta no lo informó.","type":"string"},"montos":{"type":"object","properties":{"neto":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Suma de las líneas afectas, antes de IVA."},"exento":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Suma de las líneas marcadas con exento en true, que no pagan IVA."},"iva":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"El IVA que corresponde al neto."},"total":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Lo que el receptor debe pagar: neto más exento más IVA."}},"required":["neto","exento","iva","total"],"additionalProperties":false,"description":"Los totales del documento, calculados por Notta a partir de las líneas. Quien emite no los manda."},"sii_env":{"type":"string","description":"El ambiente del SII en el que vive el documento: 'cert' es certificación (pruebas) y 'prod' es producción. Lo decide la credencial de la conexión, nunca la llamada."},"fecha_emision":{"type":"string","description":"La fecha de emisión declarada en el documento, en formato AAAA-MM-DD."},"sii_glosa":{"description":"El texto con que el SII explicó un rechazo. Solo lo trae notta.dte.consultar, y solo cuando el SII dijo algo: la respuesta de la emisión nunca lo lleva.","type":"string"},"estado_legible":{"type":"string","description":"El 'estado' traducido a una frase en español para mostrarle a una persona. Es texto de presentación, no contrato: para decidir usa 'estado'."}},"required":["id","tipo_dte","folio","estado","montos","sii_env","fecha_emision","estado_legible"],"additionalProperties":false},"notta__dte__descargar__Input":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"id":{"type":"string","minLength":1,"description":"El id del documento en Notta: el que devolvió notta.dte.emitir, o el de una fila de notta.dte.listar."},"formato":{"type":"string","enum":["xml","pdf"],"description":"'xml' entrega el XML firmado que se le envió al SII y 'pdf' su representación impresa. Los dos existen recién cuando el documento está firmado."}},"required":["id","formato"]},"notta__dte__descargar__Output":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"contenido_base64":{"type":"string","description":"El archivo completo, codificado en base64. Decodifícalo antes de guardarlo. En una conversación prefiere notta.dte.reenviar: el base64 de un PDF es inmanejable en un chat."},"content_type":{"type":"string","description":"El tipo MIME que Notta declaró para el archivo: application/xml o application/pdf."}},"required":["contenido_base64","content_type"],"additionalProperties":false},"notta__dte__emitir__Input":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"tipo_dte":{"anyOf":[{"type":"number","const":33},{"type":"number","const":34},{"type":"number","const":56},{"type":"number","const":61}],"description":"Qué documento emitir: 33 factura afecta (con IVA), 34 factura exenta, 56 nota de débito, 61 nota de crédito. Una factura (33 o 34) exige forma_pago y el giro, la dirección y la comuna del receptor. Una nota (56 o 61) exige references[] al documento original y rut_emisor, y no lleva forma_pago ni descuento_global."},"receptor":{"type":"object","properties":{"rut":{"type":"string","pattern":"^\\d{1,8}-[\\dkK]$","description":"RUT de quien recibe el documento, sin puntos y con guion antes del dígito verificador. Si el dígito verificador no calza, la emisión se rechaza en validación y no se gasta folio."},"razon_social":{"type":"string","minLength":1,"maxLength":100,"description":"Nombre legal de la empresa o persona que recibe el documento, tal como saldrá impreso."},"giro":{"description":"Giro o actividad económica. OBLIGATORIO para facturas (tipo_dte 33 y 34) por norma del SII de junio 2026; opcional en notas (56/61). Pídeselo al usuario antes de emitir una factura: sin él la llamada se rechaza en validación.","type":"string","maxLength":40},"direccion":{"description":"Dirección del receptor. OBLIGATORIA para facturas (33/34) por norma del SII de junio 2026; opcional en notas (56/61).","type":"string","maxLength":70},"comuna":{"description":"Comuna del receptor. OBLIGATORIA para facturas (33/34) por norma del SII de junio 2026; opcional en notas (56/61).","type":"string","maxLength":20}},"required":["rut","razon_social"],"description":"A quién se le emite el documento. Para una factura (33 o 34) el SII exige además giro, direccion y comuna; una nota (56 o 61) no los pide."},"fecha_emision":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Fecha de emisión del documento, en formato AAAA-MM-DD. Es obligatoria: Notta no la deriva del día en curso."},"items":{"minItems":1,"maxItems":60,"type":"array","items":{"type":"object","properties":{"nombre":{"type":"string","minLength":1,"maxLength":80,"description":"Qué se está cobrando en esta línea, tal como saldrá impreso en el documento."},"cantidad":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Cuántas unidades lleva la línea. Este conector la pide entera y tiene que ser MAYOR QUE CERO, incluso en una nota de crédito por devolución: lo que va en negativo ahí es 'monto_item', nunca la cantidad."},"precio_unitario":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Precio de UNA unidad, sin IVA: el impuesto se calcula después, sobre el total del documento. Este conector lo pide entero y no admite negativos (cero sí)."},"exento":{"type":"boolean","description":"true marca la línea como exenta de IVA; false, como afecta. Una factura exenta (tipo_dte 34) no admite líneas afectas: o todas van con exento en true, o corresponde emitir una 33."},"monto_item":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Total de la línea, sin IVA: cantidad por precio_unitario, ya con el descuento_pct de la línea aplicado. Lo declara quien emite y el SII valida esa relación línea por línea; si no cuadra, la respuesta es un error de validación 'amount_arithmetic'."},"descuento_pct":{"description":"Descuento de ESTA línea, en porcentaje entre 0 y 100. Si lo usas, monto_item tiene que venir ya descontado. Omitirlo equivale a un descuento de cero.","type":"number","minimum":0,"maximum":100}},"required":["nombre","cantidad","precio_unitario","exento","monto_item"]},"description":"Las líneas del documento, entre 1 y 60 (el máximo que admite el SII). Los totales del documento (neto, exento, IVA y total) los calcula Notta a partir de estas líneas: no se mandan."},"forma_pago":{"description":"1=Contado, 2=Crédito, 3=Sin costo. OBLIGATORIO para facturas (tipo_dte 33 y 34); una nota (56/61) no lo lleva. Pregúntaselo al usuario antes de emitir: sin él la llamada se rechaza en validación.","anyOf":[{"type":"number","const":1},{"type":"number","const":2},{"type":"number","const":3}]},"references":{"description":"Los documentos que esta nota corrige o anula. Una nota (56 o 61) exige al menos uno; una factura (33 o 34) no admite ninguno en esta versión, porque sus referencias son de otra clase (orden de compra, contrato, HES) y este conector todavía no las expone.","maxItems":40,"type":"array","items":{"type":"object","properties":{"line_num":{"type":"integer","minimum":1,"maximum":40,"description":"Número de línea de esta referencia dentro del documento, empezando en 1. No se deriva solo: lo declara quien emite, para controlar el orden."},"tipo_doc_ref":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Tipo del documento referenciado, con el código del catálogo del SII (33 factura afecta, 34 factura exenta). Una nota de crédito (61) solo puede referenciar una 33 o una 34."},"folio_ref":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"Folio del documento referenciado, o sea el número del documento que esta nota corrige o anula."},"fecha_ref":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Fecha de emisión del documento referenciado, en formato AAAA-MM-DD."},"cod_ref":{"anyOf":[{"type":"number","const":1},{"type":"number","const":2},{"type":"number","const":3}],"description":"Qué le hace esta nota al documento referenciado: 1 lo anula, 2 corrige su texto (y entonces la nota no puede mover montos) y 3 corrige sus montos. En una nota de débito (56) tiene que calzar con nd_reason."},"razon_ref":{"type":"string","minLength":1,"description":"Por qué se emite esta nota sobre el documento referenciado, en texto libre. Viaja al documento tal cual."}},"required":["line_num","tipo_doc_ref","folio_ref","fecha_ref","cod_ref","razon_ref"]}},"correo_receptor":{"description":"Correo del receptor. Si lo indicas, Notta le envía el PDF y el XML cuando el SII acepta el documento; si no, el documento se emite igual y se puede entregar después con notta.dte.reenviar.","type":"string","maxLength":200,"format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},"descuento_global":{"description":"Descuentos o recargos que aplican al TOTAL del documento, no a una línea. Solo en facturas (33 y 34): una nota (56 o 61) que los lleve se rechaza en validación, porque la ruta de notas de Notta los descartaría en silencio.","type":"array","items":{"type":"object","properties":{"tipo":{"type":"string","enum":["descuento","recargo"],"description":"'descuento' resta del total del documento y 'recargo' se lo suma. El signo lo pone este campo, así que 'valor' va siempre positivo."},"es_porcentaje":{"type":"boolean","description":"true lee 'valor' como un porcentaje; false lo lee como un monto fijo."},"valor":{"type":"number","exclusiveMinimum":0,"description":"Cuánto descontar o recargar, siempre positivo. Se interpreta como porcentaje o como monto fijo según 'es_porcentaje'."},"glosa":{"description":"Texto que explica el descuento o recargo. Viaja al documento tal cual.","type":"string"},"aplica_exento":{"description":"true aplica el ajuste sobre la base EXENTA. Omitirlo o ponerlo en false lo aplica sobre la base AFECTA, o sea mueve el neto antes de que se calcule el IVA.","type":"boolean"}},"required":["tipo","es_porcentaje","valor"]}},"rut_emisor":{"description":"Para notas de débito/crédito (56/61), el RUT emisor de la empresa: el de esta conexión. Las facturas (33/34) lo derivan solas.","type":"string","pattern":"^\\d{1,8}-[\\dkK]$"},"nd_reason":{"description":"Solo para nota de débito (56); el motivo cruza con el cod_ref de la referencia. correccion_monto: sube el monto de una factura ya emitida (cod_ref 3). reposicion_nc_anulada: repone una factura cuya nota de crédito se anuló (cod_ref 2, o 1 para anular la NC). interese_moratorio_contractual: intereses por mora PACTADOS en el contrato (cod_ref 3).","type":"string","enum":["correccion_monto","reposicion_nc_anulada","interese_moratorio_contractual"]}},"required":["tipo_dte","receptor","fecha_emision","items"]},"notta__dte__emitir__Output":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"id":{"type":"string","description":"El identificador del documento en Notta. Es lo que reciben notta.dte.consultar, notta.dte.descargar y notta.dte.reenviar."},"tipo_dte":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"El código de tipo de documento del catálogo del SII. Los que esta conexión emite son 33 (factura afecta), 34 (factura exenta), 56 (nota de débito) y 61 (nota de crédito)."},"folio":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}],"description":"El folio del documento: el correlativo que sale de los folios autorizados (CAF) y con el que el SII lo identifica. Se consume una sola vez y no se reutiliza, así que emitir dos veces por error gasta dos. Viene en null cuando Notta todavía no lo informó."},"estado":{"type":"string","description":"El estado del documento. 'queued' es recién encolado con el folio ya asignado; 'EPR' es aceptado por el SII; 'RPR' y 'aceptado_con_reparos' son aceptado con reparos; 'RFR', 'RCT' y 'RSC' son rechazos terminales que ya no cambian. Decide por este campo, nunca por 'estado_legible'."},"rut_receptor":{"description":"El RUT de quien recibe el documento, sin puntos y con guion. Ausente cuando Notta no lo informó.","type":"string"},"montos":{"type":"object","properties":{"neto":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Suma de las líneas afectas, antes de IVA."},"exento":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Suma de las líneas marcadas con exento en true, que no pagan IVA."},"iva":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"El IVA que corresponde al neto."},"total":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Lo que el receptor debe pagar: neto más exento más IVA."}},"required":["neto","exento","iva","total"],"additionalProperties":false,"description":"Los totales del documento, calculados por Notta a partir de las líneas. Quien emite no los manda."},"sii_env":{"type":"string","description":"El ambiente del SII en el que vive el documento: 'cert' es certificación (pruebas) y 'prod' es producción. Lo decide la credencial de la conexión, nunca la llamada."},"fecha_emision":{"type":"string","description":"La fecha de emisión declarada en el documento, en formato AAAA-MM-DD."},"sii_glosa":{"description":"El texto con que el SII explicó un rechazo. Solo lo trae notta.dte.consultar, y solo cuando el SII dijo algo: la respuesta de la emisión nunca lo lleva.","type":"string"},"estado_legible":{"type":"string","description":"El 'estado' traducido a una frase en español para mostrarle a una persona. Es texto de presentación, no contrato: para decidir usa 'estado'."}},"required":["id","tipo_dte","folio","estado","montos","sii_env","fecha_emision","estado_legible"],"additionalProperties":false},"notta__dte__listar__Input":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"limite":{"description":"Cuántos documentos traer, entre 1 y 100; si se omite, Notta trae 20. Es el único filtro que el API ofrece: no hay filtro por tipo, fecha, estado ni receptor, así que para encontrar uno concreto pide más y descarta tú.","type":"integer","minimum":1,"maximum":100}}},"notta__dte__listar__Output":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"dtes":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"El identificador del documento en Notta. Es lo que reciben notta.dte.consultar, notta.dte.descargar y notta.dte.reenviar."},"tipo_dte":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"El código de tipo de documento del catálogo del SII. Los que esta conexión emite son 33 (factura afecta), 34 (factura exenta), 56 (nota de débito) y 61 (nota de crédito)."},"folio":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}],"description":"El folio del documento: el correlativo que sale de los folios autorizados (CAF) y con el que el SII lo identifica. Se consume una sola vez y no se reutiliza, así que emitir dos veces por error gasta dos. Viene en null cuando Notta todavía no lo informó."},"estado":{"type":"string","description":"El estado del documento. 'queued' es recién encolado con el folio ya asignado; 'EPR' es aceptado por el SII; 'RPR' y 'aceptado_con_reparos' son aceptado con reparos; 'RFR', 'RCT' y 'RSC' son rechazos terminales que ya no cambian. Decide por este campo, nunca por 'estado_legible'."},"estado_legible":{"type":"string","description":"El 'estado' traducido a una frase en español para mostrarle a una persona. Es texto de presentación, no contrato: para decidir usa 'estado'."},"monto_total":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}],"description":"El total del documento. Viene en null cuando Notta no lo informó, que no es lo mismo que un documento por cero."},"fecha_emision":{"type":"string","description":"La fecha de emisión declarada en el documento, en formato AAAA-MM-DD."},"rut_receptor":{"description":"El RUT de quien recibe el documento, sin puntos y con guion. Ausente cuando Notta no lo informó.","type":"string"}},"required":["id","tipo_dte","folio","estado","estado_legible","monto_total","fecha_emision"],"additionalProperties":false},"description":"Los documentos, del más nuevo al más antiguo. Traen menos campos que notta.dte.consultar: sin neto, exento, IVA ni ambiente del SII."}},"required":["dtes"],"additionalProperties":false},"notta__dte__reenviar__Input":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"id":{"type":"string","minLength":1,"description":"El id del documento en Notta: el que devolvió notta.dte.emitir, o el de una fila de notta.dte.listar."},"correo_receptor":{"description":"A qué dirección enviarlo. Si la indicas, Notta manda el documento ahí y la recuerda para la próxima. Si la omites, usa el correo que el documento ya tiene guardado; si no tiene ninguno, la llamada responde un error de validación pidiéndolo.","type":"string","maxLength":200,"format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"}},"required":["id"]},"notta__dte__reenviar__Output":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"reenviado":{"type":"boolean","description":"Siempre true: recibir esta respuesta ya significa que Notta aceptó el reenvío. Un fallo llega como un error con su código de catálogo, nunca como false."},"correo_receptor":{"description":"La dirección a la que se envió, cuando se pudo saber cuál fue. Ausente si no se indicó una en la llamada y Notta tampoco la informó.","type":"string"}},"required":["reenviado"],"additionalProperties":false},"previred__certificados__consultar__Input":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"rutTrabajador":{"type":"string","pattern":"^\\d{1,8}-[\\dkK]$","description":"Filtra por UN trabajador. El RUT va sin puntos y con guion antes del dígito verificador: se guarda cifrado y el filtro corre sobre un índice ciego, así que solo calza escrito exactamente en esa forma."},"cursor":{"description":"Continúa desde donde quedó la página anterior: reenvía tal cual el 'cursor' que vino en la respuesta. Es opaco, así que nunca lo construyas a mano. Sin él, la consulta empieza por el principio.","type":"string"},"limit":{"default":100,"description":"Cuántas filas traer como máximo, entre 1 y 500. Si se omite, 100.","type":"integer","minimum":1,"maximum":500}}},"previred__certificados__consultar__Output":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"certificados":{"type":"array","items":{"type":"object","properties":{"rutTrabajador":{"type":"string","description":"El RUT del trabajador al que pertenece el certificado, sin puntos y con guion."},"nombreTrabajador":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"El nombre del trabajador según Previred, o null si el portal no lo trajo."},"periodoDesde":{"type":"string","description":"Primer mes que cubre el certificado, en formato AAAA-MM. No lo elige quien llama: el conector usa la ventana más ancha que Previred admite, terminando en el período que se sincronizó."},"periodoHasta":{"type":"string","description":"Último mes que cubre el certificado, en formato AAAA-MM: el período que se sincronizó."},"bytes":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Tamaño del PDF en bytes."},"certificadoUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Enlace firmado de vida corta para descargar el PDF del certificado, o null si todavía no se ha emitido. Caduca a los pocos minutos y no sirve para compartir."},"syncedAt":{"type":"string","description":"Cuándo se guardó esta fila en Connect (ISO 8601). Dice qué tan fresca está la caché: si la última sincronización es vieja, lo que falta puede existir en Previred y todavía no haberse traído."}},"required":["rutTrabajador","nombreTrabajador","periodoDesde","periodoHasta","bytes","certificadoUrl","syncedAt"],"additionalProperties":false},"description":"Los certificados guardados: hay uno vigente por trabajador, y cada sincronización lo reemplaza por uno más nuevo en vez de acumular uno por mes."},"cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Cuando no es null quedan más filas: reenvíalo tal cual en 'cursor' para pedir la página siguiente. En null significa que esta fue la última."}},"required":["certificados","cursor"],"additionalProperties":false},"previred__conexion__sincronizar__Input":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"periodo":{"type":"string","pattern":"^\\d{4}-\\d{2}$","description":"El mes que se va a sincronizar, en formato AAAA-MM y en calendario chileno (por ejemplo '2026-07'). Traer varios meses son varias llamadas, una por mes."},"alcances":{"minItems":1,"type":"array","items":{"type":"string","enum":["planillas","cotizaciones","deuda","f301","certificados","empresas"]},"description":"Qué módulos de datos traer en esta corrida, al menos uno. Todos se sincronizan sobre UNA sola sesión (un login, un logout), así que pedir varios en una llamada cuesta menos que llamar una vez por cada uno. Un alcance debe estar habilitado en la conexión; si no lo está, la llamada responde 'alcance_not_enabled'."}},"required":["periodo","alcances"]},"previred__conexion__sincronizar__Output":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"periodo":{"type":"string","description":"Eco del período que se pidió, para poder correlacionar la respuesta sin guardarlo tú."},"results":{"type":"array","items":{"type":"object","properties":{"alcance":{"type":"string","description":"Cuál de los alcances pedidos describe esta fila. Hay una fila por alcance solicitado, en el orden canónico del conector, no en el orden en que los pediste."},"status":{"type":"string","enum":["ok","failed"],"description":"'ok' = el alcance terminó bien; que 'recordsSynced' sea 0 no lo vuelve un fallo. 'failed' = no terminó bien, y la causa va en 'error'. Ojo con un 'failed': NO garantiza que no se haya escrito nada. Cuando el sistema externo trunca un listado, el alcance queda 'failed' con las filas que alcanzó en 'recordsSynced'. Mira siempre las dos cosas juntas. Y revisa fila por fila: un alcance puede fallar mientras los otros de la misma corrida terminan bien."},"recordsSynced":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Cuántos registros de este alcance escribió ESTA corrida. Es el trabajo de esta llamada, no el total acumulado que tienes guardado: para saber cuánto hay, consulta. Un 0 no significa por sí solo «no hay datos»; cuando el cero tiene una explicación, viene en 'detalle'."},"error":{"description":"Por qué este alcance no terminó bien. Presente solo cuando 'status' es 'failed'. Normalmente es un código del catálogo de errores; cuando el sistema externo truncó el listado es una etiqueta de resultado ('movimientos_truncated', 'cartolas_truncated') que no está en ese catálogo y que significa «se escribió lo que alcanzó a venir». Decide por el valor, nunca por el texto libre.","type":"string"},"detalle":{"description":"Explicación en lenguaje llano, presente solo cuando el resultado necesita una. Existe para que un cero se pueda transmitir tal cual en vez de concluir «no hay datos»: transmítelo a quien pregunte en lugar de resumir el número solo.","type":"string"}},"required":["alcance","status","recordsSynced"],"additionalProperties":false},"description":"El resultado de cada alcance por separado: una fila por cada uno de los que pediste."}},"required":["periodo","results"],"additionalProperties":false},"previred__conexion__verificar__Input":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{}},"previred__conexion__verificar__Output":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"verificadoEn":{"type":"string","description":"Instante (ISO 8601) en que el login de prueba terminó bien. Es la única salida de esta tool: recibirla ya significa que la credencial sirve. Si no sirviera, la respuesta sería un error con su código de catálogo, nunca este objeto con un booleano en false."}},"required":["verificadoEn"],"additionalProperties":false},"previred__cotizaciones__consultar__Input":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"periodo":{"type":"string","pattern":"^\\d{4}-\\d{2}$","description":"Filtra por un mes, en formato AAAA-MM. Sin él, la consulta trae todas las filas guardadas de esta conexión."},"rutTrabajador":{"type":"string","pattern":"^\\d{1,8}-[\\dkK]$","description":"Filtra por UN trabajador. El RUT va sin puntos y con guion antes del dígito verificador: se guarda cifrado y el filtro corre sobre un índice ciego, así que solo calza escrito exactamente en esa forma."},"cursor":{"description":"Continúa desde donde quedó la página anterior: reenvía tal cual el 'cursor' que vino en la respuesta. Es opaco, así que nunca lo construyas a mano. Sin él, la consulta empieza por el principio.","type":"string"},"limit":{"default":100,"description":"Cuántas filas traer como máximo, entre 1 y 500. Si se omite, 100.","type":"integer","minimum":1,"maximum":500}}},"previred__cotizaciones__consultar__Output":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"cotizaciones":{"type":"array","items":{"type":"object","properties":{"rutTrabajador":{"type":"string","description":"El RUT del trabajador, sin puntos y con guion."},"nombreTrabajador":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"El nombre del trabajador tal como lo informa el comprobante, o null si no venía."},"periodo":{"type":"string","description":"El mes de remuneraciones al que corresponde la cotización, en formato AAAA-MM. No es el mes en que se pagó: eso lo dice la fecha de pago de su planilla, que cae al mes siguiente."},"institucion":{"type":"string","description":"La institución previsional, con el nombre que le da Previred (la AFP, Fonasa o la isapre, el seguro de cesantía, la mutual, la caja de compensación)."},"tipoInstitucion":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"La familia de la institución, que es el eje por el que Previred agrupa y filtra (por ejemplo 'AFP' o 'MUTUAL'). null cuando el portal no la informó."},"rentaImponible":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"La renta imponible sobre la que se calculó ESTA cotización, en pesos. Un mismo trabajador y mes tienen una renta imponible distinta por institución, cada una con su propio tope: no las sumes ni las trates como el sueldo. null cuando el comprobante no traía el dato."},"montoCotizacion":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Lo cotizado a esa institución en el período, en pesos. null cuando el comprobante no traía el dato."},"diasTrabajados":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}],"description":"Días trabajados informados en el período. Solo algunas instituciones los declaran (lo hace el Seguro Social y las demás no), así que en la mayoría de las filas viene null: eso es lo que dice el comprobante, no un hueco."},"folio":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"El folio de la planilla que incluye esta cotización: el puente hacia previred.planillas.consultar. null cuando no se pudo determinar."}},"required":["rutTrabajador","nombreTrabajador","periodo","institucion","tipoInstitucion","rentaImponible","montoCotizacion","diasTrabajados","folio"],"additionalProperties":false},"description":"Las cotizaciones guardadas. Un mismo trabajador y mes traen varias filas, una por institución."},"cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Cuando no es null quedan más filas: reenvíalo tal cual en 'cursor' para pedir la página siguiente. En null significa que esta fue la última."}},"required":["cotizaciones","cursor"],"additionalProperties":false},"previred__deuda__consultar__Input":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"periodo":{"type":"string","pattern":"^\\d{4}-\\d{2}$","description":"Filtra por un mes, en formato AAAA-MM. Sin él, la consulta trae todas las filas guardadas de esta conexión."},"tipo":{"type":"string","enum":["dnp","por_pagar"],"description":"Filtra una de las dos mitades de la deuda: 'dnp' son las declaraciones sin pago y 'por_pagar' las nóminas cuyo plazo todavía corre. Sin él, trae las dos."},"cursor":{"description":"Continúa desde donde quedó la página anterior: reenvía tal cual el 'cursor' que vino en la respuesta. Es opaco, así que nunca lo construyas a mano. Sin él, la consulta empieza por el principio.","type":"string"},"limit":{"default":100,"description":"Cuántas filas traer como máximo, entre 1 y 500. Si se omite, 100.","type":"integer","minimum":1,"maximum":500}}},"previred__deuda__consultar__Output":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"deudas":{"type":"array","items":{"type":"object","properties":{"periodo":{"type":"string","description":"El mes de remuneraciones al que corresponde la deuda, en formato AAAA-MM."},"institucion":{"type":"string","description":"La institución a la que se le debe, con el nombre que le da Previred. En una fila 'por_pagar' dice 'Todas': esa pantalla da un total por nómina sin desglosarlo por institución."},"tipo":{"type":"string","enum":["dnp","por_pagar"],"description":"'dnp' es una declaración sin pago: la empresa declaró lo que debía y no lo pagó, y la fila trae su institución y sus cargos legales. 'por_pagar' es una nómina cuyo plazo todavía corre y aún no se paga; ahí solo llega 'montoTotal'. El plazo vence el día 13 del mes siguiente al de las remuneraciones, así que una fila 'por_pagar' más vieja que eso ya es deuda aunque Previred no la haya movido."},"montoNominal":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Lo adeudado sin reajustes ni multas, en pesos. Viene en null en las filas 'por_pagar', porque esa pantalla no desglosa el total."},"cargosLegales":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Reajustes, intereses y multas acumulados, en pesos. Previred los recalcula según la fecha en que se pague, así que es el valor del momento en que se sincronizó. Viene en null en las filas 'por_pagar'."},"montoTotal":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Lo adeudado con sus cargos legales incluidos, en pesos. Es el valor del momento en que se sincronizó (lo dice 'observadoEn') y no una cifra a la que se pueda comprometer nadie: Previred lo recalcula según la fecha de pago."},"observadoEn":{"type":"string","description":"Instante (ISO 8601) en que se observó esta deuda. Importa porque 'montoTotal' se mueve con el tiempo: un total viejo ya no es el que hay que pagar."}},"required":["periodo","institucion","tipo","montoNominal","cargosLegales","montoTotal","observadoEn"],"additionalProperties":false},"description":"Las filas de deuda guardadas, de las dos mitades ('dnp' y 'por_pagar'). Una lista vacía después de un sync exitoso sí es informativa: significa que Previred no reporta nada pendiente."},"cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Cuando no es null quedan más filas: reenvíalo tal cual en 'cursor' para pedir la página siguiente. En null significa que esta fue la última."}},"required":["deudas","cursor"],"additionalProperties":false},"previred__empresas__consultar__Input":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"rut":{"type":"string","pattern":"^\\d{1,8}-[\\dkK]$","description":"Filtra por el RUT de la EMPRESA, no el de un trabajador. Va sin puntos y con guion antes del dígito verificador."},"cursor":{"description":"Continúa desde donde quedó la página anterior: reenvía tal cual el 'cursor' que vino en la respuesta. Es opaco, así que nunca lo construyas a mano. Sin él, la consulta empieza por el principio.","type":"string"},"limit":{"default":100,"description":"Cuántas filas traer como máximo, entre 1 y 500. Si se omite, 100.","type":"integer","minimum":1,"maximum":500}}},"previred__empresas__consultar__Output":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"empresas":{"type":"array","items":{"type":"object","properties":{"rut":{"type":"string","description":"El RUT de la empresa, sin puntos y con guion."},"razonSocial":{"type":"string","description":"El nombre legal de la empresa, según Previred."},"codDivision":{"type":"string","description":"La división dentro de la empresa, que Previred trata como parte de la selección. '00' es la empresa sin divisiones, que es el caso general."},"syncedAt":{"type":"string","description":"Cuándo se guardó esta fila en Connect (ISO 8601). Dice qué tan fresca está la caché: si la última sincronización es vieja, lo que falta puede existir en Previred y todavía no haberse traído."}},"required":["rut","razonSocial","codDivision","syncedAt"],"additionalProperties":false},"description":"Las empresas que la credencial de esta conexión administra en Previred. Ver una empresa aquí no es poder leer sus datos: cada conexión de Connect es UNA empresa, y para las demás hay que crear su propia conexión."},"cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Cuando no es null quedan más filas: reenvíalo tal cual en 'cursor' para pedir la página siguiente. En null significa que esta fue la última."}},"required":["empresas","cursor"],"additionalProperties":false},"previred__f301__consultar__Input":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"periodo":{"type":"string","pattern":"^\\d{4}-\\d{2}$","description":"Filtra por un mes, en formato AAAA-MM. Sin él, la consulta trae todas las filas guardadas de esta conexión."},"cursor":{"description":"Continúa desde donde quedó la página anterior: reenvía tal cual el 'cursor' que vino en la respuesta. Es opaco, así que nunca lo construyas a mano. Sin él, la consulta empieza por el principio.","type":"string"},"limit":{"default":100,"description":"Cuántas filas traer como máximo, entre 1 y 500. Si se omite, 100.","type":"integer","minimum":1,"maximum":500}}},"previred__f301__consultar__Output":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"archivos":{"type":"array","items":{"type":"object","properties":{"periodo":{"type":"string","description":"El período que cubre el archivo, en formato AAAA-MM."},"nomina":{"type":"string","description":"El nombre que la nómina tiene en Previred. Es lo que distingue dos archivos del mismo período."},"centroCosto":{"type":"string","description":"'total' significa Total Empresa, que es lo único que este conector emite hoy. Está en la respuesta porque Previred también permite emitir el archivo por centro de costo, y ese sería otro archivo."},"trabajadores":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Cuántos trabajadores informa el archivo, una línea por cada uno."},"bytes":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Tamaño del archivo en bytes."},"archivoUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Enlace firmado de vida corta para descargar el archivo y subirlo al sitio de la Dirección del Trabajo, o null si todavía no se ha descargado. Caduca a los pocos minutos y no sirve para compartir: el archivo trae el RUT, el nombre y la renta de cada trabajador."},"syncedAt":{"type":"string","description":"Cuándo se guardó esta fila en Connect (ISO 8601). Dice qué tan fresca está la caché: si la última sincronización es vieja, lo que falta puede existir en Previred y todavía no haberse traído."}},"required":["periodo","nomina","centroCosto","trabajadores","bytes","archivoUrl","syncedAt"],"additionalProperties":false},"description":"Los archivos guardados. Cada uno cubre UNA nómina de un período, así que un período con dos nóminas trae dos filas."},"cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Cuando no es null quedan más filas: reenvíalo tal cual en 'cursor' para pedir la página siguiente. En null significa que esta fue la última."}},"required":["archivos","cursor"],"additionalProperties":false},"previred__planillas__consultar__Input":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"periodo":{"type":"string","pattern":"^\\d{4}-\\d{2}$","description":"Filtra por un mes, en formato AAAA-MM. Sin él, la consulta trae todas las filas guardadas de esta conexión."},"institucion":{"type":"string","description":"Filtra por institución previsional, con el nombre exacto que trae el campo 'institucion' de las filas. Sin él, trae todas."},"cursor":{"description":"Continúa desde donde quedó la página anterior: reenvía tal cual el 'cursor' que vino en la respuesta. Es opaco, así que nunca lo construyas a mano. Sin él, la consulta empieza por el principio.","type":"string"},"limit":{"default":100,"description":"Cuántas filas traer como máximo, entre 1 y 500. Si se omite, 100.","type":"integer","minimum":1,"maximum":500}}},"previred__planillas__consultar__Output":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"planillas":{"type":"array","items":{"type":"object","properties":{"folio":{"type":"string","description":"El identificador que Previred le da a la planilla, y con el que el portal la direcciona. Son 16 dígitos y es opaco: no lo descompongas, porque los folios reales no siguen un patrón parejo."},"periodo":{"type":"string","description":"El mes de remuneraciones que paga esta planilla, en formato AAAA-MM."},"institucion":{"type":"string","description":"La institución previsional, con el nombre que le da Previred (la AFP, Fonasa o la isapre, el seguro de cesantía, la mutual, la caja de compensación)."},"tipoInstitucion":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"La familia de la institución, que es el eje por el que Previred agrupa y filtra (por ejemplo 'AFP' o 'MUTUAL'). null cuando el portal no la informó."},"idNomina":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Identificador de la nómina dentro del período. Una empresa puede tener varias en el mismo mes, así que agrupar solo por período las mezcla."},"montoPagado":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Lo pagado a esa institución, en pesos. null cuando el portal no trajo la celda, nunca 0: un 0 es un monto real y confundirlos mentiría sobre la plata."},"fechaPago":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Cuándo se pagó la planilla, según el comprobante. null cuando el portal no lo informó."},"afiliadosInformados":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}],"description":"Cuántos trabajadores informa esta planilla. null cuando el portal no trajo el dato."},"comprobanteUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Enlace firmado de vida corta al comprobante de pago en PDF, o null si todavía no se ha descargado (la planilla vale igual y el próximo sync lo reintenta). Caduca a los pocos minutos y no sirve para compartir: el documento trae el RUT, el nombre y la renta de los trabajadores."}},"required":["folio","periodo","institucion","tipoInstitucion","idNomina","montoPagado","fechaPago","afiliadosInformados","comprobanteUrl"],"additionalProperties":false},"description":"Las planillas guardadas, de la más reciente a la más antigua. Un pago de un período se abre en varias planillas, una por institución previsional: varias filas del mismo período es lo normal, no una duplicación."},"cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Cuando no es null quedan más filas: reenvíalo tal cual en 'cursor' para pedir la página siguiente. En null significa que esta fue la última."}},"required":["planillas","cursor"],"additionalProperties":false},"sii__boletas_honorarios__consultar__Input":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"periodo":{"type":"string","pattern":"^\\d{4}-\\d{2}$","description":"Un mes, en formato AAAA-MM y en calendario chileno (por ejemplo '2026-07'). Cada sitio de uso afina qué significa ahí: en una sincronización es el mes que se va a traer, y en una consulta a la caché es el filtro. Esta descripción base existe para que el campo nunca llegue pelado a quien lee el contrato."},"perspectiva":{"description":"emitidas = las que emitió esta empresa; recibidas = las que le emitieron, donde esta empresa es el agente retenedor. Sin este filtro vienen las dos.","type":"string","enum":["emitidas","recibidas"]},"cursor":{"description":"Paginación: el valor que devolvió la respuesta anterior, tal cual.","type":"string"},"limit":{"default":100,"description":"Filas por página.","type":"integer","minimum":1,"maximum":500}}},"sii__boletas_honorarios__consultar__Output":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"documentos":{"type":"array","items":{"type":"object","properties":{"folio":{"type":"string","description":"El número de la boleta, tal cual lo manda el SII y como texto: puede traer ceros a la izquierda o no ser numérico, y no se normaliza."},"perspectiva":{"type":"string","enum":["emitidas","recibidas"],"description":"emitidas = las boletas que emitió esta empresa; recibidas = las que le emitieron, donde esta empresa es el agente retenedor."},"periodo":{"type":"string","description":"El período tributario de la boleta, en formato AAAA-MM."},"fechaBoleta":{"type":"string","description":"La fecha de la boleta tal cual la manda el SII, en formato DD/MM/AAAA. Para ordenar o comparar usa 'fechaBoletaDate'."},"fechaBoletaDate":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"La misma fecha en formato AAAA-MM-DD, o 'null' si no se pudo parsear."},"razonSocialContraparte":{"type":"string","description":"El nombre o razón social del otro lado: en 'recibidas' es el profesional que emitió, en 'emitidas' es el receptor."},"codigoBarras":{"type":"string","description":"El código de barras con que el SII identifica la boleta. Es único por boleta dentro del informe."},"honorariosBrutos":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"El honorario bruto en pesos chilenos: lo facturado antes de descontar la retención."},"retencionEmisor":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"La retención declarada por el propio emisor, en pesos chilenos. En 'recibidas' llega siempre en 0 porque ese informe no expone el campo: ahí la retención que importa es 'retencionReceptor'."},"retencionReceptor":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"La retención que hizo el receptor como agente retenedor, en pesos chilenos. Su suma es el insumo para cuadrar el código 151 del F29, no el código 151 en sí."},"honorariosLiquidos":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Lo que recibe el profesional: el bruto menos la retención, en pesos chilenos."},"estado":{"type":"string","description":"El código de estado tal cual lo manda el SII: 'N' vigente, 'S' anulada, 'V' anulación pendiente, 'R' y 'U' observadas. El filtro tributario correcto es 'estado' distinto de 'S', porque 'V', 'R' y 'U' siguen vigentes."},"estadoNormalizado":{"type":"string","enum":["vigente","anulada","vigente_anulacion_pendiente","observada_receptor","observada_unidad","desconocido"],"description":"El mismo estado traducido a un enum estable. No lo uses para filtrar lo vigente: 'vigente_anulacion_pendiente', 'observada_receptor' y 'observada_unidad' también lo están. Un código que no reconocemos sale 'desconocido' y nunca se omite de un cómputo."},"esSocProfesional":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Si el emisor es una sociedad de profesionales, tal cual lo manda el SII. Es texto crudo, no un booleano, y puede venir 'null'."},"fechaEventoEstado":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Cuándo el SII registró el evento que dejó la boleta en su estado actual. Cubre anulación, solicitud de anulación y observación, no sólo la anulación. 'null' mientras no hubo evento."},"fechaEventoEstadoDate":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"La misma fecha en formato AAAA-MM-DD, o 'null' si no vino o no se pudo parsear."},"rutContraparte":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"El RUT del otro lado: en 'recibidas' es el profesional que emitió y en 'emitidas' es el receptor. 'null' cuando la boleta se emitió sin receptor, que el SII permite."},"ultimaLecturaEn":{"type":"string","description":"Cuándo se observó esta fila por última vez, en ISO 8601 UTC. Una boleta de honorarios es mutable hasta el 1 de marzo del año siguiente: si esta marca es vieja, resincroniza el período antes de decidir sobre su estado."}},"required":["folio","perspectiva","periodo","fechaBoleta","fechaBoletaDate","razonSocialContraparte","codigoBarras","honorariosBrutos","retencionEmisor","retencionReceptor","honorariosLiquidos","estado","estadoNormalizado","esSocProfesional","fechaEventoEstado","fechaEventoEstadoDate","rutContraparte","ultimaLecturaEn"],"additionalProperties":false},"description":"Las boletas de honorarios que calzan con el filtro, una por fila. Sale de la caché ya sincronizada, nunca de una consulta en vivo al SII."},"cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"El cursor de la página siguiente, opaco. 'null' significa que no hay más filas; cualquier otro valor se reenvía tal cual en 'cursor' de la próxima llamada y nunca se construye a mano."},"sincronizacion":{"anyOf":[{"type":"object","properties":{"sincronizadoEn":{"type":"string","description":"Cuándo terminó la última sincronización de este período, en ISO 8601 UTC. Es la frescura del dato que estás leyendo."},"completo":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"'true' = el período se sincronizó entero. 'false' = quedaron casillas sin traer, así que puede faltar información. 'null' = no se puede saber, porque no hay registro de ese intento."},"incompletos":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}],"description":"Cuántas casillas quedaron sin traer en esa sincronización. 'null' cuando no se puede saber."},"fueraDeVentana":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}],"description":"Sólo aplica a guías: cuántas direcciones cayeron fuera de la ventana de 6 meses que el SII conserva. Un 0 dice que se verificó y no aplicó; 'null', que no aplica o no se conoce."},"perspectivasFallidas":{"type":"array","items":{"type":"object","properties":{"perspectiva":{"type":"string","enum":["emitidas","recibidas"],"description":"Qué lado falló: 'emitidas' son las que emitió esta empresa y 'recibidas' las que le emitieron."},"code":{"type":"string","description":"El código del catálogo de errores que explica por qué falló ese lado. Decide por el código, nunca por el texto."}},"required":["perspectiva","code"],"additionalProperties":false},"description":"Qué direcciones fallaron enteras en esa sincronización, con su código de error. Hoy sólo la puebla el alcance de boletas de honorarios; para los demás llega vacía."}},"required":["sincronizadoEn","completo","incompletos","fueraDeVentana","perspectivasFallidas"],"additionalProperties":false},{"type":"null"}],"description":"Completitud del último sync del período consultado. Es 'null' por DOS motivos distintos, y ninguno significa que las filas devueltas sean inválidas: (a) la consulta no filtró por 'periodo', así que no hay un sync único al que mirar (pide un 'periodo' concreto para obtener el bloque); o (b) ese período nunca se sincronizó. Un 'null' junto a una lista CON documentos es siempre el caso (a)."}},"required":["documentos","cursor","sincronizacion"],"additionalProperties":false},"sii__boletas__consultar__Input":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"periodo":{"type":"string","pattern":"^\\d{4}-\\d{2}$","description":"Un mes, en formato AAAA-MM y en calendario chileno (por ejemplo '2026-07'). Cada sitio de uso afina qué significa ahí: en una sincronización es el mes que se va a traer, y en una consulta a la caché es el filtro. Esta descripción base existe para que el campo nunca llegue pelado a quien lee el contrato."},"cursor":{"description":"Paginación: el valor que devolvió la respuesta anterior, tal cual.","type":"string"},"limit":{"default":100,"description":"Filas por página.","type":"integer","minimum":1,"maximum":500}}},"sii__boletas__consultar__Output":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"documentos":{"type":"array","items":{"type":"object","properties":{"period":{"type":"string","description":"El período tributario del agregado, en formato AAAA-MM."},"documentType":{"type":"string","description":"Tipo de boleta, como texto: '39' es la boleta afecta y '41' la exenta."},"day":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"El día del mes que resume esta fila. Cada fila es el agregado de un día y un tipo de boleta, nunca una boleta individual."},"date":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"El mismo día en formato AAAA-MM-DD, o 'null' si el SII mandó un día fuera de rango."},"totalDocumentos":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}],"description":"Cuántas boletas de ese tipo se emitieron ese día. 'null' significa que el SII no informó el conteo, distinto de un 0 informado."},"netAmount":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Monto neto del día en pesos chilenos, entero."},"exemptAmount":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Monto exento del día en pesos chilenos, entero."},"vatAmount":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"IVA del día en pesos chilenos, entero."},"totalAmount":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Monto total del día en pesos chilenos, entero."},"currency":{"type":"string","description":"Siempre 'CLP': este resumen del SII sólo viene en pesos chilenos."},"channel":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Canal de venta: 'presencial' o 'internet'. 'null' cuando el SII no desglosa por canal, que es lo habitual en boletas 39 y 41."}},"required":["period","documentType","day","date","totalDocumentos","netAmount","exemptAmount","vatAmount","totalAmount","currency","channel"],"additionalProperties":false},"description":"El resumen diario de boletas electrónicas que calza con el filtro. Cada fila es el agregado de un día y un tipo de boleta (39 afecta, 41 exenta), nunca una boleta individual. Los montos son enteros en pesos chilenos, y un monto que el SII no informó llega como 0, no como 'null'."},"cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"El cursor de la página siguiente, opaco. 'null' significa que no hay más filas; cualquier otro valor se reenvía tal cual en 'cursor' de la próxima llamada y nunca se construye a mano."},"sincronizacion":{"anyOf":[{"type":"object","properties":{"sincronizadoEn":{"type":"string","description":"Cuándo terminó la última sincronización de este período, en ISO 8601 UTC. Es la frescura del dato que estás leyendo."},"completo":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"'true' = el período se sincronizó entero. 'false' = quedaron casillas sin traer, así que puede faltar información. 'null' = no se puede saber, porque no hay registro de ese intento."},"incompletos":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}],"description":"Cuántas casillas quedaron sin traer en esa sincronización. 'null' cuando no se puede saber."},"fueraDeVentana":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}],"description":"Sólo aplica a guías: cuántas direcciones cayeron fuera de la ventana de 6 meses que el SII conserva. Un 0 dice que se verificó y no aplicó; 'null', que no aplica o no se conoce."},"perspectivasFallidas":{"type":"array","items":{"type":"object","properties":{"perspectiva":{"type":"string","enum":["emitidas","recibidas"],"description":"Qué lado falló: 'emitidas' son las que emitió esta empresa y 'recibidas' las que le emitieron."},"code":{"type":"string","description":"El código del catálogo de errores que explica por qué falló ese lado. Decide por el código, nunca por el texto."}},"required":["perspectiva","code"],"additionalProperties":false},"description":"Qué direcciones fallaron enteras en esa sincronización, con su código de error. Hoy sólo la puebla el alcance de boletas de honorarios; para los demás llega vacía."}},"required":["sincronizadoEn","completo","incompletos","fueraDeVentana","perspectivasFallidas"],"additionalProperties":false},{"type":"null"}],"description":"Completitud del último sync del período consultado. Es 'null' por DOS motivos distintos, y ninguno significa que las filas devueltas sean inválidas: (a) la consulta no filtró por 'periodo', así que no hay un sync único al que mirar (pide un 'periodo' concreto para obtener el bloque); o (b) ese período nunca se sincronizó. Un 'null' junto a una lista CON documentos es siempre el caso (a)."}},"required":["documentos","cursor","sincronizacion"],"additionalProperties":false},"sii__conexion__sincronizar__Input":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"periodo":{"type":"string","pattern":"^\\d{4}-\\d{2}$","description":"El mes que se va a sincronizar, en formato AAAA-MM y en calendario chileno (por ejemplo '2026-07'). Traer varios meses son varias llamadas, una por mes."},"alcances":{"minItems":1,"type":"array","items":{"type":"string","enum":["rcv","boletas","guias","boletas_honorarios","documentos"]},"description":"Qué módulos de datos traer en esta corrida, al menos uno. Todos se sincronizan sobre UNA sola sesión (un login, un logout), así que pedir varios en una llamada cuesta menos que llamar una vez por cada uno. Un alcance debe estar habilitado en la conexión; si no lo está, la llamada responde 'alcance_not_enabled'."}},"required":["periodo","alcances"]},"sii__conexion__sincronizar__Output":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"periodo":{"type":"string","description":"Eco del período que se pidió, para poder correlacionar la respuesta sin guardarlo tú."},"results":{"type":"array","items":{"type":"object","properties":{"alcance":{"type":"string","description":"Cuál de los alcances pedidos describe esta fila. Hay una fila por alcance solicitado, en el orden canónico del conector, no en el orden en que los pediste."},"status":{"type":"string","enum":["ok","partial","failed"],"description":"'ok' = el alcance terminó bien; que 'recordsSynced' sea 0 no lo vuelve un fallo. 'partial' = trajo datos pero alguna casilla quedó incompleta, y 'incompletos' dice cuántas: lo sincronizado sirve, y reintentar el mismo período más tarde puede completarlo. 'failed' = no terminó bien, y la causa va en 'error'; mira igual 'recordsSynced', porque un 'failed' no garantiza que no se haya escrito nada. Y revisa fila por fila: un alcance puede fallar mientras los otros de la misma corrida terminan bien."},"recordsSynced":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Cuántos registros de este alcance escribió ESTA corrida. Es el trabajo de esta llamada, no el total acumulado que tienes guardado: para saber cuánto hay, consulta. Un 0 no significa por sí solo «no hay datos»; cuando el cero tiene una explicación, viene en 'detalle'."},"incompletos":{"description":"Cuántas casillas de este alcance quedaron sin traer. Es lo que vuelve 'partial' al status: lo sincronizado sirve, y reintentar el mismo período más tarde puede completarlo. Una casilla legítimamente vacía no cuenta.","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"completo":{"description":"'true' sólo si ninguna casilla de este alcance falló. No alcanza por sí solo para dar el período por cerrado: revísalo junto con 'reconMismatches' y 'filasDescartadas', porque un documento puede faltar por esas dos vías sin que 'completo' se entere.","type":"boolean"},"reconMismatches":{"description":"Veces que las filas del detalle no coincidieron con el total que el resumen del SII declaraba. Es observabilidad y no detiene el sync, pero un valor distinto de 0 dice que el período puede estar incompleto.","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"dedupCollisions":{"description":"Cuántas filas llegaron repetidas dentro de esta misma corrida (misma clave natural) y se colapsaron en una. No se cuentan dos veces en 'recordsSynced'.","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"filasDescartadas":{"description":"Filas que llegaron con una forma inesperada (sin tipo ni folio resoluble) y no se pudieron guardar. Un valor distinto de 0 significa que el alcance corrió entero pero se perdieron filas, aunque 'completo' diga 'true'.","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"fueraDeVentana":{"description":"Sólo en 'guias': cuántas direcciones cayeron fuera de la ventana de 6 meses que el SII conserva. No es una falla y el status igual sale 'ok', pero es lo único que distingue 'no había guías' de 'no pudimos verlas'. Reintentar no lo arregla.","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"perspectivasFallidas":{"description":"Sólo en 'boletas_honorarios': qué direcciones fallaron enteras, con su código de error. Ese alcance la emite siempre, aunque quede vacía; ningún otro la emite.","type":"array","items":{"type":"object","properties":{"perspectiva":{"type":"string","enum":["emitidas","recibidas"],"description":"Qué lado falló: 'emitidas' son las que emitió esta empresa y 'recibidas' las que le emitieron."},"code":{"type":"string","description":"El código del catálogo de errores que explica por qué falló ese lado. Decide por el código, nunca por el texto."}},"required":["perspectiva","code"],"additionalProperties":false}},"total":{"description":"Sólo en 'documentos': cuántos DTE anunció el índice del SII para el período. Es lo ESPERADO, no lo descargado.","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"ventanas":{"description":"Sólo en 'documentos': cuántas ventanas de descarga (hasta 20 folios cada una) hicieron falta para bajar el período.","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"documentos":{"description":"Sólo en 'documentos': cuántos DTE se descargaron de verdad. Compáralo con 'total': la diferencia es 'faltantes'.","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"faltantes":{"description":"Sólo en 'documentos': cuántos DTE prometió el índice y la descarga no trajo. Es lo que distingue un hueco del SII de un hueco nuestro; lo que sí bajó se guarda igual.","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"sinIndice":{"description":"Sólo en 'documentos': cuántos DTE se descargaron sin que su clave apareciera en el índice del listado. Significa que el índice quedó corto, distinto de que la fila no trajera estado (eso llega como 'estado' en null).","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"hashMismatches":{"description":"Sólo en 'documentos': cuántos documentos repetidos traían un XML distinto. Un DTE firmado es inmutable, así que un valor distinto de 0 es una anomalía para reportar, nunca un documento que cambió.","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"error":{"description":"Por qué este alcance no terminó bien. Presente solo cuando 'status' es 'failed'. Normalmente es un código del catálogo de errores; cuando el sistema externo truncó el listado es una etiqueta de resultado ('movimientos_truncated', 'cartolas_truncated') que no está en ese catálogo y que significa «se escribió lo que alcanzó a venir». Decide por el valor, nunca por el texto libre.","type":"string"}},"required":["alcance","status","recordsSynced"],"additionalProperties":false},"description":"El resultado de cada alcance pedido, una fila por alcance. Los alcances son independientes: uno puede fallar mientras los otros de la misma corrida terminan bien, así que revisa la lista entera."}},"required":["periodo","results"],"additionalProperties":false},"sii__conexion__verificar__Input":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{}},"sii__conexion__verificar__Output":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"verificadoEn":{"type":"string","description":"Instante (ISO 8601) en que el login de prueba terminó bien. Es la única salida de esta tool: recibirla ya significa que la credencial sirve. Si no sirviera, la respuesta sería un error con su código de catálogo, nunca este objeto con un booleano en false."}},"required":["verificadoEn"],"additionalProperties":false},"sii__documentos__consultar__Input":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"periodo":{"description":"Período tributario AAAA-MM. Sin él, la respuesta cruza períodos y 'sincronizacion' llega null.","type":"string","pattern":"^\\d{4}-\\d{2}$"},"perspectiva":{"description":"emitidos = la empresa es el emisor; recibidos = es el receptor.","type":"string","enum":["emitidos","recibidos"]},"tipoDte":{"description":"Filtra por tipo de documento: 33, 34, 46, 52, 56 o 61. El portal no respalda boletas (39/41).","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"cursor":{"description":"Paginación: el valor que devolvió la respuesta anterior, tal cual.","type":"string"},"limit":{"default":100,"description":"Filas por página.","type":"integer","minimum":1,"maximum":500}}},"sii__documentos__consultar__Output":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"documentos":{"type":"array","items":{"type":"object","properties":{"tipoDte":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Código del tipo de DTE: 33 factura, 34 exenta, 46 factura de compra, 52 guía, 56 nota de débito, 61 nota de crédito."},"folio":{"type":"string","description":"El folio del documento, en TEXTO decimal canónico (sin ceros a la izquierda). Junto con 'tipoDte' y 'rutEmisor' lo identifica de forma única, y es el valor que 'sii.documentos.detallar' espera TAL CUAL. Es texto y no un número a propósito: un folio es un identificador con el que no se hace aritmética, y hay folios reales que no caben en un entero de 32 bits."},"rutEmisor":{"type":"string","description":"Quien EMITIÓ el documento. Junto con tipoDte y folio identifica al documento de forma única."},"rutReceptor":{"type":"string","description":"Quien RECIBIÓ el documento: en una fila 'emitidos' es la contraparte, en 'recibidos' es la empresa de esta conexión."},"razonSocialContraparte":{"type":"string","description":"La razón social del lado que NO es la empresa de esta conexión."},"perspectiva":{"type":"string","enum":["emitidos","recibidos"],"description":"emitidos = esta empresa es el emisor; recibidos = es el receptor. Es DERIVADA del documento, no del filtro."},"periodo":{"type":"string","description":"El período tributario con que se sincronizó el documento, en formato AAAA-MM."},"fechaEmision":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"La fecha de emisión que declara el XML del documento, en formato AAAA-MM-DD. 'null' si la fila guardada no la trae."},"montoNeto":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}],"description":"'null' cuando el DTE no declaró <MntNeto>: un documento sólo exento no lo trae. Nunca se fabrica un 0."},"iva":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}],"description":"'null' cuando el DTE no declaró <IVA>, por el mismo motivo que montoNeto."},"montoTotal":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Puede ser 0 legítimamente: una guía de traslado interno o una nota que corrige sólo texto lo exige por XSD."},"estado":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"El estado crudo del listado del portal, tal cual. Es el observado en la última sincronización, no el final. 'null' cuando el sync no pudo emparejar este documento con su fila del índice."},"dteHash":{"type":"string","description":"sha256 del XML guardado. Un DTE firmado es inmutable: si cambia entre sincronizaciones, algo se movió."},"ultimaLecturaEn":{"type":"string","description":"Cuándo se observó esta fila por última vez, en ISO 8601 UTC. El 'estado' es el de esa lectura y no el final: resincroniza el período para refrescarlo."}},"required":["tipoDte","folio","rutEmisor","rutReceptor","razonSocialContraparte","perspectiva","periodo","fechaEmision","montoNeto","iva","montoTotal","estado","dteHash","ultimaLecturaEn"],"additionalProperties":false},"description":"Los documentos respaldados que calzan con el filtro, sólo con sus columnas de cabecera. Ni el XML ni el detalle de ítems viaja aquí: para eso usa 'sii.documentos.detallar'."},"cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"El cursor de la página siguiente, opaco. 'null' significa que no hay más filas; cualquier otro valor se reenvía tal cual en 'cursor' de la próxima llamada y nunca se construye a mano."},"sincronizacion":{"anyOf":[{"type":"object","properties":{"sincronizadoEn":{"type":"string","description":"Cuándo terminó la última sincronización de este período, en ISO 8601 UTC. Es la frescura del dato que estás leyendo."},"completo":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"'true' = el período se sincronizó entero. 'false' = quedaron casillas sin traer, así que puede faltar información. 'null' = no se puede saber, porque no hay registro de ese intento."},"incompletos":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}],"description":"Cuántas casillas quedaron sin traer en esa sincronización. 'null' cuando no se puede saber."},"fueraDeVentana":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}],"description":"Sólo aplica a guías: cuántas direcciones cayeron fuera de la ventana de 6 meses que el SII conserva. Un 0 dice que se verificó y no aplicó; 'null', que no aplica o no se conoce."},"perspectivasFallidas":{"type":"array","items":{"type":"object","properties":{"perspectiva":{"type":"string","enum":["emitidas","recibidas"],"description":"Qué lado falló: 'emitidas' son las que emitió esta empresa y 'recibidas' las que le emitieron."},"code":{"type":"string","description":"El código del catálogo de errores que explica por qué falló ese lado. Decide por el código, nunca por el texto."}},"required":["perspectiva","code"],"additionalProperties":false},"description":"Qué direcciones fallaron enteras en esa sincronización, con su código de error. Hoy sólo la puebla el alcance de boletas de honorarios; para los demás llega vacía."}},"required":["sincronizadoEn","completo","incompletos","fueraDeVentana","perspectivasFallidas"],"additionalProperties":false},{"type":"null"}],"description":"Completitud del último sync del período consultado. Es 'null' por DOS motivos distintos, y ninguno significa que las filas devueltas sean inválidas: (a) la consulta no filtró por 'periodo', así que no hay un sync único al que mirar (pide un 'periodo' concreto para obtener el bloque); o (b) ese período nunca se sincronizó. Un 'null' junto a una lista CON documentos es siempre el caso (a)."}},"required":["documentos","cursor","sincronizacion"],"additionalProperties":false},"sii__documentos__detallar__Input":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"tipoDte":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"El tipo del documento, de la fila de 'sii.documentos.consultar'."},"folio":{"type":"string","minLength":1,"description":"El folio del documento, TAL CUAL viene en la fila de 'sii.documentos.consultar' (es texto: un identificador, no un número). Junto con tipoDte y rutEmisor lo identifica de forma única."},"rutEmisor":{"type":"string","minLength":1,"description":"El RUT de QUIEN EMITIÓ el documento, no el de la contraparte (salvo que el documento haya sido emitido por esta empresa). Con o sin puntos, da igual."},"incluirXml":{"default":false,"description":"Si es true, la respuesta incluye además el XML firmado completo. Son unos 7 KB por documento.","type":"boolean"}},"required":["tipoDte","folio","rutEmisor"]},"sii__documentos__detallar__Output":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"documento":{"anyOf":[{"type":"object","properties":{"tipoDte":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Código del tipo de DTE: 33 factura, 34 exenta, 46 factura de compra, 52 guía, 56 nota de débito, 61 nota de crédito."},"folio":{"type":"string","description":"El folio del documento, en TEXTO decimal canónico (sin ceros a la izquierda). Junto con 'tipoDte' y 'rutEmisor' lo identifica de forma única, y es el valor que 'sii.documentos.detallar' espera TAL CUAL. Es texto y no un número a propósito: un folio es un identificador con el que no se hace aritmética, y hay folios reales que no caben en un entero de 32 bits."},"rutEmisor":{"type":"string","description":"Quien EMITIÓ el documento. Junto con tipoDte y folio identifica al documento de forma única."},"rutReceptor":{"type":"string","description":"Quien RECIBIÓ el documento: en una fila 'emitidos' es la contraparte, en 'recibidos' es la empresa de esta conexión."},"razonSocialContraparte":{"type":"string","description":"La razón social del lado que NO es la empresa de esta conexión."},"perspectiva":{"type":"string","enum":["emitidos","recibidos"],"description":"emitidos = esta empresa es el emisor; recibidos = es el receptor. Es DERIVADA del documento, no del filtro."},"periodo":{"type":"string","description":"El período tributario con que se sincronizó el documento, en formato AAAA-MM."},"fechaEmision":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"La fecha de emisión que declara el XML del documento, en formato AAAA-MM-DD. 'null' si la fila guardada no la trae."},"montoNeto":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}],"description":"'null' cuando el DTE no declaró <MntNeto>: un documento sólo exento no lo trae. Nunca se fabrica un 0."},"iva":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}],"description":"'null' cuando el DTE no declaró <IVA>, por el mismo motivo que montoNeto."},"montoTotal":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Puede ser 0 legítimamente: una guía de traslado interno o una nota que corrige sólo texto lo exige por XSD."},"estado":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"El estado crudo del listado del portal, tal cual. Es el observado en la última sincronización, no el final. 'null' cuando el sync no pudo emparejar este documento con su fila del índice."},"dteHash":{"type":"string","description":"sha256 del XML guardado. Un DTE firmado es inmutable: si cambia entre sincronizaciones, algo se movió."},"ultimaLecturaEn":{"type":"string","description":"Cuándo se observó esta fila por última vez, en ISO 8601 UTC. El 'estado' es el de esa lectura y no el final: resincroniza el período para refrescarlo."},"detalle":{"type":"object","properties":{"formaPago":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Código de forma de pago del DTE: 1 contado, 2 crédito, 3 sin costo. 'null' significa que el documento no lo declaró: nunca asumir contado."},"razonSocialEmisor":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"La razón social de quien emitió el documento, según el XML. 'null' si el documento no la declaró."},"giroEmisor":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"El giro (la actividad económica) de quien emitió el documento. 'null' si no lo declaró."},"dirEmisor":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"La dirección del emisor según el XML. 'null' si no la declaró."},"cmnaEmisor":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"La comuna del emisor según el XML. 'null' si no la declaró."},"razonSocialReceptor":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"La razón social de quien recibió el documento, según el XML. 'null' si el documento no la declaró."},"giroReceptor":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"El giro (la actividad económica) de quien recibió el documento. 'null' si no lo declaró."},"dirReceptor":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"La dirección del receptor según el XML. 'null' si no la declaró."},"cmnaReceptor":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"La comuna del receptor según el XML. 'null' si no la declaró."},"items":{"type":"array","items":{"type":"object","properties":{"numeroLinea":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}],"description":"El número de línea del ítem dentro del detalle. 'null' si el documento no lo declaró."},"nombre":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"El nombre del ítem tal como lo escribió el emisor. 'null' si el documento no lo declaró."},"cantidad":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"La cantidad del ítem. El 'null' es literal: un flete o un descuento suelen no declararla, y no debe leerse como cero."},"unidad":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"La unidad de medida del ítem, tal cual la escribió el emisor. 'null' si no la declaró."},"precioUnitario":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"El precio unitario del ítem. El 'null' es literal, igual que en 'cantidad': no debe leerse como cero."},"montoItem":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"El monto de la línea. 'null' significa que el documento no lo declaró de forma legible, nunca un cero."}},"required":["numeroLinea","nombre","cantidad","unidad","precioUnitario","montoItem"],"additionalProperties":false},"description":"Las líneas del detalle del documento, en el orden en que vienen en el XML. Un documento sin líneas legibles llega con la lista vacía."}},"required":["formaPago","razonSocialEmisor","giroEmisor","dirEmisor","cmnaEmisor","razonSocialReceptor","giroReceptor","dirReceptor","cmnaReceptor","items"],"additionalProperties":false,"description":"Lo que el XML firmado trae y la cabecera no: los ítems, los giros, direcciones y comunas de emisor y receptor, y la forma de pago. Se parsea al leer, no se guarda aparte."}},"required":["tipoDte","folio","rutEmisor","rutReceptor","razonSocialContraparte","perspectiva","periodo","fechaEmision","montoNeto","iva","montoTotal","estado","dteHash","ultimaLecturaEn","detalle"],"additionalProperties":false},{"type":"null"}],"description":"El documento pedido, con su detalle completo. 'null' significa que ese documento no está sincronizado: no es un error, sincroniza su período con 'sii.conexion.sincronizar' y vuelve a preguntar."},"xml":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"El XML firmado del DTE, tal cual se respaldó. Sólo viaja si se pidió 'incluirXml: true'."}},"required":["documento","xml"],"additionalProperties":false},"sii__guias__consultar__Input":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"periodo":{"type":"string","pattern":"^\\d{4}-\\d{2}$","description":"Un mes, en formato AAAA-MM y en calendario chileno (por ejemplo '2026-07'). Cada sitio de uso afina qué significa ahí: en una sincronización es el mes que se va a traer, y en una consulta a la caché es el filtro. Esta descripción base existe para que el campo nunca llegue pelado a quien lee el contrato."},"perspectiva":{"description":"emitidas = las que emitió esta empresa; recibidas = las que le emitieron. Sin este filtro vienen las dos.","type":"string","enum":["emitidas","recibidas"]},"cursor":{"description":"Paginación: el valor que devolvió la respuesta anterior, tal cual.","type":"string"},"limit":{"default":100,"description":"Filas por página.","type":"integer","minimum":1,"maximum":500}}},"sii__guias__consultar__Output":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"documentos":{"type":"array","items":{"type":"object","properties":{"perspectiva":{"type":"string","enum":["emitidas","recibidas"],"description":"emitidas = las guías que emitió esta empresa; recibidas = las que le emitieron."},"tipoDte":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Siempre 52: guía de despacho electrónica."},"periodo":{"type":"string","description":"El período tributario de la guía, en formato AAAA-MM."},"folio":{"type":"string","description":"El folio de la guía, en TEXTO decimal canónico (sin ceros a la izquierda). Junto con 'perspectiva' y 'rutContraparte' la identifica. Es texto y no un número a propósito: un folio es un identificador con el que no se hace aritmética, y hay folios reales que no caben en un entero de 32 bits. Compáralo como cadena."},"rutContraparte":{"type":"string","description":"El RUT del otro lado: en 'emitidas' es el cliente y en 'recibidas' es quien emitió la guía. El RUT propio no viaja en la fila porque ya lo define la conexión."},"razonSocialContraparte":{"type":"string","description":"La razón social de ese mismo lado, tal como la informó el SII."},"montoNeto":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Monto neto en pesos chilenos, entero."},"montoExento":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Monto exento de IVA en pesos chilenos, entero."},"montoIva":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"IVA en pesos chilenos, entero."},"montoTotal":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Monto total de la guía en pesos chilenos, entero."},"tasaIva":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}],"description":"La tasa de IVA multiplicada por cien: 1900 es 19%. 'null' cuando el SII no la informó."},"fechaEmision":{"type":"string","description":"La fecha de emisión tal cual la manda el SII, en formato DD/MM/AAAA. Para ordenar o comparar usa 'fechaEmisionDate'."},"fechaEmisionDate":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"La misma fecha en formato AAAA-MM-DD, o 'null' si no se pudo parsear."},"fechaRecepcion":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Cuándo el SII recibió la guía, en formato AAAA-MM-DD. 'null' si no vino."},"eventoOrden":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"El código del evento que registró el receptor sobre la guía, como texto. 'null' cuando no hubo evento."},"eventoDescripcion":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"La descripción de ese mismo evento, por ejemplo 'Acuse recibo'. 'null' cuando no hubo evento o el SII no la mandó."},"dhdrCodigo":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Un identificador interno del SII para la guía. Sirve para correlacionar contra el portal, pero su estabilidad entre sincronizaciones no está verificada: no lo uses para identificar el documento."}},"required":["perspectiva","tipoDte","periodo","folio","rutContraparte","razonSocialContraparte","montoNeto","montoExento","montoIva","montoTotal","tasaIva","fechaEmision","fechaEmisionDate","fechaRecepcion","eventoOrden","eventoDescripcion","dhdrCodigo"],"additionalProperties":false},"description":"Las guías de despacho que calzan con el filtro, una por fila. Sale de la caché ya sincronizada: el SII sólo conserva el detalle de los últimos 6 meses, así que un período más viejo no se puede traer aunque la guía exista."},"cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"El cursor de la página siguiente, opaco. 'null' significa que no hay más filas; cualquier otro valor se reenvía tal cual en 'cursor' de la próxima llamada y nunca se construye a mano."},"sincronizacion":{"anyOf":[{"type":"object","properties":{"sincronizadoEn":{"type":"string","description":"Cuándo terminó la última sincronización de este período, en ISO 8601 UTC. Es la frescura del dato que estás leyendo."},"completo":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"'true' = el período se sincronizó entero. 'false' = quedaron casillas sin traer, así que puede faltar información. 'null' = no se puede saber, porque no hay registro de ese intento."},"incompletos":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}],"description":"Cuántas casillas quedaron sin traer en esa sincronización. 'null' cuando no se puede saber."},"fueraDeVentana":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}],"description":"Sólo aplica a guías: cuántas direcciones cayeron fuera de la ventana de 6 meses que el SII conserva. Un 0 dice que se verificó y no aplicó; 'null', que no aplica o no se conoce."},"perspectivasFallidas":{"type":"array","items":{"type":"object","properties":{"perspectiva":{"type":"string","enum":["emitidas","recibidas"],"description":"Qué lado falló: 'emitidas' son las que emitió esta empresa y 'recibidas' las que le emitieron."},"code":{"type":"string","description":"El código del catálogo de errores que explica por qué falló ese lado. Decide por el código, nunca por el texto."}},"required":["perspectiva","code"],"additionalProperties":false},"description":"Qué direcciones fallaron enteras en esa sincronización, con su código de error. Hoy sólo la puebla el alcance de boletas de honorarios; para los demás llega vacía."}},"required":["sincronizadoEn","completo","incompletos","fueraDeVentana","perspectivasFallidas"],"additionalProperties":false},{"type":"null"}],"description":"Completitud del último sync del período consultado. Es 'null' por DOS motivos distintos, y ninguno significa que las filas devueltas sean inválidas: (a) la consulta no filtró por 'periodo', así que no hay un sync único al que mirar (pide un 'periodo' concreto para obtener el bloque); o (b) ese período nunca se sincronizó. Un 'null' junto a una lista CON documentos es siempre el caso (a)."}},"required":["documentos","cursor","sincronizacion"],"additionalProperties":false},"sii__rcv__consultar__Input":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"periodo":{"description":"Período tributario AAAA-MM. Sin él, la respuesta cruza períodos y 'sincronizacion' llega null.","type":"string","pattern":"^\\d{4}-\\d{2}$"},"perspectiva":{"description":"compras = la empresa es el receptor; ventas = la empresa es el emisor.","type":"string","enum":["compras","ventas"]},"tipoDte":{"description":"Tipo de DTE (33 factura electrónica, 34 exenta, 46 factura de compra, 56 nota de débito, 61 nota de crédito, …).","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"estado":{"description":"Estado del documento en el RCV.","type":"string","enum":["registro","pendiente","no_incluir","reclamado"]},"cursor":{"description":"Paginación: el valor que devolvió la respuesta anterior, tal cual.","type":"string"},"limit":{"default":100,"description":"Filas por página.","type":"integer","minimum":1,"maximum":500}}},"sii__rcv__consultar__Output":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"documentos":{"type":"array","items":{"type":"object","properties":{"tipoDte":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Código del tipo de DTE: 33 factura electrónica, 34 exenta, 46 factura de compra, 56 nota de débito, 61 nota de crédito. Es un NÚMERO, a diferencia de 'folio': es un código de un vocabulario cerrado, no un identificador."},"folio":{"type":"string","description":"El folio del documento, en TEXTO decimal canónico (sin ceros a la izquierda). Junto con 'tipoDte' y 'rutEmisor' lo identifica de forma única. Es texto y no un número a propósito: un folio es un identificador con el que no se hace aritmética, y hay folios reales que no caben en un entero de 32 bits. Compáralo como cadena y no lo conviertas a número para ordenar ni para volver a mandarlo."},"rutEmisor":{"type":"string","description":"Quien EMITIÓ el documento: en 'ventas' es la empresa de esta conexión, en 'compras' es la contraparte."},"rutReceptor":{"type":"string","description":"Quien RECIBIÓ el documento: en 'compras' es la empresa de esta conexión, en 'ventas' es la contraparte."},"razonSocial":{"type":"string","description":"La razón social de la CONTRAPARTE, nunca la de la empresa de esta conexión, tal como la informó el SII."},"fechaEmision":{"type":"string","description":"La fecha de emisión tal cual la manda el SII, en formato DD/MM/AAAA. Para ordenar o comparar usa 'fechaEmisionDate'."},"montoNeto":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Monto neto en pesos chilenos, entero. Un 0 no distingue 'el documento no tiene neto' (uno sólo exento) de 'el SII no informó el campo': las dos formas llegan igual."},"montoIva":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"IVA en pesos chilenos, entero. Un 0 es ambiguo por el mismo motivo que en 'montoNeto'."},"montoTotal":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Monto total del documento en pesos chilenos, entero."},"estado":{"type":"string","description":"La casilla del Registro de Compras donde el SII tiene el documento: 'registro', 'pendiente', 'no_incluir' o 'reclamado'. Las ventas son siempre 'registro'."},"periodo":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"El período tributario con que se sincronizó el documento, en formato AAAA-MM. 'null' en filas viejas que no lo guardaron."},"fechaEmisionDate":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"La misma fecha de emisión en formato AAAA-MM-DD, o 'null' si no se pudo parsear. Es la que conviene usar para ordenar."},"montoExento":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Monto exento de IVA en pesos chilenos, entero."},"fechaRecepcion":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Cuándo el SII recibió el documento, en formato AAAA-MM-DD. 'null' si no vino."},"eventoReceptor":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"La leyenda del evento que registró el receptor (un acuse, un reclamo). 'null' cuando no hubo evento."},"eventoReceptorCod":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"El código de ese mismo evento. Decide por el código, nunca por la leyenda. 'null' cuando no hubo evento."},"tipoDocRef":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}],"description":"Tipo del documento que este corrige o referencia (una nota de crédito sobre una factura 33). 'null' cuando no referencia a ninguno. Es un NÚMERO, a diferencia de 'folioDocRef': código de vocabulario cerrado contra identificador."},"folioDocRef":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Folio del documento referenciado, en TEXTO decimal canónico igual que 'folio', o 'null' cuando no hay referencia. Es el campo más expuesto del conector porque sale de lo que tipeó el emisor en el DTE, así que trátalo como cadena y no lo conviertas a número."},"fechaAcuse":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Fecha del acuse de recibo, en formato AAAA-MM-DD. 'null' si no se acusó."},"fechaReclamo":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Fecha del reclamo, en formato AAAA-MM-DD. 'null' si no se reclamó."},"tipoTransaccion":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Con qué tipo de transacción quedó clasificado el documento en el RCV, tal cual lo manda el SII. 'null' si no vino."},"perspectiva":{"type":"string","enum":["compras","ventas"],"description":"compras = tú eres el receptor; ventas = tú eres el emisor"}},"required":["tipoDte","folio","rutEmisor","rutReceptor","razonSocial","fechaEmision","montoNeto","montoIva","montoTotal","estado","periodo","fechaEmisionDate","montoExento","fechaRecepcion","eventoReceptor","eventoReceptorCod","tipoDocRef","folioDocRef","fechaAcuse","fechaReclamo","tipoTransaccion","perspectiva"],"additionalProperties":false},"description":"Los documentos del RCV que calzan con el filtro, uno por fila. Sale de la caché ya sincronizada, nunca de una consulta en vivo al SII."},"cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"El cursor de la página siguiente, opaco. 'null' significa que no hay más filas; cualquier otro valor se reenvía tal cual en 'cursor' de la próxima llamada y nunca se construye a mano."},"sincronizacion":{"anyOf":[{"type":"object","properties":{"sincronizadoEn":{"type":"string","description":"Cuándo terminó la última sincronización de este período, en ISO 8601 UTC. Es la frescura del dato que estás leyendo."},"completo":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"'true' = el período se sincronizó entero. 'false' = quedaron casillas sin traer, así que puede faltar información. 'null' = no se puede saber, porque no hay registro de ese intento."},"incompletos":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}],"description":"Cuántas casillas quedaron sin traer en esa sincronización. 'null' cuando no se puede saber."},"fueraDeVentana":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}],"description":"Sólo aplica a guías: cuántas direcciones cayeron fuera de la ventana de 6 meses que el SII conserva. Un 0 dice que se verificó y no aplicó; 'null', que no aplica o no se conoce."},"perspectivasFallidas":{"type":"array","items":{"type":"object","properties":{"perspectiva":{"type":"string","enum":["emitidas","recibidas"],"description":"Qué lado falló: 'emitidas' son las que emitió esta empresa y 'recibidas' las que le emitieron."},"code":{"type":"string","description":"El código del catálogo de errores que explica por qué falló ese lado. Decide por el código, nunca por el texto."}},"required":["perspectiva","code"],"additionalProperties":false},"description":"Qué direcciones fallaron enteras en esa sincronización, con su código de error. Hoy sólo la puebla el alcance de boletas de honorarios; para los demás llega vacía."}},"required":["sincronizadoEn","completo","incompletos","fueraDeVentana","perspectivasFallidas"],"additionalProperties":false},{"type":"null"}],"description":"Completitud del último sync del período consultado. Es 'null' por DOS motivos distintos, y ninguno significa que las filas devueltas sean inválidas: (a) la consulta no filtró por 'periodo', así que no hay un sync único al que mirar (pide un 'periodo' concreto para obtener el bloque); o (b) ese período nunca se sincronizó. Un 'null' junto a una lista CON documentos es siempre el caso (a)."}},"required":["documentos","cursor","sincronizacion"],"additionalProperties":false},"ErrorEnvelope":{"type":"object","required":["error"],"properties":{"error":{"type":"object","description":"El error de esta llamada. Toda respuesta que no sea 2xx trae exactamente esta forma.","required":["code","message","request_id"],"properties":{"code":{"type":"string","enum":["alcance_not_enabled","alcance_scheme_unsupported","billing_past_due","connected_account_required","connection_ambiguous","connection_busy","connection_credential_required","connection_disabled","connection_identity_mismatch","connection_session_pending","connection_sync_in_progress","connector_onboarding_required","connector_plan_limit","feature_not_in_plan","forbidden","handler_error","idempotency_conflict","idempotency_in_progress","internal_error","invalid_webhook_url","malformed_request","not_implemented","output_contract_error","payload_too_large","payment_method_required","quota_exceeded","rate_limited","scope_not_granted","service_unavailable","sync_job_not_found","timeout","too_many_pending","tool_not_found","unauthorized","unsupported_media_type","upstream_error","upstream_unexpected_response","validation_error","webhook_delivery_not_found","webhook_endpoint_not_found"],"description":"El código del catálogo. Decide SIEMPRE por este valor y nunca por el texto de 'message', que puede cambiar sin aviso; los códigos son estables."},"message":{"type":"string","description":"Descripción legible del error. Para mostrar, no para ramificar."},"suggested_fix":{"type":"string","description":"El paso siguiente, escrito para ejecutarse. Cuando el error depende de datos concretos (qué conexiones hay, qué alcance falta) los nombra, así que léelo antes de reintentar."},"request_id":{"type":"string","description":"El id de esta llamada (req_…). Correlaciona con la bitácora y es lo primero que pide soporte."},"details":{"description":"Detalle estructurado del error cuando lo hay, por ejemplo los campos que no validaron. Su forma depende del código."}}}}},"ResponseMeta":{"type":"object","required":["request_id","tool_id","plane","latency_ms","audit_status"],"properties":{"request_id":{"type":"string","description":"Identificador que el servidor le da a esta llamada (req_…). Correlaciona con la fila de la bitácora y es lo primero que pide soporte: guárdalo en tus logs."},"tool_id":{"type":"string","description":"La tool que se ejecutó, con su id punteado."},"plane":{"type":"string","enum":["action","read"],"description":"'read' = la llamada escribió en el plano persistido (un sync). 'action' = efímera, no persistió nada de negocio: actuar afuera, o leer lo que un sync ya dejó."},"latency_ms":{"type":"integer","description":"Cuánto tardó la ejecución, en milisegundos."},"audit_status":{"type":"string","enum":["recorded","degraded"],"description":"'recorded' = la bitácora recibió la fila de esta llamada. 'degraded' = la acción se hizo pero el registro cayó a un respaldo duradero. Nunca convierte una acción exitosa en un error, porque reintentar por eso sería pagar o emitir dos veces."},"idempotency":{"type":"string","enum":["replayed"],"description":"Presente solo cuando una tool destructiva devolvió la respuesta guardada de un intento previo con la misma Idempotency-Key. Significa que en ESTA llamada no ocurrió ningún efecto nuevo."}}}},"responses":{"Error_validation_error":{"description":"validation_error (400)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"Error_malformed_request":{"description":"malformed_request (400)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"Error_unsupported_media_type":{"description":"unsupported_media_type (415)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"Error_payload_too_large":{"description":"payload_too_large (413)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"Error_unauthorized":{"description":"unauthorized (401)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"Error_service_unavailable":{"description":"service_unavailable (503)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"Error_forbidden":{"description":"forbidden (403)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"Error_scope_not_granted":{"description":"scope_not_granted (403)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"Error_connection_disabled":{"description":"connection_disabled (403)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"Error_connection_ambiguous":{"description":"connection_ambiguous (409)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"Error_connection_busy":{"description":"connection_busy (409)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"Error_connected_account_required":{"description":"connected_account_required (428)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"Error_connection_credential_required":{"description":"connection_credential_required (428)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"Error_connection_identity_mismatch":{"description":"connection_identity_mismatch (409)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"Error_alcance_scheme_unsupported":{"description":"alcance_scheme_unsupported (422)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"Error_alcance_not_enabled":{"description":"alcance_not_enabled (403)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"Error_tool_not_found":{"description":"tool_not_found (404)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"Error_idempotency_conflict":{"description":"idempotency_conflict (409)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"Error_idempotency_in_progress":{"description":"idempotency_in_progress (409)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"Error_connector_onboarding_required":{"description":"connector_onboarding_required (428)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"Error_connector_plan_limit":{"description":"connector_plan_limit (402)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"Error_rate_limited":{"description":"rate_limited (429)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"Error_connection_sync_in_progress":{"description":"connection_sync_in_progress (409)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"Error_too_many_pending":{"description":"too_many_pending (429)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"Error_sync_job_not_found":{"description":"sync_job_not_found (404)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"Error_webhook_endpoint_not_found":{"description":"webhook_endpoint_not_found (404)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"Error_webhook_delivery_not_found":{"description":"webhook_delivery_not_found (404)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"Error_invalid_webhook_url":{"description":"invalid_webhook_url (422)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"Error_quota_exceeded":{"description":"quota_exceeded (429)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"Error_feature_not_in_plan":{"description":"feature_not_in_plan (403)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"Error_billing_past_due":{"description":"billing_past_due (402)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"Error_payment_method_required":{"description":"payment_method_required (402)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"Error_connection_session_pending":{"description":"connection_session_pending (409)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"Error_output_contract_error":{"description":"output_contract_error (500)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"Error_handler_error":{"description":"handler_error (500)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"Error_upstream_error":{"description":"upstream_error (502)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"Error_upstream_unexpected_response":{"description":"upstream_unexpected_response (502)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"Error_timeout":{"description":"timeout (504)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"Error_not_implemented":{"description":"not_implemented (501)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"Error_internal_error":{"description":"internal_error (500)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"securitySchemes":{"apiKey":{"type":"http","scheme":"bearer","bearerFormat":"connect_sk_","description":"API key de la organización, en 'Authorization: Bearer connect_sk_…'. Es la credencial para tu backend y tus agentes propios; se crea en el dashboard con permisos explícitos y su valor completo se muestra una sola vez. Autentica como agente: la bitácora atribuye la acción a la clave, nunca a la persona que la creó."},"oauth2":{"type":"oauth2","description":"OAuth 2.1 para clientes MCP interactivos, con registro dinámico y PKCE S256 obligatorio. El access token viaja igual, en 'Authorization: Bearer connect_at_…', y autentica como usuario. Los endpoints viven en la raíz del origen, no bajo /api.","flows":{"authorizationCode":{"authorizationUrl":"https://connect.emisso.ai/authorize","tokenUrl":"https://connect.emisso.ai/token","refreshUrl":"https://connect.emisso.ai/token","scopes":{"banco_estado:read":"Permiso para las tools de 'banco_estado'.","banco_security:read":"Permiso para las tools de 'banco_security'.","bch_empresas:read":"Permiso para las tools de 'bch_empresas'.","bci_pyme:read":"Permiso para las tools de 'bci_pyme'.","bice_empresas:read":"Permiso para las tools de 'bice_empresas'.","conexiones:read":"Permiso para las tools de 'conexiones'.","conexiones:write":"Permiso para las tools de 'conexiones'.","core:read":"Permiso para las tools de 'core'.","echo:read":"Permiso para las tools de 'echo'.","indicadores:read":"Permiso para las tools de 'indicadores'.","notta:read":"Permiso para las tools de 'notta'.","notta:write":"Permiso para las tools de 'notta'.","previred:read":"Permiso para las tools de 'previred'.","sii:read":"Permiso para las tools de 'sii'."}}}}}}}