openapi: 3.0.3
info:
  title: Riversoft STCP Gemini API
  version: v2
  description: |-
    Especificación pública de la API REST de gestión de Riversoft STCP Gemini y Riversoft STCP DirectLink. Es la misma API que usa el Riversoft Console Portal.

    Sustituya el servidor de ejemplo por la dirección de la API de su entorno. Use HTTPS en producción.

    Las rutas protegidas exigen el header `Authorization: Bearer <access_token>`, obtenido en `/oauth/token` o `/oauth/v2/token`. Cada ruta exige un permiso en el `scope` del operador; se indica en la descripción de cada operación.

    Las solicitudes con cuerpo JSON deben enviar exactamente `Content-Type: application/json`.

    Los esquemas del `CONFIG_TXT` corresponden al módulo de configuración `stcpcfgifacetypes-go` v1.3.2.
  contact:
    name: Soporte Riversoft
servers:
- url: https://api.exemplo.com:33070
  description: Dirección ilustrativa; sustitúyala por la dirección de la API de su entorno.
tags:
- name: Autenticación
- name: Single Sign-On
- name: Información
- name: Instancias
- name: Usuarios
- name: Servicios de red
- name: Agendamientos
- name: Tipos de archivo
- name: Enrutamientos
- name: Operadores
- name: Grupos y permisos
- name: Registro de la API
- name: Códigos de error y evento
- name: Supervisión
- name: Archivos de la supervisión
- name: Mantenimiento
- name: Informes
security:
- bearerAuth: []
paths:
  /oauth/token:
    post:
      tags:
      - Autenticación
      summary: Emitir token (password grant)
      operationId: postOAuthToken
      description: |-
        Emite el token de acceso por OAuth 2.0 *password grant*, solo con la autenticación nativa. Esta ruta no aplica la autenticación de dos factores (2FA) y no acepta inicio de sesión LDAP: para esos casos, use `POST /oauth/v2/token`.

        Después del número máximo de fallas definido en las políticas de contraseña, el operador se bloquea y pasa a recibir `401`.
      security: []
      requestBody:
        required: true
        content:
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/TokenRequest'
            example:
              grant_type: password
              username: stcpadmin
              password: <senha>
      responses:
        '200':
          description: Token emitido.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TokenResponse'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/AuthUnauthorized'
        '415':
          $ref: '#/components/responses/UnsupportedMediaType'
        '500':
          $ref: '#/components/responses/InternalError'
  /oauth/v2/token:
    post:
      tags:
      - Autenticación
      summary: Emitir token con soporte de 2FA
      operationId: postOAuthTokenV2
      description: |-
        Primera etapa del inicio de sesión. Sin 2FA, responde con el token, en el mismo formato que `POST /oauth/token`. Con 2FA habilitado en el registro de la API, responde con la URL del desafío (`URL`); en el primer acceso del operador, también con el secreto TOTP (`secret`) y el código QR (`qrcode`) para registrarlo en la aplicación autenticadora.

        Para el inicio de sesión LDAP, indique el usuario en el formato `<proveedor>/<operador>`, donde `<proveedor>` es el nombre del proveedor LDAP registrado en `ssoProviders`.
      security: []
      requestBody:
        required: true
        content:
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/TokenRequest'
      responses:
        '200':
          description: Token emitido o desafío de 2FA.
          content:
            application/json:
              schema:
                oneOf:
                - $ref: '#/components/schemas/TokenResponse'
                - $ref: '#/components/schemas/MFAChallengeResponse'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/AuthUnauthorized'
        '415':
          $ref: '#/components/responses/UnsupportedMediaType'
        '500':
          $ref: '#/components/responses/InternalError'
  /oauth/v2/token/mfa/{challengeID}:
    post:
      tags:
      - Autenticación
      summary: Concluir el inicio de sesión con el código 2FA
      operationId: postOAuthTokenMFA
      description: Segunda etapa del inicio de sesión con 2FA. Envíe el código TOTP de 6 dígitos generado por la aplicación
        autenticadora. Cada código incorrecto responde `401`; en el cuarto código incorrecto, el operador se bloquea y el
        desafío se descarta. Con un desafío inexistente o descartado, recomience en `POST /oauth/v2/token`.
      security: []
      parameters:
      - in: path
        name: challengeID
        required: true
        description: Identificador del desafío, devuelto en `URL` en la etapa anterior.
        schema:
          type: string
          format: uuid
      requestBody:
        required: true
        description: Código TOTP.
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/MFARequest'
            example:
              Code: '123456'
      responses:
        '200':
          description: Token emitido.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TokenResponse'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/AuthUnauthorized'
        '500':
          $ref: '#/components/responses/InternalError'
  /disconnect/api/v3/logout:
    delete:
      tags:
      - Autenticación
      summary: Cerrar la sesión
      operationId: deleteLogout
      description: Invalida el token de acceso informado en el header `Authorization`. Con `sso_logout_end_session` habilitado
        y una sesión SSO, la respuesta trae en `redirect` la dirección para cerrar también la sesión en el proveedor de identidad.
      responses:
        '200':
          description: Sesión cerrada.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/LogoutResponse'
              example:
                data: Logout successful
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '500':
          $ref: '#/components/responses/InternalError'
  /stcpadminsvc/v2/logout:
    delete:
      tags:
      - Autenticación
      summary: Cerrar la sesión (ruta alternativa)
      operationId: deleteLogoutV2
      description: Misma función que `DELETE /disconnect/api/v3/logout`.
      responses:
        '200':
          description: Sesión cerrada.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/LogoutResponse'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '500':
          $ref: '#/components/responses/InternalError'
  /auth/api/v1/sso/login:
    get:
      tags:
      - Single Sign-On
      summary: Iniciar el inicio de sesión SSO
      operationId: getSSOLogin
      description: Redirige el navegador al proveedor de identidad indicado (SAML 2.0 u OAuth 2.0). Los proveedores disponibles
        se listan en `GET /info/sso/providers`. Los proveedores LDAP usan `POST /oauth/v2/token`.
      security: []
      parameters:
      - in: query
        name: provider
        required: true
        description: Nombre del proveedor de identidad registrado.
        schema:
          type: string
      responses:
        '307':
          description: Redirección al proveedor de identidad.
        '400':
          $ref: '#/components/responses/BadRequest'
  /auth/api/v1/sso/saml2/acs:
    post:
      tags:
      - Single Sign-On
      summary: Retorno SAML 2.0 (ACS)
      operationId: postSAML2ACS
      description: Endpoint de retorno (*Assertion Consumer Service*) llamado por el proveedor SAML 2.0 después de la autenticación.
        Las integraciones no lo llaman directamente.
      security: []
      responses:
        '303':
          description: Redirección a la dirección de `sso_login_redirect` con `token`, `token_type` (`Bearer`) y `scope` (permisos
            en JSON codificado en Base64) en la query string. En caso de falla, con `error`.
  /auth/api/v1/sso/saml2/slo:
    post:
      tags:
      - Single Sign-On
      summary: Retorno del cierre de sesión SAML 2.0 (SLO)
      operationId: postSAML2SLO
      description: Endpoint de *Single Logout* llamado por el proveedor SAML 2.0.
      security: []
      responses:
        '303':
          description: Redirección después del cierre de sesión.
  /auth/api/v1/sso/oauth2:
    get:
      tags:
      - Single Sign-On
      summary: Retorno OAuth 2.0 / OpenID Connect
      operationId: getOAuth2Callback
      description: Endpoint de retorno (*callback*) llamado por el proveedor OAuth 2.0 u OpenID Connect después de la autenticación.
        Las integraciones no lo llaman directamente.
      security: []
      responses:
        '303':
          description: Redirección a la dirección de `sso_login_redirect` con `token`, `token_type` (`Bearer`) y `scope` (permisos
            en JSON codificado en Base64) en la query string. En caso de falla, con `error`.
  /info/version:
    get:
      tags:
      - Información
      summary: Versión de la API
      operationId: getInfoVersion
      description: Nombre del registro de la API (`rest_name`), versión y nombre en clave.
      security: []
      responses:
        '200':
          description: Versión de la API.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/VersionInfo'
              example:
                Name: RestAPI
                Version: 2.3.0
                Model: Pudim
  /info/status:
    get:
      tags:
      - Información
      summary: Estado de las conexiones
      operationId: getInfoStatus
      description: Estado de las conexiones de la API con la base de configuración y con la base de log. Útil para el monitoreo.
      security: []
      responses:
        '200':
          description: Estado de las conexiones.
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/ServiceStatus'
              example:
              - name: API_ConfigDB_Connection
                active: true
                status_time: '2026-11-09T10:15:00-03:00'
              - name: API_LogDB_Connection
                active: true
                status_time: '2026-11-09T10:15:00-03:00'
  /info/report:
    get:
      tags:
      - Información
      summary: Historial de incidencias de una conexión
      operationId: getInfoReport
      description: Últimas incidencias registradas para una de las conexiones de `GET /info/status`.
      security: []
      parameters:
      - in: query
        name: name
        required: true
        description: Nombre de la conexión, como `API_ConfigDB_Connection`.
        schema:
          type: string
      responses:
        '200':
          description: Incidencias registradas.
          content:
            application/json:
              schema:
                type: array
                items:
                  type: string
        '404':
          $ref: '#/components/responses/NotFound'
  /info/license:
    get:
      tags:
      - Información
      summary: Estado de la licencia
      operationId: getInfoLicense
      description: Situación de la licencia, días hasta el vencimiento y fecha de vencimiento. Cuando la licencia vence, la
        API se detiene.
      security: []
      responses:
        '200':
          description: Estado de la licencia.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/LicenseStatus'
              example:
                status: active
                daysRemaining: 120
                expiresAt: '2027-03-09T00:00:00Z'
  /info/sso/providers:
    get:
      tags:
      - Información
      summary: Proveedores de inicio de sesión
      operationId: getInfoSSOProviders
      description: Proveedores de identidad habilitados para el inicio de sesión (OAuth 2.0, SAML 2.0 o LDAP).
      security: []
      responses:
        '200':
          description: Proveedores habilitados.
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/LoginProvider'
              example:
              - Name: EntraID
                Type: oauth2
  /stcpcore/v2/instances:
    get:
      tags:
      - Instancias
      summary: Listar instancias
      operationId: listInstances
      description: |-
        **Permiso:** `stcpcore.instance` ≥ 1 (lectura).

        El operador ve las instancias relacionadas con sus grupos.
      responses:
        '200':
          description: Instancias encontradas.
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/ListEnvelope'
                - type: object
                  properties:
                    data:
                      type: array
                      items:
                        $ref: '#/components/schemas/Instance'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '500':
          $ref: '#/components/responses/InternalError'
    post:
      tags:
      - Instancias
      summary: Crear instancia
      operationId: createInstance
      description: |-
        **Permiso:** `stcpcore.instance` ≥ 15 (lectura y escritura).

        Envíe la entidad sin el campo `ID`. El header `Content-Type` debe ser exactamente `application/json`.
      requestBody:
        required: true
        description: Instancia a crear.
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/Instance'
      responses:
        '200':
          description: Instancia creada. `data` contiene el nombre de la entidad.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WriteResult'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '500':
          $ref: '#/components/responses/InternalError'
  /stcpcore/v2/instances/id/{instanceID}:
    get:
      tags:
      - Instancias
      summary: Consultar instancia
      operationId: getInstance
      description: '**Permiso:** `stcpcore.instance` ≥ 1 (lectura).'
      parameters:
      - in: path
        name: instanceID
        required: true
        description: ID de la instancia.
        schema:
          type: integer
          format: int64
      responses:
        '200':
          description: Instancia encontrada.
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/ListEnvelope'
                - type: object
                  properties:
                    data:
                      type: array
                      items:
                        $ref: '#/components/schemas/Instance'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '500':
          $ref: '#/components/responses/InternalError'
    put:
      tags:
      - Instancias
      summary: Modificar instancia
      operationId: updateInstance
      description: |-
        **Permiso:** `stcpcore.instance` ≥ 15 (lectura y escritura).

        Envíe la entidad completa. Los campos sensibles enmascarados (`****`) mantienen el valor guardado.
      parameters:
      - in: path
        name: instanceID
        required: true
        description: ID de la instancia.
        schema:
          type: integer
          format: int64
      requestBody:
        required: true
        description: Instancia modificada.
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/Instance'
      responses:
        '200':
          description: Instancia modificada.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WriteResult'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '500':
          $ref: '#/components/responses/InternalError'
    delete:
      tags:
      - Instancias
      summary: Eliminar instancia
      operationId: deleteInstance
      description: '**Permiso:** `stcpcore.instance` ≥ 15 (lectura y escritura).'
      parameters:
      - in: path
        name: instanceID
        required: true
        description: ID de la instancia.
        schema:
          type: integer
          format: int64
      responses:
        '200':
          description: Instancia eliminada.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WriteResult'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '500':
          $ref: '#/components/responses/InternalError'
  /stcpcore/v2/instances/members:
    get:
      tags:
      - Instancias
      summary: Listar instancias y sus usuarios
      operationId: listInstanceMembers
      description: '**Permiso:** `stcpcore.instance` ≥ 15 (lectura y escritura).'
      responses:
        '200':
          description: Instancias con los usuarios de cada una.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/InstanceMembers'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '500':
          $ref: '#/components/responses/InternalError'
  /stcpcore/v2/instances/id/{instanceID}/users:
    get:
      tags:
      - Usuarios
      summary: Listar usuarios
      operationId: listUsers
      description: |-
        **Permiso:** `stcpcore.user` ≥ 1 (lectura).

        Cada usuario tiene un único buzón.
      parameters:
      - in: path
        name: instanceID
        required: true
        description: ID de la instancia.
        schema:
          type: integer
          format: int64
      responses:
        '200':
          description: Usuarios encontrados.
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/ListEnvelope'
                - type: object
                  properties:
                    data:
                      type: array
                      items:
                        $ref: '#/components/schemas/User'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '500':
          $ref: '#/components/responses/InternalError'
    post:
      tags:
      - Usuarios
      summary: Crear usuario
      operationId: createUser
      description: |-
        **Permiso:** `stcpcore.user` ≥ 15 (lectura y escritura).

        Envíe la entidad sin el campo `ID`. El header `Content-Type` debe ser exactamente `application/json`.
      parameters:
      - in: path
        name: instanceID
        required: true
        description: ID de la instancia.
        schema:
          type: integer
          format: int64
      requestBody:
        required: true
        description: Usuario a crear.
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/User'
      responses:
        '200':
          description: Usuario creado. `data` contiene el nombre de la entidad.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WriteResult'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '500':
          $ref: '#/components/responses/InternalError'
  /stcpcore/v2/instances/id/{instanceID}/users/id/{userID}:
    get:
      tags:
      - Usuarios
      summary: Consultar usuario
      operationId: getUser
      description: '**Permiso:** `stcpcore.user` ≥ 1 (lectura).'
      parameters:
      - in: path
        name: instanceID
        required: true
        description: ID de la instancia.
        schema:
          type: integer
          format: int64
      - in: path
        name: userID
        required: true
        description: ID del usuario.
        schema:
          type: integer
          format: int64
      responses:
        '200':
          description: Usuario encontrado.
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/ListEnvelope'
                - type: object
                  properties:
                    data:
                      type: array
                      items:
                        $ref: '#/components/schemas/User'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '500':
          $ref: '#/components/responses/InternalError'
    put:
      tags:
      - Usuarios
      summary: Modificar usuario
      operationId: updateUser
      description: |-
        **Permiso:** `stcpcore.user` ≥ 15 (lectura y escritura).

        Envíe la entidad completa. Los campos sensibles enmascarados (`****`) mantienen el valor guardado.
      parameters:
      - in: path
        name: instanceID
        required: true
        description: ID de la instancia.
        schema:
          type: integer
          format: int64
      - in: path
        name: userID
        required: true
        description: ID del usuario.
        schema:
          type: integer
          format: int64
      requestBody:
        required: true
        description: Usuario modificado.
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/User'
      responses:
        '200':
          description: Usuario modificado.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WriteResult'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '500':
          $ref: '#/components/responses/InternalError'
    delete:
      tags:
      - Usuarios
      summary: Eliminar usuario
      operationId: deleteUser
      description: '**Permiso:** `stcpcore.user` ≥ 15 (lectura y escritura).'
      parameters:
      - in: path
        name: instanceID
        required: true
        description: ID de la instancia.
        schema:
          type: integer
          format: int64
      - in: path
        name: userID
        required: true
        description: ID del usuario.
        schema:
          type: integer
          format: int64
      responses:
        '200':
          description: Usuario eliminado.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WriteResult'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '500':
          $ref: '#/components/responses/InternalError'
  /stcpcore/v2/instances/id/{instanceID}/services:
    get:
      tags:
      - Servicios de red
      summary: Listar servicios de red
      operationId: listNetworkServices
      description: |-
        **Permiso:** `stcpcore.service` ≥ 1 (lectura).

        Incluye los servicios de supervisión (Supervisión (gemini) y Supervisión (directlink)) y el servicio de la API de Riversoft STCP DirectLink.
      parameters:
      - in: path
        name: instanceID
        required: true
        description: ID de la instancia.
        schema:
          type: integer
          format: int64
      responses:
        '200':
          description: Servicios de red encontrados.
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/ListEnvelope'
                - type: object
                  properties:
                    data:
                      type: array
                      items:
                        $ref: '#/components/schemas/NetworkService'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '500':
          $ref: '#/components/responses/InternalError'
    post:
      tags:
      - Servicios de red
      summary: Crear servicio de red
      operationId: createNetworkService
      description: |-
        **Permiso:** `stcpcore.service` ≥ 15 (lectura y escritura).

        Envíe la entidad sin el campo `ID`. El header `Content-Type` debe ser exactamente `application/json`.
      parameters:
      - in: path
        name: instanceID
        required: true
        description: ID de la instancia.
        schema:
          type: integer
          format: int64
      requestBody:
        required: true
        description: Servicio de red a crear.
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/NetworkService'
      responses:
        '200':
          description: Servicio de red creado. `data` contiene el nombre de la entidad.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WriteResult'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '500':
          $ref: '#/components/responses/InternalError'
  /stcpcore/v2/instances/id/{instanceID}/services/id/{serviceID}:
    get:
      tags:
      - Servicios de red
      summary: Consultar servicio de red
      operationId: getNetworkService
      description: '**Permiso:** `stcpcore.service` ≥ 1 (lectura).'
      parameters:
      - in: path
        name: instanceID
        required: true
        description: ID de la instancia.
        schema:
          type: integer
          format: int64
      - in: path
        name: serviceID
        required: true
        description: ID del servicio de red.
        schema:
          type: integer
          format: int64
      responses:
        '200':
          description: Servicio de red encontrado.
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/ListEnvelope'
                - type: object
                  properties:
                    data:
                      type: array
                      items:
                        $ref: '#/components/schemas/NetworkService'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '500':
          $ref: '#/components/responses/InternalError'
    put:
      tags:
      - Servicios de red
      summary: Modificar servicio de red
      operationId: updateNetworkService
      description: |-
        **Permiso:** `stcpcore.service` ≥ 15 (lectura y escritura).

        Envíe la entidad completa. Los campos sensibles enmascarados (`****`) mantienen el valor guardado.
      parameters:
      - in: path
        name: instanceID
        required: true
        description: ID de la instancia.
        schema:
          type: integer
          format: int64
      - in: path
        name: serviceID
        required: true
        description: ID del servicio de red.
        schema:
          type: integer
          format: int64
      requestBody:
        required: true
        description: Servicio de red modificado.
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/NetworkService'
      responses:
        '200':
          description: Servicio de red modificado.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WriteResult'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '500':
          $ref: '#/components/responses/InternalError'
    delete:
      tags:
      - Servicios de red
      summary: Eliminar servicio de red
      operationId: deleteNetworkService
      description: '**Permiso:** `stcpcore.service` ≥ 15 (lectura y escritura).'
      parameters:
      - in: path
        name: instanceID
        required: true
        description: ID de la instancia.
        schema:
          type: integer
          format: int64
      - in: path
        name: serviceID
        required: true
        description: ID del servicio de red.
        schema:
          type: integer
          format: int64
      responses:
        '200':
          description: Servicio de red eliminado.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WriteResult'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '500':
          $ref: '#/components/responses/InternalError'
  /stcpcore/v2/instances/id/{instanceID}/schedules:
    get:
      tags:
      - Agendamientos
      summary: Listar agendamientos
      operationId: listSchedules
      description: '**Permiso:** `stcpcore.schedule` ≥ 1 (lectura).'
      parameters:
      - in: path
        name: instanceID
        required: true
        description: ID de la instancia.
        schema:
          type: integer
          format: int64
      responses:
        '200':
          description: Agendamientos encontrados.
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/ListEnvelope'
                - type: object
                  properties:
                    data:
                      type: array
                      items:
                        $ref: '#/components/schemas/Schedule'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '500':
          $ref: '#/components/responses/InternalError'
    post:
      tags:
      - Agendamientos
      summary: Crear agendamiento
      operationId: createSchedule
      description: |-
        **Permiso:** `stcpcore.schedule` ≥ 15 (lectura y escritura).

        Envíe la entidad sin el campo `ID`. El header `Content-Type` debe ser exactamente `application/json`.
      parameters:
      - in: path
        name: instanceID
        required: true
        description: ID de la instancia.
        schema:
          type: integer
          format: int64
      requestBody:
        required: true
        description: Agendamiento a crear.
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/Schedule'
      responses:
        '200':
          description: Agendamiento creado. `data` contiene el nombre de la entidad.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WriteResult'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '500':
          $ref: '#/components/responses/InternalError'
  /stcpcore/v2/instances/id/{instanceID}/schedules/id/{scheduleID}:
    get:
      tags:
      - Agendamientos
      summary: Consultar agendamiento
      operationId: getSchedule
      description: '**Permiso:** `stcpcore.schedule` ≥ 1 (lectura).'
      parameters:
      - in: path
        name: instanceID
        required: true
        description: ID de la instancia.
        schema:
          type: integer
          format: int64
      - in: path
        name: scheduleID
        required: true
        description: ID del agendamiento.
        schema:
          type: integer
          format: int64
      responses:
        '200':
          description: Agendamiento encontrado.
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/ListEnvelope'
                - type: object
                  properties:
                    data:
                      type: array
                      items:
                        $ref: '#/components/schemas/Schedule'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '500':
          $ref: '#/components/responses/InternalError'
    put:
      tags:
      - Agendamientos
      summary: Modificar agendamiento
      operationId: updateSchedule
      description: |-
        **Permiso:** `stcpcore.schedule` ≥ 15 (lectura y escritura).

        Envíe la entidad completa. Los campos sensibles enmascarados (`****`) mantienen el valor guardado.
      parameters:
      - in: path
        name: instanceID
        required: true
        description: ID de la instancia.
        schema:
          type: integer
          format: int64
      - in: path
        name: scheduleID
        required: true
        description: ID del agendamiento.
        schema:
          type: integer
          format: int64
      requestBody:
        required: true
        description: Agendamiento modificado.
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/Schedule'
      responses:
        '200':
          description: Agendamiento modificado.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WriteResult'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '500':
          $ref: '#/components/responses/InternalError'
    delete:
      tags:
      - Agendamientos
      summary: Eliminar agendamiento
      operationId: deleteSchedule
      description: '**Permiso:** `stcpcore.schedule` ≥ 15 (lectura y escritura).'
      parameters:
      - in: path
        name: instanceID
        required: true
        description: ID de la instancia.
        schema:
          type: integer
          format: int64
      - in: path
        name: scheduleID
        required: true
        description: ID del agendamiento.
        schema:
          type: integer
          format: int64
      responses:
        '200':
          description: Agendamiento eliminado.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WriteResult'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '500':
          $ref: '#/components/responses/InternalError'
  /stcpcore/v2/instances/id/{instanceID}/ftypesglobal:
    get:
      tags:
      - Tipos de archivo
      summary: Listar tipos de archivo globales
      operationId: listFileTypeGlobals
      description: |-
        **Permiso:** `stcpcore.filetypeglobal` ≥ 1 (lectura).

        Tipos de archivo aplicados cuando el usuario no tiene un tipo propio que corresponda al archivo.
      parameters:
      - in: path
        name: instanceID
        required: true
        description: ID de la instancia.
        schema:
          type: integer
          format: int64
      responses:
        '200':
          description: Tipos de archivo globales encontrados.
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/ListEnvelope'
                - type: object
                  properties:
                    data:
                      type: array
                      items:
                        $ref: '#/components/schemas/FileTypeGlobal'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '500':
          $ref: '#/components/responses/InternalError'
    post:
      tags:
      - Tipos de archivo
      summary: Crear tipo de archivo global
      operationId: createFileTypeGlobal
      description: |-
        **Permiso:** `stcpcore.filetypeglobal` ≥ 15 (lectura y escritura).

        Envíe la entidad sin el campo `ID`. El header `Content-Type` debe ser exactamente `application/json`.
      parameters:
      - in: path
        name: instanceID
        required: true
        description: ID de la instancia.
        schema:
          type: integer
          format: int64
      requestBody:
        required: true
        description: Tipo de archivo global a crear.
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/FileTypeGlobal'
      responses:
        '200':
          description: Tipo de archivo global creado. `data` contiene el nombre de la entidad.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WriteResult'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '500':
          $ref: '#/components/responses/InternalError'
  /stcpcore/v2/instances/id/{instanceID}/ftypesglobal/id/{ftypesglobalID}:
    get:
      tags:
      - Tipos de archivo
      summary: Consultar tipo de archivo global
      operationId: getFileTypeGlobal
      description: '**Permiso:** `stcpcore.filetypeglobal` ≥ 1 (lectura).'
      parameters:
      - in: path
        name: instanceID
        required: true
        description: ID de la instancia.
        schema:
          type: integer
          format: int64
      - in: path
        name: ftypesglobalID
        required: true
        description: ID del tipo de archivo global.
        schema:
          type: integer
          format: int64
      responses:
        '200':
          description: Tipo de archivo global encontrado.
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/ListEnvelope'
                - type: object
                  properties:
                    data:
                      type: array
                      items:
                        $ref: '#/components/schemas/FileTypeGlobal'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '500':
          $ref: '#/components/responses/InternalError'
    put:
      tags:
      - Tipos de archivo
      summary: Modificar tipo de archivo global
      operationId: updateFileTypeGlobal
      description: |-
        **Permiso:** `stcpcore.filetypeglobal` ≥ 15 (lectura y escritura).

        Envíe la entidad completa. Los campos sensibles enmascarados (`****`) mantienen el valor guardado.
      parameters:
      - in: path
        name: instanceID
        required: true
        description: ID de la instancia.
        schema:
          type: integer
          format: int64
      - in: path
        name: ftypesglobalID
        required: true
        description: ID del tipo de archivo global.
        schema:
          type: integer
          format: int64
      requestBody:
        required: true
        description: Tipo de archivo global modificado.
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/FileTypeGlobal'
      responses:
        '200':
          description: Tipo de archivo global modificado.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WriteResult'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '500':
          $ref: '#/components/responses/InternalError'
    delete:
      tags:
      - Tipos de archivo
      summary: Eliminar tipo de archivo global
      operationId: deleteFileTypeGlobal
      description: '**Permiso:** `stcpcore.filetypeglobal` ≥ 15 (lectura y escritura).'
      parameters:
      - in: path
        name: instanceID
        required: true
        description: ID de la instancia.
        schema:
          type: integer
          format: int64
      - in: path
        name: ftypesglobalID
        required: true
        description: ID del tipo de archivo global.
        schema:
          type: integer
          format: int64
      responses:
        '200':
          description: Tipo de archivo global eliminado.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WriteResult'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '500':
          $ref: '#/components/responses/InternalError'
  /stcpcore/v2/instances/id/{instanceID}/ftypesglobal/check:
    get:
      tags:
      - Tipos de archivo
      summary: Probar un nombre de archivo en los tipos globales
      operationId: checkFileTypeGlobal
      description: |-
        **Permiso:** `stcpcore.filetypeglobal` ≥ 1 (lectura).

        Devuelve los tipos de archivo globales cuya expresión regular corresponde al nombre indicado.
      parameters:
      - in: path
        name: instanceID
        required: true
        description: ID de la instancia.
        schema:
          type: integer
          format: int64
      - in: query
        name: filename
        required: true
        description: Nombre del archivo a probar.
        schema:
          type: string
      responses:
        '200':
          description: Tipos correspondientes.
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/ListEnvelope'
                - type: object
                  properties:
                    data:
                      type: array
                      items:
                        $ref: '#/components/schemas/FileTypeGlobal'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '500':
          $ref: '#/components/responses/InternalError'
  /stcpcore/v2/instances/id/{instanceID}/users/id/{userID}/filetypes:
    get:
      tags:
      - Tipos de archivo
      summary: Listar tipos de archivo del usuario
      operationId: listFileTypes
      description: '**Permiso:** `stcpcore.filetype` ≥ 1 (lectura).'
      parameters:
      - in: path
        name: instanceID
        required: true
        description: ID de la instancia.
        schema:
          type: integer
          format: int64
      - in: path
        name: userID
        required: true
        description: ID del usuario.
        schema:
          type: integer
          format: int64
      responses:
        '200':
          description: Tipos de archivo del usuario encontrados.
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/ListEnvelope'
                - type: object
                  properties:
                    data:
                      type: array
                      items:
                        $ref: '#/components/schemas/FileType'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '500':
          $ref: '#/components/responses/InternalError'
    post:
      tags:
      - Tipos de archivo
      summary: Crear tipo de archivo del usuario
      operationId: createFileType
      description: |-
        **Permiso:** `stcpcore.filetype` ≥ 15 (lectura y escritura).

        Envíe la entidad sin el campo `ID`. El header `Content-Type` debe ser exactamente `application/json`.
      parameters:
      - in: path
        name: instanceID
        required: true
        description: ID de la instancia.
        schema:
          type: integer
          format: int64
      - in: path
        name: userID
        required: true
        description: ID del usuario.
        schema:
          type: integer
          format: int64
      requestBody:
        required: true
        description: Tipo de archivo del usuario a crear.
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/FileType'
      responses:
        '200':
          description: Tipo de archivo del usuario creado. `data` contiene el nombre de la entidad.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WriteResult'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '500':
          $ref: '#/components/responses/InternalError'
  /stcpcore/v2/instances/id/{instanceID}/users/id/{userID}/filetypes/id/{filetypeID}:
    get:
      tags:
      - Tipos de archivo
      summary: Consultar tipo de archivo del usuario
      operationId: getFileType
      description: '**Permiso:** `stcpcore.filetype` ≥ 1 (lectura).'
      parameters:
      - in: path
        name: instanceID
        required: true
        description: ID de la instancia.
        schema:
          type: integer
          format: int64
      - in: path
        name: userID
        required: true
        description: ID del usuario.
        schema:
          type: integer
          format: int64
      - in: path
        name: filetypeID
        required: true
        description: ID del tipo de archivo del usuario.
        schema:
          type: integer
          format: int64
      responses:
        '200':
          description: Tipo de archivo del usuario encontrado.
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/ListEnvelope'
                - type: object
                  properties:
                    data:
                      type: array
                      items:
                        $ref: '#/components/schemas/FileType'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '500':
          $ref: '#/components/responses/InternalError'
    put:
      tags:
      - Tipos de archivo
      summary: Modificar tipo de archivo del usuario
      operationId: updateFileType
      description: |-
        **Permiso:** `stcpcore.filetype` ≥ 15 (lectura y escritura).

        Envíe la entidad completa. Los campos sensibles enmascarados (`****`) mantienen el valor guardado.
      parameters:
      - in: path
        name: instanceID
        required: true
        description: ID de la instancia.
        schema:
          type: integer
          format: int64
      - in: path
        name: userID
        required: true
        description: ID del usuario.
        schema:
          type: integer
          format: int64
      - in: path
        name: filetypeID
        required: true
        description: ID del tipo de archivo del usuario.
        schema:
          type: integer
          format: int64
      requestBody:
        required: true
        description: Tipo de archivo del usuario modificado.
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/FileType'
      responses:
        '200':
          description: Tipo de archivo del usuario modificado.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WriteResult'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '500':
          $ref: '#/components/responses/InternalError'
    delete:
      tags:
      - Tipos de archivo
      summary: Eliminar tipo de archivo del usuario
      operationId: deleteFileType
      description: '**Permiso:** `stcpcore.filetype` ≥ 15 (lectura y escritura).'
      parameters:
      - in: path
        name: instanceID
        required: true
        description: ID de la instancia.
        schema:
          type: integer
          format: int64
      - in: path
        name: userID
        required: true
        description: ID del usuario.
        schema:
          type: integer
          format: int64
      - in: path
        name: filetypeID
        required: true
        description: ID del tipo de archivo del usuario.
        schema:
          type: integer
          format: int64
      responses:
        '200':
          description: Tipo de archivo del usuario eliminado.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WriteResult'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '500':
          $ref: '#/components/responses/InternalError'
  /stcpcore/v2/instances/id/{instanceID}/users/id/{userID}/filetypes/check:
    get:
      tags:
      - Tipos de archivo
      summary: Probar un nombre de archivo en los tipos del usuario
      operationId: checkFileType
      description: |-
        **Permiso:** `stcpcore.filetype` ≥ 1 (lectura).

        Devuelve los tipos de archivo del usuario cuya expresión regular corresponde al nombre indicado.
      parameters:
      - in: path
        name: instanceID
        required: true
        description: ID de la instancia.
        schema:
          type: integer
          format: int64
      - in: path
        name: userID
        required: true
        description: ID del usuario.
        schema:
          type: integer
          format: int64
      - in: query
        name: filename
        required: true
        description: Nombre del archivo a probar.
        schema:
          type: string
      responses:
        '200':
          description: Tipos correspondientes.
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/ListEnvelope'
                - type: object
                  properties:
                    data:
                      type: array
                      items:
                        $ref: '#/components/schemas/FileType'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '500':
          $ref: '#/components/responses/InternalError'
  /stcpcore/v2/instances/id/{instanceID}/routing:
    get:
      tags:
      - Enrutamientos
      summary: Listar enrutamientos
      operationId: listRoutings
      description: |-
        **Permiso:** `stcpcore.routing` ≥ 1 (lectura).

        Enrutamientos y reglas usados por Riversoft STCP Gemini Rename.
      parameters:
      - in: path
        name: instanceID
        required: true
        description: ID de la instancia.
        schema:
          type: integer
          format: int64
      responses:
        '200':
          description: Enrutamientos encontrados.
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/ListEnvelope'
                - type: object
                  properties:
                    data:
                      type: array
                      items:
                        $ref: '#/components/schemas/Routing'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '500':
          $ref: '#/components/responses/InternalError'
    post:
      tags:
      - Enrutamientos
      summary: Crear enrutamiento
      operationId: createRouting
      description: '**Permiso:** `stcpcore.routing` ≥ 15 (lectura y escritura).'
      parameters:
      - in: path
        name: instanceID
        required: true
        description: ID de la instancia.
        schema:
          type: integer
          format: int64
      requestBody:
        required: true
        description: Enrutamiento a crear.
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/Routing'
      responses:
        '200':
          description: Enrutamiento creado.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WriteResult'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '500':
          $ref: '#/components/responses/InternalError'
    put:
      tags:
      - Enrutamientos
      summary: Modificar enrutamiento
      operationId: updateRouting
      description: |-
        **Permiso:** `stcpcore.routing` ≥ 15 (lectura y escritura).

        El enrutamiento se identifica por el `ID` enviado en el cuerpo.
      parameters:
      - in: path
        name: instanceID
        required: true
        description: ID de la instancia.
        schema:
          type: integer
          format: int64
      requestBody:
        required: true
        description: Enrutamiento modificado.
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/Routing'
      responses:
        '200':
          description: Enrutamiento modificado.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WriteResult'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '500':
          $ref: '#/components/responses/InternalError'
  /stcpcore/v2/instances/id/{instanceID}/routing/id/{bundleID}:
    get:
      tags:
      - Enrutamientos
      summary: Consultar enrutamiento
      operationId: getRouting
      description: '**Permiso:** `stcpcore.routing` ≥ 1 (lectura).'
      parameters:
      - in: path
        name: instanceID
        required: true
        description: ID de la instancia.
        schema:
          type: integer
          format: int64
      - in: path
        name: bundleID
        required: true
        description: ID del enrutamiento.
        schema:
          type: integer
          format: int64
      responses:
        '200':
          description: Enrutamiento encontrado.
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/ListEnvelope'
                - type: object
                  properties:
                    data:
                      type: array
                      items:
                        $ref: '#/components/schemas/Routing'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '500':
          $ref: '#/components/responses/InternalError'
    delete:
      tags:
      - Enrutamientos
      summary: Eliminar enrutamiento
      operationId: deleteRouting
      description: '**Permiso:** `stcpcore.routing` ≥ 15 (lectura y escritura).'
      parameters:
      - in: path
        name: instanceID
        required: true
        description: ID de la instancia.
        schema:
          type: integer
          format: int64
      - in: path
        name: bundleID
        required: true
        description: ID del enrutamiento.
        schema:
          type: integer
          format: int64
      responses:
        '200':
          description: Enrutamiento eliminado.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WriteResult'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '500':
          $ref: '#/components/responses/InternalError'
  /stcpcore/v2/instances/id/{instanceID}/routing/name/{bundleName}:
    get:
      tags:
      - Enrutamientos
      summary: Consultar enrutamiento por nombre
      operationId: getRoutingByName
      description: '**Permiso:** `stcpcore.routing` ≥ 1 (lectura).'
      parameters:
      - in: path
        name: instanceID
        required: true
        description: ID de la instancia.
        schema:
          type: integer
          format: int64
      - in: path
        name: bundleName
        required: true
        description: Nombre del enrutamiento.
        schema:
          type: string
      responses:
        '200':
          description: Enrutamiento encontrado.
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/ListEnvelope'
                - type: object
                  properties:
                    data:
                      type: array
                      items:
                        $ref: '#/components/schemas/Routing'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '500':
          $ref: '#/components/responses/InternalError'
  /stcpadmin/v2/operators:
    get:
      tags:
      - Operadores
      summary: Listar operadores
      operationId: listOperators
      description: '**Permiso:** `stcpadmin.operator` ≥ 1 (lectura).'
      responses:
        '200':
          description: Operadores encontrados.
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/ListEnvelope'
                - type: object
                  properties:
                    data:
                      type: array
                      items:
                        $ref: '#/components/schemas/Operator'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '500':
          $ref: '#/components/responses/InternalError'
    post:
      tags:
      - Operadores
      summary: Crear operador
      operationId: createOperator
      description: |-
        **Permiso:** `stcpadmin.operator` ≥ 15 (lectura y escritura).

        Envíe la entidad sin el campo `ID`. El header `Content-Type` debe ser exactamente `application/json`.
      requestBody:
        required: true
        description: Operador a crear.
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/Operator'
      responses:
        '200':
          description: Operador creado. `data` contiene el nombre de la entidad.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WriteResult'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '500':
          $ref: '#/components/responses/InternalError'
  /stcpadmin/v2/operators/id/{operatorID}:
    get:
      tags:
      - Operadores
      summary: Consultar operador
      operationId: getOperator
      description: '**Permiso:** `stcpadmin.operator` ≥ 1 (lectura).'
      parameters:
      - in: path
        name: operatorID
        required: true
        description: ID del operador.
        schema:
          type: integer
          format: int64
      responses:
        '200':
          description: Operador encontrado.
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/ListEnvelope'
                - type: object
                  properties:
                    data:
                      type: array
                      items:
                        $ref: '#/components/schemas/Operator'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '500':
          $ref: '#/components/responses/InternalError'
    put:
      tags:
      - Operadores
      summary: Modificar operador
      operationId: updateOperator
      description: |-
        **Permiso:** `stcpadmin.operator` ≥ 15 (lectura y escritura).

        Envíe la entidad completa. Los campos sensibles enmascarados (`****`) mantienen el valor guardado.
      parameters:
      - in: path
        name: operatorID
        required: true
        description: ID del operador.
        schema:
          type: integer
          format: int64
      requestBody:
        required: true
        description: Operador modificado.
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/Operator'
      responses:
        '200':
          description: Operador modificado.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WriteResult'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '500':
          $ref: '#/components/responses/InternalError'
    delete:
      tags:
      - Operadores
      summary: Eliminar operador
      operationId: deleteOperator
      description: '**Permiso:** `stcpadmin.operator` ≥ 15 (lectura y escritura).'
      parameters:
      - in: path
        name: operatorID
        required: true
        description: ID del operador.
        schema:
          type: integer
          format: int64
      responses:
        '200':
          description: Operador eliminado.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WriteResult'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '500':
          $ref: '#/components/responses/InternalError'
  /stcpadmin/v2/operators/me:
    get:
      tags:
      - Operadores
      summary: Consultar el propio perfil
      operationId: getMyProfile
      description: '**Permiso:** `stcpadmin.operator` ≥ 1 (lectura).'
      responses:
        '200':
          description: Perfil del operador autenticado.
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: '#/components/schemas/Operator'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '500':
          $ref: '#/components/responses/InternalError'
    put:
      tags:
      - Operadores
      summary: Modificar el propio perfil
      operationId: updateMyProfile
      description: '**Permiso:** `stcpadmin.operator` ≥ 15 (lectura y escritura).'
      requestBody:
        required: true
        description: Perfil modificado.
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/Operator'
      responses:
        '200':
          description: Perfil modificado.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WriteResult'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '500':
          $ref: '#/components/responses/InternalError'
  /stcpadmin/v2/operators/me/password:
    put:
      tags:
      - Operadores
      summary: Cambiar la propia contraseña
      operationId: updateMyPassword
      description: |-
        **Permiso:** `stcpadmin.operator` ≥ 15 (lectura y escritura).

        La nueva contraseña se valida contra las políticas de contraseña del registro de la API, incluido el historial de contraseñas.
      requestBody:
        required: true
        description: Nueva contraseña.
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/NewPasswordRequest'
            example:
              NewPassword: <nova-senha>
      responses:
        '200':
          description: Contraseña cambiada.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WriteResult'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '500':
          $ref: '#/components/responses/InternalError'
  /stcpadmin/v2/groups:
    get:
      tags:
      - Grupos y permisos
      summary: Listar grupos
      operationId: listGroups
      description: |-
        **Permiso:** `stcpadmin.group` ≥ 1 (lectura).

        Los grupos definen los permisos de los operadores y las instancias, operadores y usuarios a los que tienen acceso.
      responses:
        '200':
          description: Grupos encontrados.
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/ListEnvelope'
                - type: object
                  properties:
                    data:
                      type: array
                      items:
                        $ref: '#/components/schemas/Group'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '500':
          $ref: '#/components/responses/InternalError'
    post:
      tags:
      - Grupos y permisos
      summary: Crear grupo
      operationId: createGroup
      description: |-
        **Permiso:** `stcpadmin.group` ≥ 15 (lectura y escritura).

        Envíe la entidad sin el campo `ID`. El header `Content-Type` debe ser exactamente `application/json`.
      requestBody:
        required: true
        description: Grupo a crear.
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/Group'
      responses:
        '200':
          description: Grupo creado. `data` contiene el nombre de la entidad.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WriteResult'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '500':
          $ref: '#/components/responses/InternalError'
  /stcpadmin/v2/groups/id/{groupID}:
    get:
      tags:
      - Grupos y permisos
      summary: Consultar grupo
      operationId: getGroup
      description: '**Permiso:** `stcpadmin.group` ≥ 1 (lectura).'
      parameters:
      - in: path
        name: groupID
        required: true
        description: ID del grupo.
        schema:
          type: integer
          format: int64
      responses:
        '200':
          description: Grupo encontrado.
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/ListEnvelope'
                - type: object
                  properties:
                    data:
                      type: array
                      items:
                        $ref: '#/components/schemas/Group'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '500':
          $ref: '#/components/responses/InternalError'
    put:
      tags:
      - Grupos y permisos
      summary: Modificar grupo
      operationId: updateGroup
      description: |-
        **Permiso:** `stcpadmin.group` ≥ 15 (lectura y escritura).

        Envíe la entidad completa. Los campos sensibles enmascarados (`****`) mantienen el valor guardado.
      parameters:
      - in: path
        name: groupID
        required: true
        description: ID del grupo.
        schema:
          type: integer
          format: int64
      requestBody:
        required: true
        description: Grupo modificado.
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/Group'
      responses:
        '200':
          description: Grupo modificado.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WriteResult'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '500':
          $ref: '#/components/responses/InternalError'
    delete:
      tags:
      - Grupos y permisos
      summary: Eliminar grupo
      operationId: deleteGroup
      description: '**Permiso:** `stcpadmin.group` ≥ 15 (lectura y escritura).'
      parameters:
      - in: path
        name: groupID
        required: true
        description: ID del grupo.
        schema:
          type: integer
          format: int64
      responses:
        '200':
          description: Grupo eliminado.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WriteResult'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '500':
          $ref: '#/components/responses/InternalError'
  /stcpadmin/v2/groups/id/{groupID}/operators:
    get:
      tags:
      - Grupos y permisos
      summary: Listar operadores del grupo
      operationId: listGroupOperators
      description: '**Permiso:** `stcpadmin.group` ≥ 1 (lectura).'
      parameters:
      - in: path
        name: groupID
        required: true
        description: ID del grupo.
        schema:
          type: integer
          format: int64
      responses:
        '200':
          description: Operadores del grupo.
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      type: object
                      properties:
                        ID:
                          type: integer
                        Name:
                          type: string
        '404':
          $ref: '#/components/responses/NotFound'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
  /stcpadmin/v2/settings:
    get:
      tags:
      - Registro de la API
      summary: Listar registros de la API
      operationId: listApiSettings
      description: |-
        **Permiso:** `stcpadmin.setting` ≥ 1 (lectura).

        El registro de la API (API/Supervisión en el Riversoft Console Portal) guarda TLS, dirección, 2FA, políticas de contraseña, proveedores de SSO y los nodos de supervisión. Al iniciar, la API carga el registro cuyo nombre es igual al `rest_name` del `config.json`.
      responses:
        '200':
          description: Registros de la API encontrados.
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/ListEnvelope'
                - type: object
                  properties:
                    data:
                      type: array
                      items:
                        $ref: '#/components/schemas/ApiSetting'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '500':
          $ref: '#/components/responses/InternalError'
    post:
      tags:
      - Registro de la API
      summary: Crear registro de la API
      operationId: createApiSetting
      description: |-
        **Permiso:** `stcpadmin.setting` ≥ 15 (lectura y escritura).

        Envíe la entidad sin el campo `ID`. El header `Content-Type` debe ser exactamente `application/json`.
      requestBody:
        required: true
        description: Registro de la API a crear.
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ApiSetting'
      responses:
        '200':
          description: Registro de la API creado. `data` contiene el nombre de la entidad.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WriteResult'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '500':
          $ref: '#/components/responses/InternalError'
  /stcpadmin/v2/settings/id/{apiID}:
    get:
      tags:
      - Registro de la API
      summary: Consultar registro de la API
      operationId: getApiSetting
      description: '**Permiso:** `stcpadmin.setting` ≥ 1 (lectura).'
      parameters:
      - in: path
        name: apiID
        required: true
        description: ID del registro de la API.
        schema:
          type: integer
          format: int64
      responses:
        '200':
          description: Registro de la API encontrado.
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/ListEnvelope'
                - type: object
                  properties:
                    data:
                      type: array
                      items:
                        $ref: '#/components/schemas/ApiSetting'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '500':
          $ref: '#/components/responses/InternalError'
    put:
      tags:
      - Registro de la API
      summary: Modificar registro de la API
      operationId: updateApiSetting
      description: |-
        **Permiso:** `stcpadmin.setting` ≥ 15 (lectura y escritura).

        Envíe la entidad completa. Los campos sensibles enmascarados (`****`) mantienen el valor guardado.
      parameters:
      - in: path
        name: apiID
        required: true
        description: ID del registro de la API.
        schema:
          type: integer
          format: int64
      requestBody:
        required: true
        description: Registro de la API modificado.
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ApiSetting'
      responses:
        '200':
          description: Registro de la API modificado.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WriteResult'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '500':
          $ref: '#/components/responses/InternalError'
    delete:
      tags:
      - Registro de la API
      summary: Eliminar registro de la API
      operationId: deleteApiSetting
      description: '**Permiso:** `stcpadmin.setting` ≥ 15 (lectura y escritura).'
      parameters:
      - in: path
        name: apiID
        required: true
        description: ID del registro de la API.
        schema:
          type: integer
          format: int64
      responses:
        '200':
          description: Registro de la API eliminado.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WriteResult'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '500':
          $ref: '#/components/responses/InternalError'
  /stcpadmin/v2/api/policies:
    get:
      tags:
      - Registro de la API
      summary: Consultar políticas de contraseña
      operationId: getPasswordPolicies
      description: '**Permiso:** `stcpadmin.operator` ≥ 15 (lectura y escritura).'
      responses:
        '200':
          description: Políticas de contraseña vigentes.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PoliciesResponse'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '500':
          $ref: '#/components/responses/InternalError'
  /stcpadmin/v2/error_events:
    get:
      tags:
      - Códigos de error y evento
      summary: Listar códigos de error y evento
      operationId: listErrorEvents
      description: |-
        **Permiso:** `stcpadmin.error_event` ≥ 1 (lectura).

        Descripción y procedimientos asociados a los códigos de mensaje (`MSGnnnn`).
      responses:
        '200':
          description: Códigos de error y evento encontrados.
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/ListEnvelope'
                - type: object
                  properties:
                    data:
                      type: array
                      items:
                        $ref: '#/components/schemas/ErrorEvent'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '500':
          $ref: '#/components/responses/InternalError'
    post:
      tags:
      - Códigos de error y evento
      summary: Crear código de error o evento
      operationId: createErrorEvent
      description: |-
        **Permiso:** `stcpadmin.error_event` ≥ 15 (lectura y escritura).

        Envíe la entidad sin el campo `ID`. El header `Content-Type` debe ser exactamente `application/json`.
      requestBody:
        required: true
        description: Código de error o evento a crear.
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ErrorEvent'
      responses:
        '200':
          description: Código de error o evento creado. `data` contiene el nombre de la entidad.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WriteResult'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '500':
          $ref: '#/components/responses/InternalError'
  /stcpadmin/v2/error_events/id/{eeID}:
    get:
      tags:
      - Códigos de error y evento
      summary: Consultar código de error o evento
      operationId: getErrorEvent
      description: '**Permiso:** `stcpadmin.error_event` ≥ 1 (lectura).'
      parameters:
      - in: path
        name: eeID
        required: true
        description: ID del código de error o evento.
        schema:
          type: integer
          format: int64
      responses:
        '200':
          description: Código de error o evento encontrado.
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/ListEnvelope'
                - type: object
                  properties:
                    data:
                      type: array
                      items:
                        $ref: '#/components/schemas/ErrorEvent'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '500':
          $ref: '#/components/responses/InternalError'
    put:
      tags:
      - Códigos de error y evento
      summary: Modificar código de error o evento
      operationId: updateErrorEvent
      description: |-
        **Permiso:** `stcpadmin.error_event` ≥ 15 (lectura y escritura).

        Envíe la entidad completa. Los campos sensibles enmascarados (`****`) mantienen el valor guardado.
      parameters:
      - in: path
        name: eeID
        required: true
        description: ID del código de error o evento.
        schema:
          type: integer
          format: int64
      requestBody:
        required: true
        description: Código de error o evento modificado.
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ErrorEvent'
      responses:
        '200':
          description: Código de error o evento modificado.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WriteResult'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '500':
          $ref: '#/components/responses/InternalError'
    delete:
      tags:
      - Códigos de error y evento
      summary: Eliminar código de error o evento
      operationId: deleteErrorEvent
      description: '**Permiso:** `stcpadmin.error_event` ≥ 15 (lectura y escritura).'
      parameters:
      - in: path
        name: eeID
        required: true
        description: ID del código de error o evento.
        schema:
          type: integer
          format: int64
      responses:
        '200':
          description: Código de error o evento eliminado.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WriteResult'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '500':
          $ref: '#/components/responses/InternalError'
  /stcpadminsvc/v2/supervision/stcpmon/monitor/nodes:
    post:
      tags:
      - Supervisión
      summary: Listar nodos de supervisión
      operationId: listMonitorNodes
      description: |-
        **Permiso:** `stcpadminsvc.mon_console_info` ≥ 1 (lectura).

        Nodos de supervisión habilitados en el registro de la API (Riversoft STCP Gemini Server y Riversoft STCP DirectLink).
      responses:
        '200':
          description: Nodos habilitados.
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: '#/components/schemas/SupervisionNode'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '500':
          $ref: '#/components/responses/InternalError'
  /stcpadminsvc/v2/supervision/stcpmon/instance/info:
    post:
      tags:
      - Supervisión
      summary: Información de la instancia
      operationId: getInstanceInfo
      description: |-
        Estado y datos de la instancia en ejecución.

        **Permiso:** `stcpadminsvc.mon_inst_info` ≥ 1 (lectura).

        La API envía el comando a los nodos de supervisión habilitados para la instancia indicada en `Instance`; con `Node`, solo al nodo indicado.
      requestBody:
        required: true
        description: Instancia, nodo y argumentos del comando.
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SupervisionCommand'
            example:
              Instance: TESTE
              Name: PARCEIRO01
              Node: ''
              Level: ''
      responses:
        '200':
          description: Respuestas de cada nodo.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SupervisionResponse'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '500':
          $ref: '#/components/responses/InternalError'
  /stcpadminsvc/v2/supervision/stcpmon/instance/restart:
    post:
      tags:
      - Supervisión
      summary: Reiniciar la instancia
      operationId: restartInstance
      description: |-
        Reinicia la instancia en el nodo indicado.

        **Permiso:** `stcpadminsvc.mon_inst_restart` ≥ 1 (lectura).

        La API envía el comando a los nodos de supervisión habilitados para la instancia indicada en `Instance`; con `Node`, solo al nodo indicado.
      requestBody:
        required: true
        description: Instancia, nodo y argumentos del comando.
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SupervisionCommand'
            example:
              Instance: TESTE
              Name: PARCEIRO01
              Node: ''
              Level: ''
      responses:
        '200':
          description: Respuestas de cada nodo.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SupervisionResponse'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '500':
          $ref: '#/components/responses/InternalError'
  /stcpadminsvc/v2/supervision/stcpmon/instance/debug:
    post:
      tags:
      - Supervisión
      summary: Cambiar el nivel de debug
      operationId: setDebugLevel
      description: |-
        Cambia el nivel de debug sin reiniciar el servicio. Indique el nivel en `Level`.

        **Permiso:** `stcpadminsvc.main_set_level` ≥ 1 (lectura).

        La API envía el comando a los nodos de supervisión habilitados para la instancia indicada en `Instance`; con `Node`, solo al nodo indicado.
      requestBody:
        required: true
        description: Instancia, nodo y argumentos del comando.
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SupervisionCommand'
            example:
              Instance: TESTE
              Name: PARCEIRO01
              Node: ''
              Level: ''
      responses:
        '200':
          description: Respuestas de cada nodo.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SupervisionResponse'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '500':
          $ref: '#/components/responses/InternalError'
  /stcpadminsvc/v2/supervision/stcpmon/instance/console:
    post:
      tags:
      - Supervisión
      summary: Mensajes de la consola
      operationId: getConsoleInfo
      description: |-
        Últimos mensajes de la consola de la instancia.

        **Permiso:** `stcpadminsvc.mon_console_info` ≥ 1 (lectura).

        La API envía el comando a los nodos de supervisión habilitados para la instancia indicada en `Instance`; con `Node`, solo al nodo indicado.
      requestBody:
        required: true
        description: Instancia, nodo y argumentos del comando.
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SupervisionCommand'
            example:
              Instance: TESTE
              Name: PARCEIRO01
              Node: ''
              Level: ''
      responses:
        '200':
          description: Respuestas de cada nodo.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SupervisionResponse'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '500':
          $ref: '#/components/responses/InternalError'
  /stcpadminsvc/v2/supervision/stcpmon/user/info:
    post:
      tags:
      - Supervisión
      summary: Información de usuarios
      operationId: getUserInfo
      description: |-
        Estado de los buzones y de las conexiones de los usuarios. Indique `Name` para un usuario específico.

        **Permiso:** `stcpadminsvc.mon_user_info` ≥ 1 (lectura).

        La API envía el comando a los nodos de supervisión habilitados para la instancia indicada en `Instance`; con `Node`, solo al nodo indicado.
      requestBody:
        required: true
        description: Instancia, nodo y argumentos del comando.
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SupervisionCommand'
            example:
              Instance: TESTE
              Name: PARCEIRO01
              Node: ''
              Level: ''
      responses:
        '200':
          description: Respuestas de cada nodo.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SupervisionResponse'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '500':
          $ref: '#/components/responses/InternalError'
  /stcpadminsvc/v2/supervision/stcpmon/user/start:
    post:
      tags:
      - Supervisión
      summary: Iniciar conexión de salida
      operationId: startUserConnection
      description: |-
        Inicia una conexión de salida con el usuario indicado en `Name`.

        **Permiso:** `stcpadminsvc.mon_user_start_conn` ≥ 1 (lectura).

        La API envía el comando a los nodos de supervisión habilitados para la instancia indicada en `Instance`; con `Node`, solo al nodo indicado.
      requestBody:
        required: true
        description: Instancia, nodo y argumentos del comando.
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SupervisionCommand'
            example:
              Instance: TESTE
              Name: PARCEIRO01
              Node: ''
              Level: ''
      responses:
        '200':
          description: Respuestas de cada nodo.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SupervisionResponse'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '500':
          $ref: '#/components/responses/InternalError'
  /stcpadminsvc/v2/supervision/stcpmon/user/stop:
    post:
      tags:
      - Supervisión
      summary: Cancelar conexión
      operationId: stopUserConnection
      description: |-
        Cancela la conexión en curso del usuario indicado en `Name`.

        **Permiso:** `stcpadminsvc.mon_user_canc_conn` ≥ 1 (lectura).

        La API envía el comando a los nodos de supervisión habilitados para la instancia indicada en `Instance`; con `Node`, solo al nodo indicado.
      requestBody:
        required: true
        description: Instancia, nodo y argumentos del comando.
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SupervisionCommand'
            example:
              Instance: TESTE
              Name: PARCEIRO01
              Node: ''
              Level: ''
      responses:
        '200':
          description: Respuestas de cada nodo.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SupervisionResponse'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '500':
          $ref: '#/components/responses/InternalError'
  /stcpadminsvc/v2/supervision/stcpmon/user/create_folder:
    post:
      tags:
      - Supervisión
      summary: Crear la estructura de directorios
      operationId: createUserFolders
      description: |-
        Crea la estructura de directorios del buzón del usuario indicado en `Name`.

        **Permiso:** `stcpadminsvc.main_user_create_folders` ≥ 1 (lectura).

        La API envía el comando a los nodos de supervisión habilitados para la instancia indicada en `Instance`; con `Node`, solo al nodo indicado.
      requestBody:
        required: true
        description: Instancia, nodo y argumentos del comando.
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SupervisionCommand'
            example:
              Instance: TESTE
              Name: PARCEIRO01
              Node: ''
              Level: ''
      responses:
        '200':
          description: Respuestas de cada nodo.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SupervisionResponse'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '500':
          $ref: '#/components/responses/InternalError'
  /stcpadminsvc/v2/supervision/stcpmon/schedule/start:
    post:
      tags:
      - Supervisión
      summary: Ejecutar agenda
      operationId: startSchedule
      description: |-
        Ejecuta en el momento la agenda indicada en `Name`.

        **Permiso:** `stcpadminsvc.mon_sched_exec` ≥ 1 (lectura).

        La API envía el comando a los nodos de supervisión habilitados para la instancia indicada en `Instance`; con `Node`, solo al nodo indicado.
      requestBody:
        required: true
        description: Instancia, nodo y argumentos del comando.
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SupervisionCommand'
            example:
              Instance: TESTE
              Name: PARCEIRO01
              Node: ''
              Level: ''
      responses:
        '200':
          description: Respuestas de cada nodo.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SupervisionResponse'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '500':
          $ref: '#/components/responses/InternalError'
  /stcpadminsvc/v2/supervision/stcpmon/service/info:
    post:
      tags:
      - Supervisión
      summary: Información de los servicios
      operationId: getServiceInfo
      description: |-
        Estado de los servicios de red de la instancia.

        **Permiso:** `stcpadminsvc.mon_inst_serv` ≥ 1 (lectura).

        La API envía el comando a los nodos de supervisión habilitados para la instancia indicada en `Instance`; con `Node`, solo al nodo indicado.
      requestBody:
        required: true
        description: Instancia, nodo y argumentos del comando.
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SupervisionCommand'
            example:
              Instance: TESTE
              Name: PARCEIRO01
              Node: ''
              Level: ''
      responses:
        '200':
          description: Respuestas de cada nodo.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SupervisionResponse'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '500':
          $ref: '#/components/responses/InternalError'
  /stcpadminsvc/v2/supervision/stcpmon/sandbox:
    get:
      tags:
      - Archivos de la supervisión
      summary: Listar archivos del buzón (sandbox)
      operationId: listSandboxFiles
      description: '**Permiso:** `stcpadminsvc.mon_sandbox_file_management` ≥ 1 (lectura).'
      parameters:
      - in: query
        name: instance
        required: true
        description: Instancia.
        schema:
          type: string
      - in: query
        name: node
        required: false
        description: Nodo de supervisión. Vacío envía a todos los nodos de la instancia.
        schema:
          type: string
      - in: query
        name: user
        required: true
        description: Usuario dueño del buzón.
        schema:
          type: string
      - in: query
        name: area
        required: false
        description: Área (directorio) a listar.
        schema:
          type: string
      - in: query
        name: filter
        required: false
        description: 'Filtro en JSON codificado en Base64: `{"Regex": "...", "Start": <unix>, "End": <unix>}`.'
        schema:
          type: string
          format: byte
      responses:
        '200':
          description: Respuestas de cada nodo.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SupervisionResponse'
        '404':
          $ref: '#/components/responses/NotFound'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '500':
          $ref: '#/components/responses/InternalError'
    post:
      tags:
      - Archivos de la supervisión
      summary: Enviar un archivo al buzón (sandbox)
      operationId: addSandboxFile
      description: |-
        **Permiso:** `stcpadminsvc.mon_sandbox_file_management` ≥ 1 (lectura).

        El contenido del archivo va en `Data`, codificado en Base64.
      requestBody:
        required: true
        description: Archivo a enviar.
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SupervisionFileRequest'
      responses:
        '200':
          description: Respuestas de cada nodo.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SupervisionResponse'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '500':
          $ref: '#/components/responses/InternalError'
    delete:
      tags:
      - Archivos de la supervisión
      summary: Eliminar un archivo del buzón (sandbox)
      operationId: deleteSandboxFile
      description: '**Permiso:** `stcpadminsvc.mon_sandbox_file_management` ≥ 1 (lectura).'
      requestBody:
        required: true
        description: Archivo a eliminar.
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SupervisionFileRequest'
      responses:
        '200':
          description: Respuestas de cada nodo.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SupervisionResponse'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '500':
          $ref: '#/components/responses/InternalError'
  /stcpadminsvc/v2/supervision/stcpmon/keystore:
    get:
      tags:
      - Archivos de la supervisión
      summary: Listar archivos del keystore
      operationId: listKeystoreFiles
      description: '**Permiso:** `stcpadminsvc.mon_keystore_file_management` ≥ 1 (lectura).'
      parameters:
      - in: query
        name: instance
        required: true
        description: Instancia.
        schema:
          type: string
      - in: query
        name: node
        required: false
        description: Nodo de supervisión. Vacío envía a todos los nodos de la instancia.
        schema:
          type: string
      - in: query
        name: area
        required: false
        description: Área (directorio) a listar.
        schema:
          type: string
      - in: query
        name: filter
        required: false
        description: 'Filtro en JSON codificado en Base64: `{"Regex": "...", "Start": <unix>, "End": <unix>}`.'
        schema:
          type: string
          format: byte
      responses:
        '200':
          description: Respuestas de cada nodo.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SupervisionResponse'
        '404':
          $ref: '#/components/responses/NotFound'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '500':
          $ref: '#/components/responses/InternalError'
    post:
      tags:
      - Archivos de la supervisión
      summary: Enviar una clave o certificado al keystore
      operationId: addKeystoreFile
      description: |-
        **Permiso:** `stcpadminsvc.mon_keystore_file_management` ≥ 1 (lectura).

        El contenido del archivo va en `Data`, codificado en Base64.
      requestBody:
        required: true
        description: Archivo a enviar.
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SupervisionFileRequest'
      responses:
        '200':
          description: Respuestas de cada nodo.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SupervisionResponse'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '500':
          $ref: '#/components/responses/InternalError'
    delete:
      tags:
      - Archivos de la supervisión
      summary: Eliminar un archivo del keystore
      operationId: deleteKeystoreFile
      description: '**Permiso:** `stcpadminsvc.mon_keystore_file_management` ≥ 1 (lectura).'
      requestBody:
        required: true
        description: Archivo a eliminar.
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SupervisionFileRequest'
      responses:
        '200':
          description: Respuestas de cada nodo.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SupervisionResponse'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '500':
          $ref: '#/components/responses/InternalError'
  /stcpadminsvc/v2/supervision/stcpauth/reset/user/password:
    post:
      tags:
      - Mantenimiento
      summary: Restablecer la contraseña de un usuario
      operationId: resetUserPassword
      description: |-
        Define una nueva contraseña para el usuario, validada contra las políticas de contraseña de la instancia.

        **Permiso:** `stcpadminsvc.main_user_reset_pwd` ≥ 1 (lectura).
      requestBody:
        required: true
        description: Entidad y contraseñas, cuando corresponda.
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/MaintenanceRequest'
            example:
              Instance: TESTE
              Name: PARCEIRO01
              NewPassword: <nova-senha>
              CurrentPassword: ''
      responses:
        '200':
          description: Operación concluida.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MaintenanceResponse'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '500':
          $ref: '#/components/responses/InternalError'
  /stcpadminsvc/v2/supervision/stcpauth/change/user/password:
    post:
      tags:
      - Mantenimiento
      summary: Cambiar la contraseña de un usuario
      operationId: changeUserPassword
      description: |-
        Cambia la contraseña del usuario, indicando la contraseña actual en `CurrentPassword`.

        **Permiso:** `stcpadminsvc.main_user_reset_pwd` ≥ 1 (lectura).
      requestBody:
        required: true
        description: Entidad y contraseñas, cuando corresponda.
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/MaintenanceRequest'
            example:
              Instance: TESTE
              Name: PARCEIRO01
              NewPassword: <nova-senha>
              CurrentPassword: ''
      responses:
        '200':
          description: Operación concluida.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MaintenanceResponse'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '500':
          $ref: '#/components/responses/InternalError'
  /stcpadminsvc/v2/supervision/stcpauth/reset/user/lock:
    post:
      tags:
      - Mantenimiento
      summary: Desbloquear un usuario
      operationId: resetUserLock
      description: |-
        Elimina el bloqueo por fallas de inicio de sesión del usuario.

        **Permiso:** `stcpadminsvc.main_user_reset_lock` ≥ 1 (lectura).
      requestBody:
        required: true
        description: Entidad y contraseñas, cuando corresponda.
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/MaintenanceRequest'
            example:
              Instance: TESTE
              Name: PARCEIRO01
              NewPassword: <nova-senha>
              CurrentPassword: ''
      responses:
        '200':
          description: Operación concluida.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MaintenanceResponse'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '500':
          $ref: '#/components/responses/InternalError'
  /stcpadminsvc/v2/supervision/stcpauth/reset/user/hash:
    post:
      tags:
      - Mantenimiento
      summary: Restablecer el hash de autenticación de un usuario
      operationId: resetUserHash
      description: |-
        Recrea el hash de autenticación del usuario.

        **Permiso:** `stcpadminsvc.main_user_reset_hash` ≥ 1 (lectura).
      requestBody:
        required: true
        description: Entidad y contraseñas, cuando corresponda.
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/MaintenanceRequest'
            example:
              Instance: TESTE
              Name: PARCEIRO01
              NewPassword: <nova-senha>
              CurrentPassword: ''
      responses:
        '200':
          description: Operación concluida.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MaintenanceResponse'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '500':
          $ref: '#/components/responses/InternalError'
  /stcpadminsvc/v2/supervision/stcpauth/reset/user/2fa:
    post:
      tags:
      - Mantenimiento
      summary: Restablecer el 2FA de un usuario
      operationId: resetUserOTP
      description: |-
        Elimina el secreto TOTP del usuario; se genera uno nuevo en el próximo inicio de sesión.

        **Permiso:** `stcpadminsvc.main_user_reset_hash` ≥ 1 (lectura).
      requestBody:
        required: true
        description: Entidad y contraseñas, cuando corresponda.
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/MaintenanceRequest'
            example:
              Instance: TESTE
              Name: PARCEIRO01
              NewPassword: <nova-senha>
              CurrentPassword: ''
      responses:
        '200':
          description: Operación concluida.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MaintenanceResponse'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '500':
          $ref: '#/components/responses/InternalError'
  /stcpadminsvc/v2/supervision/stcpauth/reset/operator/password:
    post:
      tags:
      - Mantenimiento
      summary: Restablecer la contraseña de un operador
      operationId: resetOperatorPassword
      description: |-
        Define una nueva contraseña para el operador.

        **Permiso:** `stcpadminsvc.main_oper_reset_pwd` ≥ 1 (lectura).
      requestBody:
        required: true
        description: Entidad y contraseñas, cuando corresponda.
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/MaintenanceRequest'
            example:
              Name: operador01
              NewPassword: <nova-senha>
      responses:
        '200':
          description: Operación concluida.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MaintenanceResponse'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '500':
          $ref: '#/components/responses/InternalError'
  /stcpadminsvc/v2/supervision/stcpauth/change/operator/password:
    post:
      tags:
      - Mantenimiento
      summary: Cambiar la contraseña de un operador
      operationId: changeOperatorPassword
      description: |-
        Cambia la contraseña del operador, indicando la contraseña actual en `CurrentPassword`.

        **Permiso:** `stcpadminsvc.main_oper_reset_pwd` ≥ 1 (lectura).
      requestBody:
        required: true
        description: Entidad y contraseñas, cuando corresponda.
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/MaintenanceRequest'
            example:
              Name: operador01
              NewPassword: <nova-senha>
      responses:
        '200':
          description: Operación concluida.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MaintenanceResponse'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '500':
          $ref: '#/components/responses/InternalError'
  /stcpadminsvc/v2/supervision/stcpauth/reset/operator/lock:
    post:
      tags:
      - Mantenimiento
      summary: Desbloquear un operador
      operationId: resetOperatorLock
      description: |-
        Elimina el bloqueo por fallas de inicio de sesión del operador.

        **Permiso:** `stcpadminsvc.main_oper_reset_pwd` ≥ 1 (lectura).
      requestBody:
        required: true
        description: Entidad y contraseñas, cuando corresponda.
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/MaintenanceRequest'
            example:
              Name: operador01
              NewPassword: <nova-senha>
      responses:
        '200':
          description: Operación concluida.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MaintenanceResponse'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '500':
          $ref: '#/components/responses/InternalError'
  /stcpadminsvc/v2/supervision/stcpauth/reset/operator/2fa:
    post:
      tags:
      - Mantenimiento
      summary: Restablecer el 2FA de un operador
      operationId: resetOperatorOTP
      description: |-
        Elimina el secreto TOTP del operador; se genera uno nuevo en el próximo inicio de sesión.

        **Permiso:** `stcpadminsvc.main_oper_reset_pwd` ≥ 1 (lectura).
      requestBody:
        required: true
        description: Entidad y contraseñas, cuando corresponda.
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/MaintenanceRequest'
            example:
              Name: operador01
              NewPassword: <nova-senha>
      responses:
        '200':
          description: Operación concluida.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MaintenanceResponse'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '500':
          $ref: '#/components/responses/InternalError'
  /reports/v2/system:
    get:
      tags:
      - Informes
      summary: Eventos de sistema
      operationId: getSystemReport
      description: |-
        Eventos registrados por los módulos de los productos.

        **Permiso:** `stcpadminsvc.report_evt_sys` ≥ 1 (lectura).

        Si `start` o `end` no se informan o no son enteros, la API responde `403`.
      parameters:
      - in: query
        name: instance
        required: false
        description: Instancia.
        schema:
          type: string
      - in: query
        name: msg
        required: false
        description: Fragmento del texto del mensaje.
        schema:
          type: string
      - in: query
        name: code
        required: false
        description: Código del mensaje, como `MSG0065`.
        schema:
          type: string
      - in: query
        name: start
        required: true
        description: Inicio del período (Unix timestamp en milisegundos). Obligatorio.
        schema:
          type: integer
          format: int64
      - in: query
        name: end
        required: true
        description: Fin del período (Unix timestamp en milisegundos). Obligatorio.
        schema:
          type: integer
          format: int64
      - in: query
        name: limit
        required: false
        description: Registros por página. Predeterminado 100; máximo 15000.
        schema:
          type: integer
          default: 100
          maximum: 15000
      - in: query
        name: index
        required: false
        description: Índice de paginación, informado en la URI de `next`.
        schema:
          type: integer
          format: int64
      responses:
        '200':
          description: Registros encontrados.
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/ReportPage'
                - type: object
                  properties:
                    data:
                      type: array
                      nullable: true
                      items:
                        $ref: '#/components/schemas/MessageRow'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '500':
          $ref: '#/components/responses/InternalError'
  /reports/v2/users:
    get:
      tags:
      - Informes
      summary: Eventos de usuarios
      operationId: getUsersReport
      description: |-
        Eventos de las conexiones de los usuarios.

        **Permiso:** `stcpadminsvc.report_evt_sys` ≥ 1 (lectura).

        Si `start` o `end` no se informan o no son enteros, la API responde `403`.
      parameters:
      - in: query
        name: instance
        required: false
        description: Instancia.
        schema:
          type: string
      - in: query
        name: user
        required: false
        description: Usuario. Puede repetirse.
        schema:
          type: array
          items:
            type: string
        explode: true
      - in: query
        name: msg
        required: false
        description: Fragmento del texto del mensaje.
        schema:
          type: string
      - in: query
        name: code
        required: false
        description: Código del mensaje, como `MSG0065`.
        schema:
          type: string
      - in: query
        name: start
        required: true
        description: Inicio del período (Unix timestamp en milisegundos). Obligatorio.
        schema:
          type: integer
          format: int64
      - in: query
        name: end
        required: true
        description: Fin del período (Unix timestamp en milisegundos). Obligatorio.
        schema:
          type: integer
          format: int64
      - in: query
        name: limit
        required: false
        description: Registros por página. Predeterminado 100; máximo 15000.
        schema:
          type: integer
          default: 100
          maximum: 15000
      - in: query
        name: index
        required: false
        description: Índice de paginación, informado en la URI de `next`.
        schema:
          type: integer
          format: int64
      responses:
        '200':
          description: Registros encontrados.
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/ReportPage'
                - type: object
                  properties:
                    data:
                      type: array
                      nullable: true
                      items:
                        $ref: '#/components/schemas/MessageRow'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '500':
          $ref: '#/components/responses/InternalError'
  /reports/v2/instance:
    get:
      tags:
      - Informes
      summary: Mensajes de la instancia
      operationId: getInstanceReport
      description: |-
        Todos los mensajes registrados para la instancia.

        **Permiso:** `stcpadminsvc.report_evt_sys` ≥ 1 (lectura).

        Si `start` o `end` no se informan o no son enteros, la API responde `403`.
      parameters:
      - in: query
        name: instance
        required: false
        description: Instancia.
        schema:
          type: string
      - in: query
        name: user
        required: false
        description: Usuario. Puede repetirse.
        schema:
          type: array
          items:
            type: string
        explode: true
      - in: query
        name: msg
        required: false
        description: Fragmento del texto del mensaje.
        schema:
          type: string
      - in: query
        name: code
        required: false
        description: Código del mensaje, como `MSG0065`.
        schema:
          type: string
      - in: query
        name: start
        required: true
        description: Inicio del período (Unix timestamp en milisegundos). Obligatorio.
        schema:
          type: integer
          format: int64
      - in: query
        name: end
        required: true
        description: Fin del período (Unix timestamp en milisegundos). Obligatorio.
        schema:
          type: integer
          format: int64
      - in: query
        name: limit
        required: false
        description: Registros por página. Predeterminado 100; máximo 15000.
        schema:
          type: integer
          default: 100
          maximum: 15000
      - in: query
        name: index
        required: false
        description: Índice de paginación, informado en la URI de `next`.
        schema:
          type: integer
          format: int64
      responses:
        '200':
          description: Registros encontrados.
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/ReportPage'
                - type: object
                  properties:
                    data:
                      type: array
                      nullable: true
                      items:
                        $ref: '#/components/schemas/MessageRow'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '500':
          $ref: '#/components/responses/InternalError'
  /reports/v2/operators:
    get:
      tags:
      - Informes
      summary: Actividades de operadores
      operationId: getOperatorsReport
      description: |-
        Acciones ejecutadas por los operadores, incluso mediante la API.

        **Permiso:** `stcpadminsvc.report_evt_sys` ≥ 1 (lectura).

        Si `start` o `end` no se informan o no son enteros, la API responde `403`.
      parameters:
      - in: query
        name: operador
        required: false
        description: Operador.
        schema:
          type: string
      - in: query
        name: msg
        required: false
        description: Fragmento del texto del mensaje.
        schema:
          type: string
      - in: query
        name: code
        required: false
        description: Código del mensaje, como `MSG0065`.
        schema:
          type: string
      - in: query
        name: start
        required: true
        description: Inicio del período (Unix timestamp en milisegundos). Obligatorio.
        schema:
          type: integer
          format: int64
      - in: query
        name: end
        required: true
        description: Fin del período (Unix timestamp en milisegundos). Obligatorio.
        schema:
          type: integer
          format: int64
      - in: query
        name: limit
        required: false
        description: Registros por página. Predeterminado 100; máximo 15000.
        schema:
          type: integer
          default: 100
          maximum: 15000
      - in: query
        name: index
        required: false
        description: Índice de paginación, informado en la URI de `next`.
        schema:
          type: integer
          format: int64
      responses:
        '200':
          description: Registros encontrados.
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/ReportPage'
                - type: object
                  properties:
                    data:
                      type: array
                      nullable: true
                      items:
                        $ref: '#/components/schemas/OperatorRow'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '500':
          $ref: '#/components/responses/InternalError'
  /reports/v2/transfers:
    get:
      tags:
      - Informes
      summary: Historial de transferencias
      operationId: getTransfersReport
      description: |-
        Transmisiones y recepciones de archivos.

        **Permiso:** `stcpadminsvc.report_evt_sys` ≥ 1 (lectura).

        Si `start` o `end` no se informan o no son enteros, la API responde `403`.
      parameters:
      - in: query
        name: instance
        required: false
        description: Instancia.
        schema:
          type: string
      - in: query
        name: user
        required: false
        description: Usuario. Puede repetirse.
        schema:
          type: array
          items:
            type: string
        explode: true
      - in: query
        name: tags
        required: false
        description: Tag del tipo de archivo. Puede repetirse.
        schema:
          type: array
          items:
            type: string
        explode: true
      - in: query
        name: events
        required: false
        description: '`5` = transmisión; `7` = recepción. Puede repetirse.'
        schema:
          type: array
          items:
            type: integer
            enum:
            - 5
            - 7
        explode: true
      - in: query
        name: results
        required: false
        description: '`0` = solo con éxito; `-1` = solo con error. Omita para todos.'
        schema:
          type: integer
          enum:
          - 0
          - -1
      - in: query
        name: filename
        required: false
        description: Nombre del archivo.
        schema:
          type: string
      - in: query
        name: msg
        required: false
        description: Fragmento del texto del mensaje.
        schema:
          type: string
      - in: query
        name: code
        required: false
        description: Código del mensaje, como `MSG0065`.
        schema:
          type: string
      - in: query
        name: start
        required: true
        description: Inicio del período (Unix timestamp en milisegundos). Obligatorio.
        schema:
          type: integer
          format: int64
      - in: query
        name: end
        required: true
        description: Fin del período (Unix timestamp en milisegundos). Obligatorio.
        schema:
          type: integer
          format: int64
      - in: query
        name: limit
        required: false
        description: Registros por página. Predeterminado 100; máximo 15000.
        schema:
          type: integer
          default: 100
          maximum: 15000
      - in: query
        name: index
        required: false
        description: Índice de paginación, informado en la URI de `next`.
        schema:
          type: integer
          format: int64
      responses:
        '200':
          description: Registros encontrados.
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/ReportPage'
                - type: object
                  properties:
                    data:
                      type: array
                      nullable: true
                      items:
                        $ref: '#/components/schemas/TransferRow'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '500':
          $ref: '#/components/responses/InternalError'
  /reports/v2/audit/transfers:
    get:
      tags:
      - Informes
      summary: Auditoría de transferencias
      operationId: getAuditTransfers
      description: |-
        Transferencias del período, sin paginación.

        **Permiso:** `stcpadminsvc.report_evt_sys` ≥ 1 (lectura).

        Si `start` o `end` no se informan o no son enteros, la API responde `403`.
      parameters:
      - in: query
        name: instance
        required: false
        description: Instancia.
        schema:
          type: string
      - in: query
        name: user
        required: false
        description: Usuario. Puede repetirse.
        schema:
          type: array
          items:
            type: string
        explode: true
      - in: query
        name: filename
        required: false
        description: Nombre del archivo.
        schema:
          type: string
      - in: query
        name: tags
        required: false
        description: Tag del tipo de archivo. Puede repetirse.
        schema:
          type: array
          items:
            type: string
        explode: true
      - in: query
        name: start
        required: true
        description: Inicio del período (Unix timestamp en milisegundos). Obligatorio.
        schema:
          type: integer
          format: int64
      - in: query
        name: end
        required: true
        description: Fin del período (Unix timestamp en milisegundos). Obligatorio.
        schema:
          type: integer
          format: int64
      - in: query
        name: direction
        required: false
        description: '`in` = entrada; `out` = salida. Omita para las dos.'
        schema:
          type: string
          enum:
          - in
          - out
      - in: query
        name: status
        required: false
        description: '`error` = con error; `all` = todos. Omita para solo con éxito.'
        schema:
          type: string
          enum:
          - error
          - all
      responses:
        '200':
          description: Registros encontrados.
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    nullable: true
                    items:
                      $ref: '#/components/schemas/TransferRow'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '500':
          $ref: '#/components/responses/InternalError'
  /reports/v2/audit/sessions:
    get:
      tags:
      - Informes
      summary: Auditoría de sesiones
      operationId: getAuditSessions
      description: |-
        Conexiones de entrada y de salida del período, sin paginación.

        **Permiso:** `stcpadminsvc.report_evt_sys` ≥ 1 (lectura).

        Si `start` o `end` no se informan o no son enteros, la API responde `403`.
      parameters:
      - in: query
        name: instance
        required: false
        description: Instancia.
        schema:
          type: string
      - in: query
        name: user
        required: false
        description: Usuario. Puede repetirse.
        schema:
          type: array
          items:
            type: string
        explode: true
      - in: query
        name: filename
        required: false
        description: Nombre del archivo.
        schema:
          type: string
      - in: query
        name: tags
        required: false
        description: Tag del tipo de archivo. Puede repetirse.
        schema:
          type: array
          items:
            type: string
        explode: true
      - in: query
        name: start
        required: true
        description: Inicio del período (Unix timestamp en milisegundos). Obligatorio.
        schema:
          type: integer
          format: int64
      - in: query
        name: end
        required: true
        description: Fin del período (Unix timestamp en milisegundos). Obligatorio.
        schema:
          type: integer
          format: int64
      - in: query
        name: direction
        required: false
        description: '`in` = entrada; `out` = salida. Omita para las dos.'
        schema:
          type: string
          enum:
          - in
          - out
      - in: query
        name: status
        required: false
        description: '`error` = con error; `all` = todos. Omita para solo con éxito.'
        schema:
          type: string
          enum:
          - error
          - all
      responses:
        '200':
          description: Registros encontrados.
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    nullable: true
                    items:
                      $ref: '#/components/schemas/TransferRow'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '500':
          $ref: '#/components/responses/InternalError'
  /reports/v2/audit/statistics:
    get:
      tags:
      - Informes
      summary: Estadísticas de transferencias
      operationId: getAuditStatistics
      description: |-
        Totales de transferencias agrupados por período.

        **Permiso:** `stcpadminsvc.report_evt_sys` ≥ 1 (lectura).

        Si `start` o `end` no se informan o no son enteros, la API responde `403`. El parámetro `instance` es obligatorio.
      parameters:
      - in: query
        name: instance
        required: true
        description: Instancia. Obligatorio.
        schema:
          type: string
      - in: query
        name: user
        required: false
        description: Usuario. Puede repetirse.
        schema:
          type: array
          items:
            type: string
        explode: true
      - in: query
        name: filename
        required: false
        description: Nombre del archivo.
        schema:
          type: string
      - in: query
        name: tags
        required: false
        description: Tag del tipo de archivo. Puede repetirse.
        schema:
          type: array
          items:
            type: string
        explode: true
      - in: query
        name: start
        required: true
        description: Inicio del período (Unix timestamp en milisegundos). Obligatorio.
        schema:
          type: integer
          format: int64
      - in: query
        name: end
        required: true
        description: Fin del período (Unix timestamp en milisegundos). Obligatorio.
        schema:
          type: integer
          format: int64
      - in: query
        name: statistics
        required: false
        description: 'Agrupamiento: `year`, `month`, `week`, `dayofweek`, `day` u `hour`. Omita para el total del período.'
        schema:
          type: string
          enum:
          - year
          - month
          - week
          - dayofweek
          - day
          - hour
      responses:
        '200':
          description: Totales encontrados.
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    nullable: true
                    items:
                      type: object
                      additionalProperties: true
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '500':
          $ref: '#/components/responses/InternalError'
components:
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: Token de acceso emitido en `/oauth/token` o `/oauth/v2/token`.
  schemas:
    Error:
      type: object
      properties:
        field:
          type: string
          description: Entidad o área de la operación.
        error:
          type: string
          description: Tipo del error.
        error_description:
          type: string
          description: Descripción del error.
      description: Formato de los errores de la API.
    TokenRequest:
      type: object
      properties:
        grant_type:
          type: string
          description: Siempre `password`.
          enum:
          - password
        username:
          type: string
          description: Operador. Para LDAP (solo en `/oauth/v2/token`), use `<proveedor>/<operador>`.
        password:
          type: string
          description: Contraseña del operador.
          format: password
      required:
      - grant_type
      - username
      - password
    TokenResponse:
      type: object
      properties:
        access_token:
          type: string
          description: Token de acceso. Válido durante el tiempo definido en `session_duration` en el `config.json` de la
            API (predeterminado 60 minutos, máximo 720).
        scope:
          type: string
          description: Permisos del operador (JSON serializado como texto; vea `Permissions`).
        operator:
          type: string
          description: Operador autenticado.
        rest_name:
          type: string
          description: Nombre del registro de la API (`rest_name`).
        token_type:
          type: string
          description: Siempre `Bearer`.
          enum:
          - Bearer
      required:
      - access_token
      - token_type
    MFAChallengeResponse:
      type: object
      properties:
        URL:
          type: string
          description: 'Ruta para concluir el inicio de sesión: `/oauth/v2/token/mfa/{challengeID}`.'
        secret:
          type: string
          description: Secreto TOTP en Base32, devuelto solo en el primer acceso.
          format: password
        qrcode:
          type: string
          description: 'Código QR del secreto TOTP, devuelto solo en el primer acceso: imagen PNG de 200 × 200 en Base64 estándar,
            para usar en `data:image/png;base64,`.'
      required:
      - URL
    MFARequest:
      type: object
      properties:
        Code:
          type: string
          description: Código TOTP de 6 dígitos.
        Operator:
          type: string
          description: 'Opcional e ignorado: la API usa el operador del desafío.'
      required:
      - Code
    DataMessage:
      type: object
      properties:
        data:
          type: string
          description: Resultado de la operación.
    LogoutResponse:
      type: object
      properties:
        data:
          type: string
          description: Resultado de la operación (`Logout successful`).
        redirect:
          type: string
          description: Dirección de logout en el proveedor de identidad. Presente solo con `sso_logout_end_session` habilitado
            y sesión SSO.
    WriteResult:
      type: object
      properties:
        data:
          type: string
          description: Nombre de la entidad guardada o mensaje de confirmación.
        field:
          type: string
          description: Tipo de la entidad.
    ListEnvelope:
      type: object
      properties:
        status:
          type: integer
          description: Estado HTTP.
        field:
          type: string
          description: Tipo de la entidad.
        data:
          type: array
          description: Entidades encontradas.
          items: {}
    VersionInfo:
      type: object
      properties:
        Name:
          type: string
          description: Nombre del registro de la API.
        Version:
          type: string
          description: Versión.
        Model:
          type: string
          description: Nombre en clave de la versión.
    ServiceStatus:
      type: object
      properties:
        name:
          type: string
          description: Conexión verificada.
        active:
          type: boolean
          description: Conexión activa.
        status_time:
          type: string
          description: Hora de la verificación.
          format: date-time
        check_error:
          type: string
          description: Error de la última verificación, si lo hay.
        reconnect_error:
          type: string
          description: Error de la última reconexión, si lo hay.
    LicenseStatus:
      type: object
      properties:
        status:
          type: string
          description: 'Siempre `active`: con la licencia inválida o vencida, la API no queda en funcionamiento.'
          enum:
          - active
        daysRemaining:
          type: integer
          description: Días hasta el vencimiento. `-1` cuando la licencia no tiene vencimiento.
        expiresAt:
          type: string
          description: Fecha de vencimiento (RFC 3339). Vacía cuando la licencia no tiene vencimiento.
    LoginProvider:
      type: object
      properties:
        Name:
          type: string
          description: Nombre del proveedor.
        Type:
          type: string
          description: Tipo del proveedor.
          enum:
          - oauth2
          - saml2
          - ldap
    Instance:
      type: object
      properties:
        ID:
          type: integer
          description: Identificador. Se omite en la creación.
          format: int64
        NAME:
          type: string
          description: Nombre.
        DESCRIPTION:
          type: string
          description: Descripción.
        CONFIG_TXT:
          allOf:
          - $ref: '#/components/schemas/CfgInstance'
          description: 'Configuración de la entidad, en el mismo formato usado por el Riversoft Console Portal. En la modificación
            (`PUT`), el `CONFIG_TXT` enviado sustituye por completo al guardado: los campos omitidos vuelven al valor vacío
            o cero. Por eso, consulte la entidad, modifique los campos y envíe el objeto completo. Los campos desconocidos
            se ignoran sin error. Las contraseñas y los secretos vuelven enmascarados en las consultas; al reenviar el valor
            enmascarado, la API mantiene el guardado.'
        CREATED:
          type: string
          description: Fecha de creación.
          readOnly: true
        MODIFIED:
          type: string
          description: Fecha de la última modificación.
          readOnly: true
        EXTRA_TXT:
          type: string
          description: Datos adicionales.
      required:
      - NAME
      - CONFIG_TXT
    InstanceMembers:
      type: object
      properties:
        data:
          type: array
          items:
            type: object
            properties:
              ID:
                type: integer
                description: ID de la instancia.
              Name:
                type: string
                description: Instancia.
              Users:
                type: array
                items:
                  type: object
                  properties:
                    ID:
                      type: integer
                      description: ID del usuario.
                    Name:
                      type: string
                      description: Usuario.
    User:
      type: object
      properties:
        ID:
          type: integer
          description: Identificador. Se omite en la creación.
          format: int64
        INSTANCE_ID:
          type: integer
          description: ID de la instancia.
          format: int64
        NAME:
          type: string
          description: Nombre.
        DESCRIPTION:
          type: string
          description: Descripción.
        CONFIG_TXT:
          allOf:
          - $ref: '#/components/schemas/CfgUser'
          description: 'Configuración de la entidad, en el mismo formato usado por el Riversoft Console Portal. En la modificación
            (`PUT`), el `CONFIG_TXT` enviado sustituye por completo al guardado: los campos omitidos vuelven al valor vacío
            o cero. Por eso, consulte la entidad, modifique los campos y envíe el objeto completo. Los campos desconocidos
            se ignoran sin error. Las contraseñas y los secretos vuelven enmascarados en las consultas; al reenviar el valor
            enmascarado, la API mantiene el guardado.'
        CREATED:
          type: string
          description: Fecha de creación.
          readOnly: true
        MODIFIED:
          type: string
          description: Fecha de la última modificación.
          readOnly: true
        EXTRA_TXT:
          type: string
          description: Datos adicionales.
      required:
      - NAME
      - CONFIG_TXT
    NetworkService:
      type: object
      properties:
        ID:
          type: integer
          description: Identificador. Se omite en la creación.
          format: int64
        INSTANCE_ID:
          type: integer
          description: ID de la instancia.
          format: int64
        NAME:
          type: string
          description: Nombre.
        DESCRIPTION:
          type: string
          description: Descripción.
        CONFIG_TXT:
          allOf:
          - $ref: '#/components/schemas/CfgService'
          description: 'Configuración de la entidad, en el mismo formato usado por el Riversoft Console Portal. En la modificación
            (`PUT`), el `CONFIG_TXT` enviado sustituye por completo al guardado: los campos omitidos vuelven al valor vacío
            o cero. Por eso, consulte la entidad, modifique los campos y envíe el objeto completo. Los campos desconocidos
            se ignoran sin error. Las contraseñas y los secretos vuelven enmascarados en las consultas; al reenviar el valor
            enmascarado, la API mantiene el guardado.'
        CREATED:
          type: string
          description: Fecha de creación.
          readOnly: true
        MODIFIED:
          type: string
          description: Fecha de la última modificación.
          readOnly: true
        EXTRA_TXT:
          type: string
          description: Datos adicionales.
      required:
      - NAME
      - CONFIG_TXT
    Schedule:
      type: object
      properties:
        ID:
          type: integer
          description: Identificador. Se omite en la creación.
          format: int64
        INSTANCE_ID:
          type: integer
          description: ID de la instancia.
          format: int64
        NAME:
          type: string
          description: Nombre.
        DESCRIPTION:
          type: string
          description: Descripción.
        CONFIG_TXT:
          allOf:
          - $ref: '#/components/schemas/CfgSchedule'
          description: 'Configuración de la entidad, en el mismo formato usado por el Riversoft Console Portal. En la modificación
            (`PUT`), el `CONFIG_TXT` enviado sustituye por completo al guardado: los campos omitidos vuelven al valor vacío
            o cero. Por eso, consulte la entidad, modifique los campos y envíe el objeto completo. Los campos desconocidos
            se ignoran sin error. Las contraseñas y los secretos vuelven enmascarados en las consultas; al reenviar el valor
            enmascarado, la API mantiene el guardado.'
        CREATED:
          type: string
          description: Fecha de creación.
          readOnly: true
        MODIFIED:
          type: string
          description: Fecha de la última modificación.
          readOnly: true
        EXTRA_TXT:
          type: string
          description: Datos adicionales.
      required:
      - NAME
      - CONFIG_TXT
    FileTypeGlobal:
      type: object
      properties:
        ID:
          type: integer
          description: Identificador. Se omite en la creación.
          format: int64
        INSTANCE_ID:
          type: integer
          description: ID de la instancia.
          format: int64
        NAME:
          type: string
          description: Nombre.
        DESCRIPTION:
          type: string
          description: Descripción.
        CONFIG_TXT:
          allOf:
          - $ref: '#/components/schemas/CfgFileType'
          description: 'Configuración de la entidad, en el mismo formato usado por el Riversoft Console Portal. En la modificación
            (`PUT`), el `CONFIG_TXT` enviado sustituye por completo al guardado: los campos omitidos vuelven al valor vacío
            o cero. Por eso, consulte la entidad, modifique los campos y envíe el objeto completo. Los campos desconocidos
            se ignoran sin error. Las contraseñas y los secretos vuelven enmascarados en las consultas; al reenviar el valor
            enmascarado, la API mantiene el guardado.'
        CREATED:
          type: string
          description: Fecha de creación.
          readOnly: true
        MODIFIED:
          type: string
          description: Fecha de la última modificación.
          readOnly: true
        EXTRA_TXT:
          type: string
          description: Datos adicionales.
      required:
      - NAME
      - CONFIG_TXT
    FileType:
      type: object
      properties:
        ID:
          type: integer
          description: Identificador. Se omite en la creación.
          format: int64
        USER_ID:
          type: integer
          description: ID del usuario.
          format: int64
        NAME:
          type: string
          description: Nombre.
        DESCRIPTION:
          type: string
          description: Descripción.
        CONFIG_TXT:
          allOf:
          - $ref: '#/components/schemas/CfgFileType'
          description: 'Configuración de la entidad, en el mismo formato usado por el Riversoft Console Portal. En la modificación
            (`PUT`), el `CONFIG_TXT` enviado sustituye por completo al guardado: los campos omitidos vuelven al valor vacío
            o cero. Por eso, consulte la entidad, modifique los campos y envíe el objeto completo. Los campos desconocidos
            se ignoran sin error. Las contraseñas y los secretos vuelven enmascarados en las consultas; al reenviar el valor
            enmascarado, la API mantiene el guardado.'
        CREATED:
          type: string
          description: Fecha de creación.
          readOnly: true
        MODIFIED:
          type: string
          description: Fecha de la última modificación.
          readOnly: true
        EXTRA_TXT:
          type: string
          description: Datos adicionales.
      required:
      - NAME
      - CONFIG_TXT
    Routing:
      type: object
      properties:
        ID:
          type: integer
          description: Identificador. Se omite en la creación.
          format: int64
        INSTANCE_ID:
          type: integer
          description: ID de la instancia.
          format: int64
        NAME:
          type: string
          description: Nombre.
        DESCRIPTION:
          type: string
          description: Descripción.
        CONFIG_TXT:
          allOf:
          - $ref: '#/components/schemas/CfgRouting'
          description: 'Configuración de la entidad, en el mismo formato usado por el Riversoft Console Portal. En la modificación
            (`PUT`), el `CONFIG_TXT` enviado sustituye por completo al guardado: los campos omitidos vuelven al valor vacío
            o cero. Por eso, consulte la entidad, modifique los campos y envíe el objeto completo. Los campos desconocidos
            se ignoran sin error. Las contraseñas y los secretos vuelven enmascarados en las consultas; al reenviar el valor
            enmascarado, la API mantiene el guardado.'
        CREATED:
          type: string
          description: Fecha de creación.
          readOnly: true
        MODIFIED:
          type: string
          description: Fecha de la última modificación.
          readOnly: true
        EXTRA_TXT:
          type: string
          description: Datos adicionales.
      required:
      - NAME
      - CONFIG_TXT
    Operator:
      type: object
      properties:
        ID:
          type: integer
          description: Identificador. Se omite en la creación.
          format: int64
        NAME:
          type: string
          description: Nombre.
        DESCRIPTION:
          type: string
          description: Descripción.
        CONFIG_TXT:
          type: object
          properties:
            Operator:
              type: object
              properties:
                IdOperador:
                  type: integer
                  description: Identificador interno.
                NomeCompleto:
                  type: string
                  description: Nombre completo.
                Descricao:
                  type: string
                  description: Descripción.
                Email:
                  type: string
                  description: Correo electrónico.
                  format: email
                Senha:
                  type: string
                  description: Contraseña. Se devuelve enmascarada en las consultas.
                  format: password
                Estado:
                  type: integer
                  description: '`1` = activo; `0` = bloqueado.'
                IntervaloMonitoracao:
                  type: integer
                  description: Intervalo de actualización de la supervisión, en segundos (mínimo 30).
                LinhasPorPagina:
                  type: integer
                  description: Líneas por página en el Portal (mínimo 50).
                TempoInatividade:
                  type: integer
                  description: Tiempo de inactividad de la sesión, en segundos (mínimo 300).
                Expiration:
                  type: integer
                  description: Validez de la sesión, en segundos (mínimo 300).
                Tipo:
                  type: integer
                  description: Tipo del operador.
                LoginFails:
                  type: integer
                  description: Fallas de inicio de sesión consecutivas.
                  readOnly: true
                DataUltimoAcesso:
                  type: string
                  description: Último acceso.
                  readOnly: true
                EnderecoIPUltimoAcesso:
                  type: string
                  description: IP del último acceso.
                  readOnly: true
              required:
              - NomeCompleto
              - Email
            Relations:
              type: object
              properties:
                Groups:
                  type: array
                  description: IDs de los grupos del operador.
                  items:
                    type: integer
              required:
              - Groups
            Entity:
              type: object
              properties:
                Name:
                  type: string
                Version:
                  type: integer
          required:
          - Operator
          - Relations
        CREATED:
          type: string
          description: Fecha de creación.
          readOnly: true
        MODIFIED:
          type: string
          description: Fecha de la última modificación.
          readOnly: true
        EXTRA_TXT:
          type: string
          description: Datos adicionales.
      required:
      - NAME
      - CONFIG_TXT
    PermissionValue:
      type: integer
      enum:
      - 0
      - 1
      - 15
      description: '`0` = sin acceso; `1` = lectura; `15` = lectura y escritura.'
    Permissions:
      type: object
      properties:
        stcpcore:
          type: object
          properties:
            instance:
              $ref: '#/components/schemas/PermissionValue'
            user:
              $ref: '#/components/schemas/PermissionValue'
            service:
              $ref: '#/components/schemas/PermissionValue'
            schedule:
              $ref: '#/components/schemas/PermissionValue'
            routing:
              $ref: '#/components/schemas/PermissionValue'
            filetype:
              $ref: '#/components/schemas/PermissionValue'
            filetypeglobal:
              $ref: '#/components/schemas/PermissionValue'
        stcpadmin:
          type: object
          properties:
            operator:
              $ref: '#/components/schemas/PermissionValue'
            group:
              $ref: '#/components/schemas/PermissionValue'
            oper_group:
              $ref: '#/components/schemas/PermissionValue'
            error_event:
              $ref: '#/components/schemas/PermissionValue'
            logtransfer:
              $ref: '#/components/schemas/PermissionValue'
            logmessage:
              $ref: '#/components/schemas/PermissionValue'
            logsystem:
              $ref: '#/components/schemas/PermissionValue'
            setting:
              $ref: '#/components/schemas/PermissionValue'
        stcpauth:
          type: object
          properties:
            reset_hash:
              $ref: '#/components/schemas/PermissionValue'
            reset_password:
              $ref: '#/components/schemas/PermissionValue'
            reset_lock:
              $ref: '#/components/schemas/PermissionValue'
            check_status:
              $ref: '#/components/schemas/PermissionValue'
            change_password:
              $ref: '#/components/schemas/PermissionValue'
        stcpadminsvc:
          type: object
          properties:
            query_inst_sched:
              $ref: '#/components/schemas/PermissionValue'
            query_inst_users:
              $ref: '#/components/schemas/PermissionValue'
            query_reg_inst:
              $ref: '#/components/schemas/PermissionValue'
            query_reg_serv:
              $ref: '#/components/schemas/PermissionValue'
            query_reg_cod_err:
              $ref: '#/components/schemas/PermissionValue'
            query_reg_cod_evt:
              $ref: '#/components/schemas/PermissionValue'
            query_reg_group:
              $ref: '#/components/schemas/PermissionValue'
            query_reg_oper:
              $ref: '#/components/schemas/PermissionValue'
            query_rest_api:
              $ref: '#/components/schemas/PermissionValue'
            report_evt_inst:
              $ref: '#/components/schemas/PermissionValue'
            report_evt_oper:
              $ref: '#/components/schemas/PermissionValue'
            report_evt_sys:
              $ref: '#/components/schemas/PermissionValue'
            report_evt_user:
              $ref: '#/components/schemas/PermissionValue'
            report_freq_conn:
              $ref: '#/components/schemas/PermissionValue'
            report_freq_transf:
              $ref: '#/components/schemas/PermissionValue'
            report_transf_audit:
              $ref: '#/components/schemas/PermissionValue'
            report_transf_stat:
              $ref: '#/components/schemas/PermissionValue'
            report_transf_graph:
              $ref: '#/components/schemas/PermissionValue'
            report_transf_hist:
              $ref: '#/components/schemas/PermissionValue'
            report_transf_route:
              $ref: '#/components/schemas/PermissionValue'
            mon_sched_exec:
              $ref: '#/components/schemas/PermissionValue'
            mon_inst_restart:
              $ref: '#/components/schemas/PermissionValue'
            mon_inst_info:
              $ref: '#/components/schemas/PermissionValue'
            mon_inst_serv:
              $ref: '#/components/schemas/PermissionValue'
            mon_user_start_conn:
              $ref: '#/components/schemas/PermissionValue'
            mon_user_canc_conn:
              $ref: '#/components/schemas/PermissionValue'
            mon_user_info:
              $ref: '#/components/schemas/PermissionValue'
            mon_console_info:
              $ref: '#/components/schemas/PermissionValue'
            mon_sandbox_file_management:
              $ref: '#/components/schemas/PermissionValue'
            mon_keystore_file_management:
              $ref: '#/components/schemas/PermissionValue'
            main_set_level:
              $ref: '#/components/schemas/PermissionValue'
            main_sched_ch_state:
              $ref: '#/components/schemas/PermissionValue'
            main_oper_reset_pwd:
              $ref: '#/components/schemas/PermissionValue'
            main_user_ch_state:
              $ref: '#/components/schemas/PermissionValue'
            main_user_reset_pwd:
              $ref: '#/components/schemas/PermissionValue'
            main_user_reset_lock:
              $ref: '#/components/schemas/PermissionValue'
            main_user_reset_hash:
              $ref: '#/components/schemas/PermissionValue'
            main_user_create_folders:
              $ref: '#/components/schemas/PermissionValue'
        stcpmon:
          type: object
          description: Reservado. Sin permisos.
        stcpconfigs:
          type: object
          deprecated: true
          description: Obsoleto. Se mantiene solo por compatibilidad con versiones antiguas del Riversoft Console Portal.
          properties:
            config_instances:
              $ref: '#/components/schemas/PermissionValue'
            config_filetypeglobals:
              $ref: '#/components/schemas/PermissionValue'
            config_schedules:
              $ref: '#/components/schemas/PermissionValue'
            config_users:
              $ref: '#/components/schemas/PermissionValue'
            config_filetypes:
              $ref: '#/components/schemas/PermissionValue'
            config_services:
              $ref: '#/components/schemas/PermissionValue'
            config_settings:
              $ref: '#/components/schemas/PermissionValue'
            config_operators:
              $ref: '#/components/schemas/PermissionValue'
            config_groups:
              $ref: '#/components/schemas/PermissionValue'
            config_cod_errs_evts:
              $ref: '#/components/schemas/PermissionValue'
      description: Permisos por grupo de recursos. Cuando el operador pertenece a más de un grupo, los permisos se suman.
    Group:
      type: object
      properties:
        ID:
          type: integer
          description: Identificador. Se omite en la creación.
          format: int64
        NAME:
          type: string
          description: Nombre.
        DESCRIPTION:
          type: string
          description: Descripción.
        CONFIG_TXT:
          type: object
          properties:
            Permissions:
              $ref: '#/components/schemas/Permissions'
            Relations:
              type: object
              properties:
                Instances:
                  type: array
                  description: IDs de las instancias. `[0]` = todas.
                  items:
                    type: integer
                Operators:
                  type: array
                  description: IDs de los operadores. `[0]` = todos.
                  items:
                    type: integer
                Users:
                  type: array
                  description: IDs de los usuarios. `[0]` = todos.
                  items:
                    type: integer
              required:
              - Instances
              - Operators
              - Users
            Entity:
              type: object
              properties:
                Name:
                  type: string
                Version:
                  type: integer
          required:
          - Relations
        CREATED:
          type: string
          description: Fecha de creación.
          readOnly: true
        MODIFIED:
          type: string
          description: Fecha de la última modificación.
          readOnly: true
        EXTRA_TXT:
          type: string
          description: Datos adicionales.
      required:
      - NAME
      - CONFIG_TXT
    SupervisionNode:
      type: object
      properties:
        Enable:
          type: boolean
          description: Nodo habilitado.
        Instance:
          type: string
          description: Instancia supervisada.
        Nodename:
          type: string
          description: Nombre del nodo.
        Username:
          type: string
          description: 'Credencial de supervisión: usuario.'
        Password:
          type: string
          description: 'Credencial de supervisión: contraseña. Se devuelve enmascarada.'
          format: password
        Host:
          type: string
          description: Dirección del servicio de supervisión.
        Port:
          type: integer
          description: 'Puerto: predeterminado 33050 (Riversoft STCP Gemini) o 33060 (Riversoft STCP DirectLink).'
        Tls:
          type: boolean
          description: Conexión con TLS.
        Cert:
          type: string
          description: Certificado usado en TLS.
    PasswordPolicies:
      type: object
      properties:
        enabled:
          type: integer
          description: Políticas habilitadas (`1`) o no (`0`).
        maxFails:
          type: integer
          description: Fallas de inicio de sesión hasta el bloqueo.
        maxDays:
          type: integer
          description: Validez de la contraseña, en días.
        minLen:
          type: integer
          description: Longitud mínima de la contraseña.
        complexity:
          type: integer
          description: Nivel de complejidad exigido.
        historyCount:
          type: integer
          description: Contraseñas anteriores que no se pueden reutilizar.
    ApiSettingConfig:
      type: object
      properties:
        Monitor:
          type: array
          items:
            $ref: '#/components/schemas/SupervisionNode'
          description: Nodos de supervisión.
        passwordPolicies:
          $ref: '#/components/schemas/PasswordPolicies'
        ssl:
          type: boolean
          description: TLS habilitado.
        cert:
          type: string
          description: Certificado TLS.
        key:
          type: string
          description: Clave privada TLS.
        passphrase:
          type: string
          description: Contraseña de la clave privada. Se devuelve enmascarada.
          format: password
        host:
          type: string
          description: Interfaz de la API.
        port:
          type: integer
          description: Puerto de la API.
        enable2FA:
          type: boolean
          description: Exige 2FA (TOTP) en el inicio de sesión de los operadores.
        sso_login_redirect:
          type: string
          description: URL de retorno después del inicio de sesión SSO.
        sso_logout_end_session:
          type: boolean
          description: También cierra la sesión en el proveedor de identidad al cerrar sesión.
        ssoProviders:
          type: array
          description: Proveedores de identidad (SSO).
          items:
            $ref: '#/components/schemas/SsoProvider'
        Entity:
          type: object
          properties:
            Name:
              type: string
            Version:
              type: integer
      description: Los valores del `config.json` de la API tienen prioridad sobre los del registro.
    ApiSetting:
      type: object
      properties:
        ID:
          type: integer
          description: Identificador. Se omite en la creación.
        NAME:
          type: string
          description: Nombre del registro; debe ser igual al `rest_name` del `config.json` de la API.
        DESCRIPTION:
          type: string
          description: Descripción.
        CONFIG_TXT:
          $ref: '#/components/schemas/ApiSettingConfig'
        CREATED:
          type: string
          description: Fecha de creación.
          readOnly: true
        MODIFIED:
          type: string
          description: Fecha de la última modificación.
          readOnly: true
      required:
      - NAME
      - CONFIG_TXT
    PoliciesResponse:
      type: object
      properties:
        Name:
          type: string
          description: Nombre del registro de la API.
        Policies:
          $ref: '#/components/schemas/PasswordPolicies'
    ErrorEvent:
      type: object
      properties:
        ID:
          type: integer
          description: Identificador. Se omite en la creación.
        CODE:
          type: string
          description: Código del mensaje, como `MSG0089`.
        DESCRIPTION:
          type: string
          description: Descripción.
        PROCEDURES:
          type: string
          description: Procedimientos recomendados.
        CREATED:
          type: string
          description: Fecha de creación.
          readOnly: true
        MODIFIED:
          type: string
          description: Fecha de la última modificación.
          readOnly: true
        EXTRA_TXT:
          type: string
          description: Datos adicionales.
      required:
      - CODE
    NewPasswordRequest:
      type: object
      properties:
        NewPassword:
          type: string
          description: Nueva contraseña.
          format: password
      required:
      - NewPassword
    SupervisionCommand:
      type: object
      properties:
        Instance:
          type: string
          description: Instancia.
        Node:
          type: string
          description: Nodo de supervisión. Vacío envía a todos los nodos de la instancia.
        Name:
          type: string
          description: Usuario o agenda, según el comando.
        Level:
          type: string
          description: Nivel de debug, en el comando `debug`.
      required:
      - Instance
    SupervisionFileRequest:
      type: object
      properties:
        Instance:
          type: string
          description: Instancia.
        Node:
          type: string
          description: Nodo de supervisión.
        User:
          type: string
          description: Usuario dueño del buzón (solo sandbox).
        Area:
          type: string
          description: Área (directorio) de destino.
        Filename:
          type: string
          description: Nombre del archivo.
        Data:
          type: string
          description: Contenido del archivo en Base64 (solo en el envío).
          format: byte
      required:
      - Instance
      - Filename
    SupervisionResponse:
      type: object
      properties:
        data:
          type: array
          items:
            type: object
            properties:
              Instance:
                type: string
                description: Instancia.
              Nodename:
                type: string
                description: Nodo que respondió.
              Data:
                type: array
                description: 'Respuesta del nodo. En caso de falla de conexión, `{"error": "...", "Timestamp": <unix>}`.'
                items:
                  type: object
                  additionalProperties: true
    MaintenanceRequest:
      type: object
      properties:
        Instance:
          type: string
          description: Instancia (solo para usuarios).
        Name:
          type: string
          description: Usuario u operador.
        NewPassword:
          type: string
          description: Nueva contraseña (restablecimiento y cambio de contraseña).
          format: password
        CurrentPassword:
          type: string
          description: Contraseña actual (cambio de contraseña).
          format: password
      required:
      - Name
    MaintenanceResponse:
      type: object
      properties:
        data:
          description: Resultado de la operación.
        redirect:
          type: string
          description: Dirección a la que el Portal debe redirigir, cuando corresponda.
    ReportPage:
      type: object
      properties:
        data:
          type: array
          description: Registros. `null` cuando no hay registros.
          nullable: true
          items: {}
        next:
          type: string
          description: URI de la página siguiente. Vacía cuando no hay página siguiente.
    MessageRow:
      type: object
      properties:
        DATAHORA:
          type: string
          description: Fecha y hora.
        INSTANCE:
          type: string
          description: Instancia.
        USUARIO:
          type: string
          description: Usuario o módulo.
        CODIGOMENSAGEM:
          type: string
          description: Código del mensaje.
        MENSAGEM:
          type: string
          description: Mensaje.
        IDMENSAGEM:
          type: integer
          description: Identificador del mensaje.
    OperatorRow:
      type: object
      properties:
        DATAHORA:
          type: string
          description: Fecha y hora.
        OPERADOR:
          type: string
          description: Operador.
        MODULO:
          type: string
          description: Módulo.
        CODIGOMENSAGEM:
          type: string
          description: Código del mensaje.
        MENSAGEM:
          type: string
          description: Detalles de la operación (servicio, operador, estado, método y ruta).
    TransferRow:
      type: object
      properties:
        DATAHORA:
          type: string
          description: Fecha y hora.
        INSTANCE:
          type: string
          description: Instancia.
        USUARIO:
          type: string
          description: Usuario o módulo.
        CONEXAO:
          type: string
          description: Detalles de la conexión o del enrutamiento.
        EVENTO:
          type: integer
          description: '`5` = transmisión; `7` = recepción; `1`/`3` = sesión de entrada/salida.'
        NOMEARQUIVO:
          type: string
          description: Nombre del archivo.
        TAMARQUIVO:
          type: integer
          description: Tamaño del archivo.
        TAGS:
          type: string
          description: Tags del tipo de archivo.
        RESULTADO:
          type: integer
          description: '`0` = éxito; otro valor = código del error.'
        MENSAGEM:
          type: string
          description: Mensaje.
        REDE:
          type: string
          description: Red o servicio utilizado.
    CfgInstance:
      type: object
      properties:
        Entity:
          $ref: '#/components/schemas/CfgEntity'
        Authentication:
          $ref: '#/components/schemas/CfgInstanceAuthentication'
        Log:
          $ref: '#/components/schemas/CfgInstanceLog'
        Startup:
          $ref: '#/components/schemas/CfgInstanceStartup'
      description: '`CONFIG_TXT` de la instancia.'
    CfgEntity:
      type: object
      properties:
        Version:
          type: integer
          format: int64
          description: Versión de la estructura. Use `2`.
        Name:
          type: string
          description: 'Tipo de la entidad: `instance`, `user`, `service`, `schedule`, `filetypeglobal`, `filetype`, `routing`,
            `group`, `operator` o `setting`.'
      description: Identificación de la estructura. `Version` = `2`.
    CfgInstanceAuthentication:
      type: object
      properties:
        DLLName:
          type: string
          description: Biblioteca de acceso a la base de autenticación.
        DBName:
          type: string
          description: Nombre de la base de autenticación.
        DBHost:
          type: string
          description: Servidor de la base de autenticación.
        DBPort:
          type: integer
          format: int64
          description: Puerto de la base de autenticación.
        DBUser:
          type: string
          description: Usuario de la base de autenticación.
        DBPswd:
          type: string
          format: password
          description: 'Contraseña de la base de autenticación. Dato sensible: vuelve enmascarado en las consultas.'
        AuthType:
          type: integer
          format: int64
          description: 'Tipo de autenticación: `0` sistema operativo, `1` STCP, `2` RSA SecurID, `3` LDAP.'
        AuthPrefix:
          type: string
        AuthDomain:
          type: string
        AuthMFAMethod:
          type: integer
          format: int64
          description: 'MFA de los usuarios: `0` deshabilitado, `1` aplicación autenticadora (TOTP), `2` código por correo
            electrónico, `3` código por SMS.'
        AuthPolicyEnabled:
          type: integer
          format: int64
          description: '`1` habilita las políticas de contraseña.'
        AuthPolicyPswdMinLen:
          type: integer
          format: int64
          description: Tamaño mínimo de la contraseña.
        AuthPolicyPswdMaxDays:
          type: integer
          format: int64
          description: Validez de la contraseña, en días.
        AuthPolicyPswdMaxFails:
          type: integer
          format: int64
          description: Fallas hasta el bloqueo del usuario.
        AuthPolicyPswdHistoryCount:
          type: integer
          format: int64
          description: Contraseñas anteriores que no se pueden reutilizar.
        AuthPolicyPswdComplex:
          type: integer
          format: int64
          description: 'Complejidad exigida, como suma: `1` letra minúscula, `2` letra mayúscula, `4` dígito, `8` símbolo
            (`15` = todas).'
        AuthSecurIdCfgFile:
          type: string
          description: Archivo de configuración de RSA SecurID.
        AuthLDAPRemoteAddress:
          type: string
          description: Dirección del servidor LDAP.
        AuthLDAPRemotePort:
          type: integer
          format: int64
          description: Puerto del servidor LDAP.
        AuthLDAPDomain:
          type: string
          description: Dominio LDAP.
        AuthLDAPBindMethod:
          type: string
          description: Método de bind en el LDAP.
        AuthLDAPBindUser:
          type: string
          description: Usuario de bind en el LDAP.
        AuthLDAPBindPswd:
          type: string
          format: password
          description: 'Contraseña de bind en el LDAP. Dato sensible: vuelve enmascarado en las consultas.'
        AuthLDAPTls:
          type: integer
          format: int64
          description: '`1` usa TLS en la conexión con el LDAP.'
        AuthLDAPTlsCertVerify:
          type: integer
          format: int64
          description: '`1` valida el certificado del servidor LDAP.'
        AuthLDAPTlsCertCaFile:
          type: string
          description: Archivo de la CA del servidor LDAP.
      description: 'Autenticación de los usuarios de transferencia de la instancia: base de autenticación, tipo de autenticación,
        MFA, políticas de contraseña y LDAP.'
    CfgInstanceLog:
      type: object
      properties:
        Verbose:
          type: integer
          format: int64
          description: Nivel de detalle del log.
        Console:
          type: integer
          format: int64
          description: '`1` también muestra los mensajes en la consola.'
        External:
          type: integer
          format: int64
          description: '`1` envía los mensajes a un programa externo.'
        ExecProg:
          type: string
          description: Programa externo que recibe los mensajes.
        DLLName:
          type: string
          description: Biblioteca de acceso a la base de log.
        DBName:
          type: string
          description: Nombre de la base de log.
        DBHost:
          type: string
          description: Servidor de la base de log.
        DBPort:
          type: integer
          format: int64
          description: Puerto de la base de log.
        DBUser:
          type: string
          description: Usuario de la base de log.
        DBPswd:
          type: string
          format: password
          description: 'Contraseña de la base de log. Dato sensible: vuelve enmascarado en las consultas.'
        FilterRegEx:
          type: string
          description: Expresión regular de los mensajes registrados.
        FilterRegExNeg:
          type: string
          description: Expresión regular de los mensajes ignorados.
      description: 'Log de la instancia: base de log, nivel de detalle y filtros.'
    CfgInstanceStartup:
      type: object
      properties:
        Version:
          type: string
          description: Versión de la instancia.
        OSType:
          type: string
          description: 'Sistema operativo: `LINUX`, `WINNT`, `WIN32` o `MACOS`.'
        ServiceName:
          type: string
          description: Nombre del servicio en el sistema operativo.
        ServiceDescription:
          type: string
          description: Descripción del servicio en el sistema operativo.
        SystemDirectory:
          type: string
          description: Directorio de sistema de la instancia.
        KeystoreDirectory:
          type: string
          description: Directorio de las claves y certificados.
        DataDirectory:
          type: string
          description: Directorio de los buzones de los usuarios.
        TempDirectoryName:
          type: string
          description: Nombre del directorio temporal de cada buzón.
        ControlDirectoryName:
          type: string
          description: Nombre del directorio de control de cada buzón.
        FormatDirectoryName:
          type: string
          description: Nombre del directorio de formato de cada buzón.
        InboxDirectoryName:
          type: string
          description: Nombre del directorio de entrada de cada buzón.
        RestartDirectoryName:
          type: string
          description: Nombre del directorio de reanudación de cada buzón.
        OutboxDirectoryName:
          type: string
          description: Nombre del directorio de salida de cada buzón.
        PendingDirectoryName:
          type: string
          description: Nombre del directorio de pendientes de cada buzón.
        BackupDirectoryName:
          type: string
          description: Nombre del directorio de backup de cada buzón.
        LinkDirectoryName:
          type: string
          description: Nombre del directorio de link de cada buzón.
        MaxSessions:
          type: integer
          format: int64
          description: Número máximo de sesiones simultáneas de la instancia.
        IntervalSchedule:
          type: integer
          format: int64
          description: Intervalo de verificación de las agendas.
        SerialNumber:
          type: string
          description: Número de serie de la licencia.
        DisableSchedule:
          type: integer
          format: int64
          description: '`1` deshabilita la ejecución de las agendas.'
        ExternalLockEnable:
          type: integer
          format: int64
          description: '`1` habilita el lock externo.'
        ExternalLockTimeout:
          type: integer
          format: int64
          description: Tiempo límite del lock externo.
        ExternalLockWait:
          type: integer
          format: int64
          description: Espera entre intentos de obtener el lock.
        ExternalLockRetries:
          type: integer
          format: int64
          description: Intentos de obtener el lock.
        ExternalLockType:
          type: string
          description: 'Proveedor del lock externo: `in-memory`, `filesystem` o `redis`.'
        ExternalLockAddress:
          type: string
          description: Dirección del servicio de lock externo (`host:puerto`).
        MaximunConsoleMsgs:
          type: integer
          format: int64
          description: Número máximo de mensajes mantenidos en la consola.
        MaximunAsyncProcesses:
          type: integer
          format: int64
          description: Número máximo de procesos simultáneos.
        MaxMonitorSessions:
          type: integer
          format: int64
          description: Número máximo de sesiones de supervisión.
        ssoProviders:
          type: array
          items:
            $ref: '#/components/schemas/SsoProvider'
          description: Proveedores de identidad (SSO).
      description: 'Inicio de la instancia: servicio, directorios, sesiones, lock externo y proveedores SSO.'
    SsoProvider:
      type: object
      properties:
        ssoEnable:
          type: boolean
          description: Habilita el proveedor.
        ssoName:
          type: string
          description: Nombre del proveedor. `google`, `microsoft` y `apple` tienen tratamiento específico.
        ssoType:
          type: string
          description: 'Tipo: `oauth2`, `saml2`, `jwt` o `ldap`.'
        ssoClientId:
          type: string
          description: ID de la aplicación (OAuth 2.0/SAML 2.0) o usuario (LDAP).
        ssoClientSecret:
          type: string
          format: password
          description: 'Secreto de la aplicación (OAuth 2.0/SAML 2.0) o contraseña (LDAP). Dato sensible: vuelve enmascarado
            en las consultas.'
        ssoTenantOrTeamId:
          type: string
          description: Tenant (Microsoft), Team ID (Apple) o dominio (LDAP).
        ssoPrivateKeyFile:
          type: string
          description: Clave privada de firma (Apple, JWT o SAML 2.0).
        ssoPrivateKeyPswd:
          type: string
          format: password
          description: 'Contraseña de la clave privada. Dato sensible: vuelve enmascarado en las consultas.'
        ssoPrivateKeyId:
          type: string
          description: ID de la clave de firma (Apple o JWT).
        ssoScope:
          type: string
          description: Alcances (OAuth 2.0), filtro de búsqueda (LDAP) o claim `scope` (JWT).
        ssoAudience:
          type: string
          description: Audience esperado o emitido (SAML 2.0 o JWT). Si se omite, usa `ssoTenantOrTeamId` (SAML 2.0) o `ssoClientId`
            (JWT).
        ssoCertsUrl:
          type: string
          description: Certificados para validar el ID token (OAuth 2.0) o la firma del JWT.
        ssoAuthUrl:
          type: string
          description: URL de autorización (OAuth 2.0) o metadata del IdP (SAML 2.0).
        ssoTokenUrl:
          type: string
          description: URL de obtención del token (OAuth 2.0).
        ssoLogoutUrl:
          type: string
          description: URL de logout/end session del IdP (OAuth 2.0).
        ssoRedirectUrlOrEndpoint:
          type: string
          description: Callback de login (OAuth 2.0), ACS (SAML 2.0) o endpoint de conexión (LDAP).
        ssoRedirectLogoutUrl:
          type: string
          description: Callback de logout (OAuth 2.0, SAML 2.0). Obligatorio en OAuth 2.0 para proveedores con retorno de
            logout, como Microsoft.
        ssoAppRedirectUrl:
          type: string
          description: Destino del operador después del logout (OAuth 2.0, SAML 2.0).
        ssoMethodName:
          type: string
          description: Algoritmo de firma del JWT.
        ssoTokenExpirationTime:
          type: integer
          description: Validez predeterminada del JWT, en segundos.
      description: Proveedor de identidad (SSO).
    CfgUser:
      type: object
      properties:
        Entity:
          $ref: '#/components/schemas/CfgEntity'
        General:
          $ref: '#/components/schemas/CfgUserGeneral'
        Token:
          $ref: '#/components/schemas/CfgUserToken'
        Net1:
          $ref: '#/components/schemas/CfgUserNet'
        Net2:
          $ref: '#/components/schemas/CfgUserNet'
        OFTP:
          $ref: '#/components/schemas/CfgUserOFTP'
        SFTP:
          $ref: '#/components/schemas/CfgUserSFTP'
        S3:
          $ref: '#/components/schemas/CfgUserS3'
        AzBlob:
          $ref: '#/components/schemas/CfgUserAzBlob'
        OciBlob:
          $ref: '#/components/schemas/CfgUserOciBlob'
        GcpBlob:
          $ref: '#/components/schemas/CfgUserGcpBlob'
        WhatsApp:
          $ref: '#/components/schemas/CfgUserWhatsApp'
        AS2:
          $ref: '#/components/schemas/CfgUserAS2'
        FTP:
          $ref: '#/components/schemas/CfgUserFTP'
        WebHook:
          $ref: '#/components/schemas/CfgUserWebHook'
      description: '`CONFIG_TXT` del usuario de transferencia. Complete la sección del protocolo indicado en `General.TransferProtocol`.'
    CfgUserGeneral:
      type: object
      properties:
        IdCodeProfile:
          type: string
          description: Identificación del usuario.
        Description:
          type: string
          description: Descripción.
        Email:
          type: string
          description: Correo electrónico del usuario.
        Mobile:
          type: string
          description: Celular del usuario.
        Password:
          type: string
          format: password
          description: 'Contraseña del usuario. Dato sensible: vuelve enmascarado en las consultas.'
        MaxSessions:
          type: integer
          format: int64
          description: Número máximo de sesiones simultáneas.
        EnabledEERP:
          type: integer
          format: int64
          description: '`1` habilita el EERP (confirmación de entrega del OFTP).'
        Backup:
          type: integer
          format: int64
          description: '`1` mantiene una copia de los archivos transmitidos.'
        Locked:
          type: integer
          format: int64
          description: '`1` = bloqueado; `0` = liberado.'
        AuthPswdNeverExpire:
          type: integer
          format: int64
          description: '`1` = la contraseña no expira.'
        ConnectionBeforeCommand:
          type: string
          description: Comando ejecutado antes de la conexión.
        ConnectionStartCommand:
          type: string
          description: Comando ejecutado al inicio de la conexión.
        ConnectionStartCommandWait:
          type: integer
          format: int64
          description: '`1` espera el fin del comando.'
        ConnectionEndCommand:
          type: string
          description: Comando ejecutado al final de la conexión.
        ConnectionEndCommandWait:
          type: integer
          format: int64
          description: '`1` espera el fin del comando.'
        ConnectionBeforeCommandWait:
          type: integer
          format: int64
          description: '`1` espera el fin del comando.'
        FileMinLenFilterTx:
          type: integer
          format: int64
          description: Tamaño mínimo de los archivos transmitidos.
        FileMinLenFilterRx:
          type: integer
          format: int64
          description: Tamaño mínimo de los archivos recibidos.
        FileTypeDefault:
          type: string
          description: Tipo de archivo predeterminado.
        ConnectionFilter:
          type: string
          description: Filtro de direcciones de origen aceptadas en la conexión.
        FileFilterTx:
          type: string
          description: Filtro (máscara) de los archivos transmitidos.
        FileFilterRx:
          type: string
          description: Filtro (máscara) de los archivos recibidos.
        FileLenFilterTx:
          type: integer
          format: int64
          description: Tamaño máximo de los archivos transmitidos.
        FileLenFilterRx:
          type: integer
          format: int64
          description: Tamaño máximo de los archivos recibidos.
        FileUserdataWithFileIdTx:
          type: integer
          format: int64
        CreateControlCompletedFileRx:
          type: integer
          format: int64
          description: 'Archivo de control de recepción concluida: `0` deshabilitado, `1` habilitado con timestamp, `2` habilitado.'
        StartDateHour:
          type: integer
          format: int64
          description: Hora de inicio de la ventana de horario.
        StartDateMinute:
          type: integer
          format: int64
          description: Minuto de inicio de la ventana de horario.
        StartDateSecond:
          type: integer
          format: int64
          description: Segundo de inicio de la ventana de horario.
        EndDateHour:
          type: integer
          format: int64
          description: Hora de fin de la ventana de horario.
        EndDateMinute:
          type: integer
          format: int64
          description: Minuto de fin de la ventana de horario.
        EndDateSecond:
          type: integer
          format: int64
          description: Segundo de fin de la ventana de horario.
        WeekDayInterval:
          type: integer
          format: int64
          description: Días de la semana de la ventana de horario.
        TransferProtocol:
          type: integer
          format: int64
          description: 'Protocolo de la conexión de salida: `0` deshabilitado, `1` OFTP, `2` SFTP, `4` Amazon S3, `5` Azure
            Blob Storage, `6` OCI Object Storage, `7` Google Cloud Storage, `8` WhatsApp, `9` FTP, `10` AS2, `11` Webhook.'
        TxOptimized:
          type: integer
          format: int64
          description: '`1` habilita la transmisión optimizada.'
        AuthMFAMethod:
          type: integer
          format: int64
          description: 'MFA del usuario: `0` sigue la instancia; `128` deshabilitado para este usuario.'
        TransferProtocolIn:
          type: integer
          format: int64
          description: 'Protocolos aceptados en la conexión de entrada, como suma de `2^protocolo` (códigos de `TransferProtocol`).
            Ejemplo: OFTP y SFTP = `2 + 4` = `6`.'
      description: 'Datos generales del usuario: identificación, contraseña, protocolo, sesiones, filtros de archivo, comandos
        de la conexión y ventana de horario.'
    CfgUserToken:
      type: object
      properties:
        DLLName:
          type: string
          description: Biblioteca del módulo.
        CheckTokenId:
          type: integer
          format: int64
          description: '`1` exige el token en la autenticación del usuario.'
        SendTokenId:
          type: integer
          format: int64
          description: '`1` envía el token en la conexión.'
        Token:
          type: string
          format: password
          description: 'Token del usuario. Dato sensible: vuelve enmascarado en las consultas.'
      description: Token de autenticación del usuario.
    CfgUserNet:
      type: object
      properties:
        Enable:
          type: integer
          format: int64
          description: '`1` habilita la red.'
        Debug:
          type: integer
          format: int64
          description: Nivel de debug.
        DLLName:
          type: string
          description: Biblioteca del módulo.
        Type:
          type: string
        Mode:
          type: string
        FTPDownloadRemoteDir:
          type: string
          description: Directorio remoto desde donde se descargan los archivos.
        FTPDownloadRemoteFileMask:
          type: string
          description: Máscara de los archivos descargados.
        FTPDownloadRemoteFileRemove:
          type: integer
          format: int64
          description: '`1` elimina el archivo remoto después de la descarga.'
        FTPDownloadRemoteTmpDir:
          type: string
          description: Directorio remoto temporal usado en la descarga.
        FTPDownloadRemoteTmpExt:
          type: string
          description: Extensión temporal usada en la descarga.
        FTPMaxBufSize:
          type: integer
          format: int64
          description: Tamaño máximo del búfer.
        FTPPassive:
          type: integer
          format: int64
          description: '`1` usa modo pasivo. Ignorado en Riversoft STCP DirectLink, que siempre usa el modo pasivo.'
        FTPProxyEnabled:
          type: integer
          format: int64
          description: '`1` usa proxy; `0` no usa.'
        FTPProxyType:
          type: integer
          format: int64
          description: '`0` SOCKS4, `1` SOCKS5, `2` HTTP, `3` HTTPS, `4` FTP.'
        FTPProxyAuth:
          type: integer
          format: int64
          description: 'Autenticación en el proxy. HTTP: `0` Basic, `1` NTLM. FTP: `0` ninguna, `1` SITE, `2` USER@SITE, `3`
            USER con login, `4` USER/PASS/ACCT, `5` OPEN, `6` firewall SITE.'
        FTPProxyRemoteAddress:
          type: string
          description: Dirección del proxy.
        FTPProxyRemotePort:
          type: integer
          format: int64
          description: Puerto del proxy.
        FTPProxyUserName:
          type: string
          description: Usuario del proxy.
        FTPProxyUserPswd:
          type: string
          format: password
          description: 'Contraseña del proxy. Dato sensible: vuelve enmascarado en las consultas.'
        FTPRemoteAddress:
          type: string
          description: Dirección del servidor remoto.
        FTPRemotePort:
          type: integer
          format: int64
          description: Puerto del servidor remoto.
        FTPLocalAddress:
          type: string
          description: Dirección local de origen de la conexión.
        FTPLocalPort:
          type: integer
          format: int64
          description: Puerto local de origen de la conexión.
        FTPSecurity:
          type: integer
          format: int64
          description: Nivel de seguridad (TLS) de la conexión.
        FTPSSLCAField:
          type: string
          description: Ignorado en Riversoft STCP DirectLink.
        FTPSSLCAValue:
          type: string
          description: Ignorado en Riversoft STCP DirectLink.
        FTPSSLCAFile:
          type: string
          description: Archivo de la CA.
        FTPSSLCiphers:
          type: string
          description: Cifrados TLS aceptados.
        FTPSSLVerifyCerts:
          type: integer
          format: int64
          description: '`1` valida el certificado del servidor.'
        FTPSSLCertFile:
          type: string
          description: Certificado del cliente.
        FTPSSLClientPrivKeyFile:
          type: string
          description: Clave privada del cliente.
        FTPSSLClientPrivKeyPswd:
          type: string
          format: password
          description: 'Contraseña de la clave privada del cliente. Dato sensible: vuelve enmascarado en las consultas.'
        FTPUploadRemoteDir:
          type: string
          description: Directorio remoto adonde se envían los archivos.
        FTPUploadRemoteTmpDir:
          type: string
          description: Directorio remoto temporal usado en el envío.
        FTPUploadRemoteTmpExt:
          type: string
          description: Extensión temporal usada en el envío.
        FTPDownloadCheckSizeDisabled:
          type: integer
          format: int64
        FTPDownloadType:
          type: string
        FTPDirSeparator:
          type: string
        SFTPDownloadRemoteDir:
          type: string
          description: Directorio remoto desde donde se descargan los archivos.
        SFTPDownloadRemoteFileMask:
          type: string
          description: Máscara de los archivos descargados.
        SFTPDownloadRemoteFileRemove:
          type: integer
          format: int64
          description: '`1` elimina el archivo remoto después de la descarga.'
        SFTPDownloadRemoteTmpDir:
          type: string
          description: Directorio remoto temporal usado en la descarga.
        SFTPDownloadRemoteTmpExt:
          type: string
          description: Extensión temporal usada en la descarga.
        SFTPMaxBufSize:
          type: integer
          format: int64
          description: Tamaño máximo del búfer.
        SFTPProxyEnabled:
          type: integer
          format: int64
          description: '`1` usa proxy; `0` no usa.'
        SFTPProxyType:
          type: integer
          format: int64
          description: '`0` SOCKS4, `1` SOCKS5, `2` HTTP, `3` HTTPS, `4` FTP.'
        SFTPProxyAuth:
          type: integer
          format: int64
          description: 'Autenticación en el proxy. HTTP: `0` Basic, `1` NTLM. FTP: `0` ninguna, `1` SITE, `2` USER@SITE, `3`
            USER con login, `4` USER/PASS/ACCT, `5` OPEN, `6` firewall SITE.'
        SFTPProxyRemoteAddress:
          type: string
          description: Dirección del proxy.
        SFTPProxyRemotePort:
          type: integer
          format: int64
          description: Puerto del proxy.
        SFTPProxyUserName:
          type: string
          description: Usuario del proxy.
        SFTPProxyUserPswd:
          type: string
          format: password
          description: 'Contraseña del proxy. Dato sensible: vuelve enmascarado en las consultas.'
        SFTPRemoteAddress:
          type: string
          description: Dirección del servidor remoto.
        SFTPRemotePort:
          type: integer
          format: int64
          description: Puerto del servidor remoto.
        SFTPLocalAddress:
          type: string
          description: Dirección local de origen de la conexión.
        SFTPLocalPort:
          type: integer
          format: int64
          description: Puerto local de origen de la conexión.
        SFTPSecurity:
          type: integer
          format: int64
          description: Nivel de seguridad (TLS) de la conexión.
        SFTPSSLClientPrivKeyFile:
          type: string
          description: Clave privada del cliente.
        SFTPSSLClientPrivKeyPswd:
          type: string
          format: password
          description: 'Contraseña de la clave privada del cliente. Dato sensible: vuelve enmascarado en las consultas.'
        SFTPSSLServerFingerPrint:
          type: string
          description: Fingerprint esperado de la clave del servidor.
        SFTPUploadRemoteDir:
          type: string
          description: Directorio remoto adonde se envían los archivos.
        SFTPUploadRemoteTmpDir:
          type: string
          description: Directorio remoto temporal usado en el envío.
        SFTPUploadRemoteTmpExt:
          type: string
          description: Extensión temporal usada en el envío.
        SFTPCipher:
          type: string
          description: Cifrados aceptados.
        TCPAuthentication:
          type: integer
          format: int64
        TCPCompress:
          type: integer
          format: int64
          description: '`1` habilita la compresión.'
        TCPCryptLevel:
          type: integer
          format: int64
        TCPLocalAddress:
          type: string
          description: Dirección local de origen de la conexión.
        TCPLocalPort:
          type: integer
          format: int64
          description: Puerto local de origen de la conexión.
        TCPMaxRecvBuf:
          type: integer
          format: int64
          description: Tamaño del búfer de recepción.
        TCPMaxSendBuf:
          type: integer
          format: int64
          description: Tamaño del búfer de envío.
        TCPProxyEnabled:
          type: integer
          format: int64
          description: '`1` usa proxy; `0` no usa.'
        TCPProxyType:
          type: integer
          format: int64
          description: '`0` SOCKS4, `1` SOCKS5, `2` HTTP, `3` HTTPS, `4` FTP.'
        TCPProxyAuth:
          type: integer
          format: int64
          description: 'Autenticación en el proxy. HTTP: `0` Basic, `1` NTLM. FTP: `0` ninguna, `1` SITE, `2` USER@SITE, `3`
            USER con login, `4` USER/PASS/ACCT, `5` OPEN, `6` firewall SITE.'
        TCPProxyRemoteAddress:
          type: string
          description: Dirección del proxy.
        TCPProxyRemotePort:
          type: integer
          format: int64
          description: Puerto del proxy.
        TCPProxyUserName:
          type: string
          description: Usuario del proxy.
        TCPProxyUserPswd:
          type: string
          format: password
          description: 'Contraseña del proxy. Dato sensible: vuelve enmascarado en las consultas.'
        TCPRemoteAddress:
          type: string
          description: Dirección del servidor remoto.
        TCPRemotePort:
          type: integer
          format: int64
          description: Puerto del servidor remoto.
        TCPRfc2204:
          type: integer
          format: int64
        TCPSecurity:
          type: integer
          format: int64
          description: Nivel de seguridad (TLS) de la conexión.
        TCPSSLCAFile:
          type: string
          description: Archivo de la CA.
        TCPSSLCAPath:
          type: string
          description: Directorio de las CA.
        TCPSSLCertFile:
          type: string
          description: Certificado del cliente.
        TCPSSLCipher:
          type: string
          description: Cifrados TLS aceptados.
        TCPSSLDebugDir:
          type: string
          description: Directorio del debug de TLS.
        TCPSSLDebugLevel:
          type: integer
          format: int64
          description: Nivel de debug de TLS.
        TCPSSLPrivKeyFile:
          type: string
          description: Clave privada.
        TCPSSLPrivKeyPswd:
          type: string
          format: password
          description: 'Contraseña de la clave privada. Dato sensible: vuelve enmascarado en las consultas.'
        TCPIPv6:
          type: integer
          format: int64
          description: '`1` usa IPv6.'
        TCPMaxListen:
          type: integer
          format: int64
          description: Tamaño de la cola de conexiones pendientes.
        TCPMaxRecvTO:
          type: integer
          format: int64
          description: Tiempo límite de recepción.
        TCPMaxSendTO:
          type: integer
          format: int64
          description: Tiempo límite de envío.
        TCPSSLDHFile:
          type: string
          description: Archivo de parámetros Diffie-Hellman.
        TCPSSLVerifyCert:
          type: integer
          format: int64
          description: '`1` valida el certificado del servidor.'
        TCPSSLOldVersionsEnabled:
          type: integer
          format: int64
          description: '`1` acepta versiones antiguas de TLS.'
        S3Endpoint:
          type: string
          description: Endpoint del servicio.
        S3Region:
          type: string
          description: Región.
        S3DownloadBucket:
          type: string
          description: Bucket desde donde se descargan los archivos.
        S3DownloadPrefix:
          type: string
          description: Prefijo (carpeta) de los objetos descargados.
        S3DownloadDelimiter:
          type: string
          description: Delimitador de carpetas en el listado.
        S3DownloadRemoteFileMask:
          type: string
          description: Máscara de los archivos descargados.
        S3DownloadRemoteFileRemove:
          type: integer
          format: int64
          description: '`1` elimina el archivo remoto después de la descarga.'
        S3DownloadRemoteTmpDir:
          type: string
          description: Directorio remoto temporal usado en la descarga.
        S3DownloadRemoteTmpExt:
          type: string
          description: Extensión temporal usada en la descarga.
        S3UploadBucket:
          type: string
          description: Bucket adonde se envían los archivos.
        S3UploadPrefix:
          type: string
          description: Prefijo (carpeta) de los objetos enviados.
        S3VerifyBuckets:
          type: integer
          format: int64
          description: '`1` verifica la existencia de los buckets.'
        AzBlobEndpoint:
          type: string
          description: Endpoint del servicio.
        AzBlobDownloadContainer:
          type: string
          description: Container desde donde se descargan los archivos.
        AzBlobDownloadPrefix:
          type: string
          description: Prefijo (carpeta) de los objetos descargados.
        AzBlobDownloadRemoteFileMask:
          type: string
          description: Máscara de los archivos descargados.
        AzBlobDownloadRemoteFileRemove:
          type: integer
          format: int64
          description: '`1` elimina el archivo remoto después de la descarga.'
        AzBlobDownloadRemoteTmpDir:
          type: string
          description: Directorio remoto temporal usado en la descarga.
        AzBlobDownloadRemoteTmpExt:
          type: string
          description: Extensión temporal usada en la descarga.
        AzBlobUploadContainer:
          type: string
          description: Container adonde se envían los archivos.
        AzBlobUploadPrefix:
          type: string
          description: Prefijo (carpeta) de los objetos enviados.
        OciBlobEndpoint:
          type: string
          description: Endpoint del servicio.
        OciBlobTenancy:
          type: string
          description: Tenancy (OCID) de OCI.
        OciBlobRegion:
          type: string
          description: Región.
        OciBlobDownloadBucket:
          type: string
          description: Bucket desde donde se descargan los archivos.
        OciBlobDownloadPrefix:
          type: string
          description: Prefijo (carpeta) de los objetos descargados.
        OciBlobDownloadDelimiter:
          type: string
          description: Delimitador de carpetas en el listado.
        OciBlobDownloadRemoteFileMask:
          type: string
          description: Máscara de los archivos descargados.
        OciBlobDownloadRemoteFileRemove:
          type: integer
          format: int64
          description: '`1` elimina el archivo remoto después de la descarga.'
        OciBlobDownloadRemoteTmpDir:
          type: string
          description: Directorio remoto temporal usado en la descarga.
        OciBlobDownloadRemoteTmpExt:
          type: string
          description: Extensión temporal usada en la descarga.
        OciBlobUploadBucket:
          type: string
          description: Bucket adonde se envían los archivos.
        OciBlobUploadPrefix:
          type: string
          description: Prefijo (carpeta) de los objetos enviados.
        GcpBlobEndpoint:
          type: string
          description: Endpoint del servicio.
        GcpBlobRegion:
          type: string
          description: Región.
        GcpBlobDownloadBucket:
          type: string
          description: Bucket desde donde se descargan los archivos.
        GcpBlobDownloadPrefix:
          type: string
          description: Prefijo (carpeta) de los objetos descargados.
        GcpBlobDownloadDelimiter:
          type: string
          description: Delimitador de carpetas en el listado.
        GcpBlobDownloadRemoteFileMask:
          type: string
          description: Máscara de los archivos descargados.
        GcpBlobDownloadRemoteFileRemove:
          type: integer
          format: int64
          description: '`1` elimina el archivo remoto después de la descarga.'
        GcpBlobDownloadRemoteTmpDir:
          type: string
          description: Directorio remoto temporal usado en la descarga.
        GcpBlobDownloadRemoteTmpExt:
          type: string
          description: Extensión temporal usada en la descarga.
        GcpBlobUploadBucket:
          type: string
          description: Bucket adonde se envían los archivos.
        GcpBlobUploadPrefix:
          type: string
          description: Prefijo (carpeta) de los objetos enviados.
        WhatsAppEndpoint:
          type: string
          description: Endpoint del servicio.
        WhatsAppDownloadMode:
          type: integer
          format: int64
          description: 'Modo de descarga del documento: `0` ID del documento en Meta, `1` link de Meta, `2` link seguro sin
            contraseña, `3` link seguro con contraseña.'
        WhatsAppSecureLinkEndpoint:
          type: string
          description: Endpoint de la API de link seguro.
        AS2PartnerUrl:
          type: string
          description: URL del socio.
        AS2ProxyEnabled:
          type: integer
          format: int64
          description: '`1` usa proxy; `0` no usa.'
        AS2ProxyType:
          type: integer
          format: int64
          description: '`0` SOCKS4, `1` SOCKS5, `2` HTTP, `3` HTTPS, `4` FTP.'
        AS2ProxyAuth:
          type: integer
          format: int64
          description: 'Autenticación en el proxy. HTTP: `0` Basic, `1` NTLM. FTP: `0` ninguna, `1` SITE, `2` USER@SITE, `3`
            USER con login, `4` USER/PASS/ACCT, `5` OPEN, `6` firewall SITE.'
        AS2ProxyRemoteAddress:
          type: string
          description: Dirección del proxy.
        AS2ProxyRemotePort:
          type: integer
          format: int64
          description: Puerto del proxy.
        AS2ProxyUserName:
          type: string
          description: Usuario del proxy.
        AS2ProxyUserPswd:
          type: string
          format: password
          description: 'Contraseña del proxy. Dato sensible: vuelve enmascarado en las consultas.'
        AS2LocalAddress:
          type: string
          description: Dirección local de origen de la conexión.
        AS2LocalPort:
          type: integer
          format: int64
          description: Puerto local de origen de la conexión.
        AS2TLSClientPrivKeyFile:
          type: string
          description: Clave privada del cliente.
        AS2TLSClientPrivKeyPswd:
          type: string
          format: password
          description: 'Contraseña de la clave privada del cliente. Dato sensible: vuelve enmascarado en las consultas.'
        AS2TLSCertFile:
          type: string
          description: Certificado del cliente.
        AS2TLSCAFile:
          type: string
          description: Archivo de la CA.
        AS2TLSSCiphers:
          type: string
          description: Cifrados TLS aceptados.
        AS2TLSVerifyCerts:
          type: integer
          format: int64
          description: '`1` valida el certificado del servidor.'
        WebHookPartnerUrl:
          type: string
          description: URL del socio.
        WebHookProxyEnabled:
          type: integer
          format: int64
          description: '`1` usa proxy; `0` no usa.'
        WebHookProxyType:
          type: integer
          format: int64
          description: '`0` SOCKS4, `1` SOCKS5, `2` HTTP, `3` HTTPS, `4` FTP.'
        WebHookProxyAuth:
          type: integer
          format: int64
          description: 'Autenticación en el proxy. HTTP: `0` Basic, `1` NTLM. FTP: `0` ninguna, `1` SITE, `2` USER@SITE, `3`
            USER con login, `4` USER/PASS/ACCT, `5` OPEN, `6` firewall SITE.'
        WebHookProxyRemoteAddress:
          type: string
          description: Dirección del proxy.
        WebHookProxyRemotePort:
          type: integer
          format: int64
          description: Puerto del proxy.
        WebHookProxyUserName:
          type: string
          description: Usuario del proxy.
        WebHookProxyUserPswd:
          type: string
          format: password
          description: 'Contraseña del proxy. Dato sensible: vuelve enmascarado en las consultas.'
        WebHookLocalAddress:
          type: string
          description: Dirección local de origen de la conexión.
        WebHookLocalPort:
          type: integer
          format: int64
          description: Puerto local de origen de la conexión.
        WebHookTLSClientPrivKeyFile:
          type: string
          description: Clave privada del cliente.
        WebHookTLSClientPrivKeyPswd:
          type: string
          format: password
          description: 'Contraseña de la clave privada del cliente. Dato sensible: vuelve enmascarado en las consultas.'
        WebHookTLSCertFile:
          type: string
          description: Certificado del cliente.
        WebHookTLSCAFile:
          type: string
          description: Archivo de la CA.
        WebHookTLSSCiphers:
          type: string
          description: Cifrados TLS aceptados.
        WebHookTLSVerifyCerts:
          type: integer
          format: int64
          description: '`1` valida el certificado del servidor.'
      description: 'Red de la conexión. Los campos tienen el prefijo del protocolo (`TCP`, `FTP`, `SFTP`, `S3`, `AzBlob`,
        `OciBlob`, `GcpBlob`, `WhatsApp`, `AS2`, `WebHook`): complete solo los del protocolo usado. `Net1` es la red principal
        y `Net2`, la alternativa.'
    CfgUserOFTP:
      type: object
      properties:
        Idcode:
          type: string
          description: Identificación (login) en el protocolo.
        Password:
          type: string
          format: password
          description: 'Contraseña. Dato sensible: vuelve enmascarado en las consultas.'
        UserData:
          type: string
          description: Userdata del protocolo.
        Level:
          type: string
          description: Versión del protocolo OFTP.
        DLLName:
          type: string
          description: Biblioteca del módulo.
        InitMode:
          type: string
          description: '`Both`, `Initiator` (inicia la conexión) o `Responder` (espera la conexión).'
        Mode:
          type: string
          description: '`Both`, `Sender` (solo transmite) o `Receiver` (solo recibe).'
        Compression:
          type: integer
          format: int64
          description: '`1` habilita la compresión.'
        SpecialLogic:
          type: integer
          format: int64
        Credits:
          type: integer
          format: int64
          description: Créditos (ventana de mensajes) del OFTP.
        Restart:
          type: integer
          format: int64
          description: '`1` habilita la reanudación de transferencias interrumpidas.'
        MaxBufSize:
          type: integer
          format: int64
          description: Tamaño máximo del búfer.
        Timeout:
          type: integer
          format: int64
          description: Tiempo límite de inactividad.
        T1:
          type: integer
          format: int64
        T2:
          type: integer
          format: int64
        NumMaxRetry:
          type: integer
          format: int64
          description: Número máximo de intentos.
        Debug:
          type: integer
          format: int64
          description: Nivel de debug.
        MaxLenDsn:
          type: integer
          format: int64
          description: Tamaño máximo del nombre del archivo (DSN).
        Authentication:
          type: integer
          format: int64
        LocalPrivateKeyFile:
          type: string
          description: Clave privada local (OFTP 2).
        LocalPrivateKeyPswd:
          type: string
          format: password
          description: 'Contraseña de la clave privada local. Dato sensible: vuelve enmascarado en las consultas.'
        LocalCertFile:
          type: string
          description: Certificado local (OFTP 2).
        RemoteCertFile:
          type: string
          description: Certificado del socio (OFTP 2).
      description: Protocolo OFTP del usuario.
    CfgUserSFTP:
      type: object
      properties:
        Idcode:
          type: string
          description: Identificación (login) en el protocolo.
        Password:
          type: string
          format: password
          description: 'Contraseña. Dato sensible: vuelve enmascarado en las consultas.'
        UserData:
          type: string
          description: Userdata del protocolo.
        DLLName:
          type: string
          description: Biblioteca del módulo.
        InitMode:
          type: string
          description: '`Both`, `Initiator` (inicia la conexión) o `Responder` (espera la conexión).'
        Mode:
          type: string
          description: '`Both`, `Sender` (solo transmite) o `Receiver` (solo recibe).'
        MaxBufSize:
          type: integer
          format: int64
          description: Tamaño máximo del búfer.
        Timeout:
          type: integer
          format: int64
          description: Tiempo límite de inactividad.
        Debug:
          type: integer
          format: int64
          description: Nivel de debug.
        MaxLenDsn:
          type: integer
          format: int64
          description: Tamaño máximo del nombre del archivo (DSN).
        SFTPSysdateFormat:
          type: string
          description: Formato de la fecha usado en los nombres de archivo.
        PublicKey:
          type: string
          description: Clave pública del usuario.
      description: Protocolo SFTP del usuario.
    CfgUserS3:
      type: object
      properties:
        Idcode:
          type: string
          description: Identificación (login) en el protocolo.
        SecretCode:
          type: string
          format: password
          description: 'Secreto de acceso. Dato sensible: vuelve enmascarado en las consultas.'
        AccessToken:
          type: string
          format: password
          description: 'Token de acceso. Dato sensible: vuelve enmascarado en las consultas.'
        Userdata:
          type: string
          description: Userdata del protocolo.
        InitMode:
          type: string
          description: '`Both`, `Initiator` (inicia la conexión) o `Responder` (espera la conexión).'
        Mode:
          type: string
          description: '`Both`, `Sender` (solo transmite) o `Receiver` (solo recibe).'
        MaxBufSize:
          type: integer
          format: int64
          description: Tamaño máximo del búfer.
        Timeout:
          type: integer
          format: int64
          description: Tiempo límite de inactividad.
        Debug:
          type: integer
          format: int64
          description: Nivel de debug.
      description: Almacenamiento en la nube Amazon S3.
    CfgUserAzBlob:
      type: object
      properties:
        Idcode:
          type: string
          description: Identificación (login) en el protocolo.
        SecretCode:
          type: string
          format: password
          description: 'Secreto de acceso. Dato sensible: vuelve enmascarado en las consultas.'
        AccessToken:
          type: string
          format: password
          description: 'Token de acceso. Dato sensible: vuelve enmascarado en las consultas.'
        Userdata:
          type: string
          description: Userdata del protocolo.
        InitMode:
          type: string
          description: '`Both`, `Initiator` (inicia la conexión) o `Responder` (espera la conexión).'
        Mode:
          type: string
          description: '`Both`, `Sender` (solo transmite) o `Receiver` (solo recibe).'
        MaxBufSize:
          type: integer
          format: int64
          description: Tamaño máximo del búfer.
        Timeout:
          type: integer
          format: int64
          description: Tiempo límite de inactividad.
        Debug:
          type: integer
          format: int64
          description: Nivel de debug.
      description: Almacenamiento en la nube Azure Blob Storage.
    CfgUserOciBlob:
      type: object
      properties:
        Idcode:
          type: string
          description: Identificación (login) en el protocolo.
        PrivateKey:
          type: string
          format: password
          description: 'Clave privada de la API OCI. Dato sensible: vuelve enmascarado en las consultas.'
        PrivateKeyPswd:
          type: string
          format: password
          description: 'Contraseña de la clave privada. Dato sensible: vuelve enmascarado en las consultas.'
        Fingerprint:
          type: string
          description: Fingerprint de la clave de la API OCI.
        Userdata:
          type: string
          description: Userdata del protocolo.
        InitMode:
          type: string
          description: '`Both`, `Initiator` (inicia la conexión) o `Responder` (espera la conexión).'
        Mode:
          type: string
          description: '`Both`, `Sender` (solo transmite) o `Receiver` (solo recibe).'
        MaxBufSize:
          type: integer
          format: int64
          description: Tamaño máximo del búfer.
        Timeout:
          type: integer
          format: int64
          description: Tiempo límite de inactividad.
        Debug:
          type: integer
          format: int64
          description: Nivel de debug.
      description: Almacenamiento en la nube OCI Object Storage.
    CfgUserGcpBlob:
      type: object
      properties:
        Idcode:
          type: string
          description: Identificación (login) en el protocolo.
        AccessKey:
          type: string
          format: password
          description: 'Clave o token de acceso. Dato sensible: vuelve enmascarado en las consultas.'
        Userdata:
          type: string
          description: Userdata del protocolo.
        InitMode:
          type: string
          description: '`Both`, `Initiator` (inicia la conexión) o `Responder` (espera la conexión).'
        Mode:
          type: string
          description: '`Both`, `Sender` (solo transmite) o `Receiver` (solo recibe).'
        MaxBufSize:
          type: integer
          format: int64
          description: Tamaño máximo del búfer.
        Timeout:
          type: integer
          format: int64
          description: Tiempo límite de inactividad.
        Debug:
          type: integer
          format: int64
          description: Nivel de debug.
      description: Almacenamiento en la nube Google Cloud Storage.
    CfgUserWhatsApp:
      type: object
      properties:
        Idcode:
          type: string
          description: ID del número de teléfono en WhatsApp Business.
        AccessKey:
          type: string
          format: password
          description: 'Token de la credencial de sistema de Meta. Dato sensible: vuelve enmascarado en las consultas.'
        Userdata:
          type: string
          description: Userdata del protocolo.
        InitMode:
          type: string
          description: '`Both`, `Initiator` (inicia la conexión) o `Responder` (espera la conexión).'
        Mode:
          type: string
          description: '`Both`, `Sender` (solo transmite) o `Receiver` (solo recibe).'
        MaxBufSize:
          type: integer
          format: int64
          description: Tamaño máximo del búfer.
        Timeout:
          type: integer
          format: int64
          description: Tiempo límite de inactividad.
        Debug:
          type: integer
          format: int64
          description: Nivel de debug.
      description: Envío por WhatsApp Business.
    CfgUserAS2:
      type: object
      properties:
        Idcode:
          type: string
          description: AS2 ID local.
        Userdata:
          type: string
          description: Userdata del protocolo.
        InitMode:
          type: string
          description: '`Both`, `Initiator` (inicia la conexión) o `Responder` (espera la conexión).'
        Mode:
          type: string
          description: '`Both`, `Sender` (solo transmite) o `Receiver` (solo recibe).'
        Timeout:
          type: integer
          format: int64
          description: Tiempo límite de inactividad.
        Debug:
          type: integer
          format: int64
          description: Nivel de debug.
        Domain:
          type: string
          description: Dominio usado en la generación del Message-ID.
        PartnerSignatureCert:
          type: string
          description: Certificado de firma del socio.
        PartnerEncryptCert:
          type: string
          description: Certificado de cifrado del socio.
        MyAlgId:
          type: integer
          description: Conjunto de algoritmos de hash, firma y cifrado.
        MySignatureKey:
          type: string
          description: Clave privada de firma.
        MySignatureCert:
          type: string
          description: Certificado de firma.
        MyEncryptKey:
          type: string
          description: Clave privada de cifrado.
        MyEncryptCert:
          type: string
          description: Certificado de cifrado.
        MDNOptions:
          type: integer
          format: int64
          description: 'Opciones del MDN, como suma: `1` habilitado, `2` firmado, `4` asíncrono, `8` cifrado.'
        MDNAsyncURL:
          type: string
          description: URL de entrega del MDN asíncrono.
        AuthMode:
          type: integer
          description: 'Autenticación en el socio: `0` ninguna, `1` Basic, `2` Bearer.'
        AuthUsername:
          type: string
          description: Usuario de la autenticación Basic.
        AuthPassword:
          type: string
          format: password
          description: 'Contraseña de la autenticación Basic. Dato sensible: vuelve enmascarado en las consultas.'
        SendDocumentOptions:
          type: integer
          description: 'Opciones del documento enviado. Suma de los valores: `1` firmado (multipart), `2` firmado, `4` cifrado,
            `8` comprimido. `0` = ninguno.'
        RequiredDocumentOptions:
          type: integer
          description: 'Opciones exigidas en el documento recibido. Suma de los valores: `1` firmado (multipart), `2` firmado,
            `4` cifrado, `8` comprimido. `0` = ninguno.'
        BERCompatibility:
          type: boolean
          description: Compatibilidad con la codificación BER/DER.
      description: 'Protocolo AS2 del usuario: identificación, certificados, MDN y opciones del documento.'
    CfgUserFTP:
      type: object
      properties:
        Idcode:
          type: string
          description: Identificación (login) en el protocolo.
        Password:
          type: string
          format: password
          description: 'Contraseña. Dato sensible: vuelve enmascarado en las consultas.'
        UserData:
          type: string
          description: Userdata del protocolo.
        DLLName:
          type: string
          description: Biblioteca del módulo.
        InitMode:
          type: string
          description: '`Both`, `Initiator` (inicia la conexión) o `Responder` (espera la conexión).'
        Mode:
          type: string
          description: '`Both`, `Sender` (solo transmite) o `Receiver` (solo recibe).'
        MaxBufSize:
          type: integer
          format: int64
          description: Tamaño máximo del búfer.
        Timeout:
          type: integer
          format: int64
          description: Tiempo límite de inactividad.
        Debug:
          type: integer
          format: int64
          description: Nivel de debug.
        MLSD:
          type: integer
          format: int64
          description: '`1` usa el comando MLSD para listar directorios.'
      description: Protocolo FTP/FTPS del usuario.
    CfgUserWebHook:
      type: object
      properties:
        Idcode:
          type: string
          description: Identificación local del Webhook.
        Userdata:
          type: string
          description: Userdata del protocolo.
        InitMode:
          type: string
          description: '`Both`, `Initiator` (inicia la conexión) o `Responder` (espera la conexión).'
        Mode:
          type: string
          description: '`Both`, `Sender` (solo transmite) o `Receiver` (solo recibe).'
        Timeout:
          type: integer
          format: int64
          description: Tiempo límite de inactividad.
        Debug:
          type: integer
          format: int64
          description: Nivel de debug.
        PartnerSignatureCert:
          type: string
          description: Certificado de firma del socio.
        PartnerEncryptCert:
          type: string
          description: Certificado de cifrado del socio.
        MyAlgId:
          type: integer
          description: Conjunto de algoritmos de hash, firma y cifrado.
        MySignatureKey:
          type: string
          description: Clave privada de firma.
        MySignatureCert:
          type: string
          description: Certificado de firma.
        MyEncryptKey:
          type: string
          description: Clave privada de cifrado.
        MyEncryptCert:
          type: string
          description: Certificado de cifrado.
        AuthMode:
          type: integer
          description: 'Autenticación en el socio: `0` ninguna, `1` Basic, `2` Bearer.'
        AuthUsername:
          type: string
          description: Usuario de la autenticación Basic.
        AuthPassword:
          type: string
          format: password
          description: 'Contraseña de la autenticación Basic. Dato sensible: vuelve enmascarado en las consultas.'
        SendDocumentOptions:
          type: integer
          description: 'Opciones del documento enviado. Suma de los valores: `1` firmado (multipart), `2` firmado, `4` cifrado,
            `8` comprimido. `0` = ninguno.'
        RequiredDocumentOptions:
          type: integer
          description: 'Opciones exigidas en el documento recibido. Suma de los valores: `1` firmado (multipart), `2` firmado,
            `4` cifrado, `8` comprimido. `0` = ninguno.'
        BERCompatibility:
          type: boolean
          description: Compatibilidad con la codificación BER/DER.
      description: 'Conector Webhook del usuario: identificación, certificados y opciones del documento.'
    CfgService:
      type: object
      properties:
        Entity:
          $ref: '#/components/schemas/CfgEntity'
        Service:
          $ref: '#/components/schemas/CfgService'
        Net1:
          $ref: '#/components/schemas/CfgServiceNetwork'
        OFTP:
          $ref: '#/components/schemas/CfgServiceOFTP'
        SFTP:
          $ref: '#/components/schemas/CfgServiceSFTP'
        API:
          $ref: '#/components/schemas/CfgServiceAPI'
        WhatsApp:
          $ref: '#/components/schemas/CfgServiceWhatsApp'
        AS2:
          $ref: '#/components/schemas/CfgServiceAS2'
        WebHook:
          $ref: '#/components/schemas/CfgServiceWebHook'
        Monitor:
          $ref: '#/components/schemas/CfgServiceMonitor'
      description: '`CONFIG_TXT` del servicio de red. Complete la sección del tipo indicado en `Service.ServiceType`.'
    CfgServiceNetwork:
      type: object
      properties:
        DLLName:
          type: string
          description: Biblioteca del módulo.
        Mode:
          type: string
        Debug:
          type: integer
          format: int64
          description: Nivel de debug.
        TCPCompress:
          type: integer
          format: int64
          description: '`1` habilita la compresión.'
        TCPSSLDHParam:
          type: string
          description: Archivo de parámetros Diffie-Hellman.
        TCPLocalAddress:
          type: string
          description: Dirección en la que escucha el servicio.
        TCPLocalPort:
          type: integer
          format: int64
          description: Puerto en el que escucha el servicio.
        TCPMaxRecvBuf:
          type: integer
          format: int64
          description: Tamaño del búfer de recepción.
        TCPMaxSendBuf:
          type: integer
          format: int64
          description: Tamaño del búfer de envío.
        TCPRfc2204:
          type: integer
          format: int64
        TCPSecurity:
          type: integer
          format: int64
          description: Nivel de seguridad (TLS) de la conexión.
        TCPSSLCAFile:
          type: string
          description: Archivo de la CA.
        TCPSSLCAPath:
          type: string
          description: Directorio de las CA.
        TCPSSLCertFile:
          type: string
          description: Certificado del cliente.
        TCPSSLCertChainFile:
          type: string
          description: Cadena de certificados.
        TCPSSLCipher:
          type: string
          description: Cifrados TLS aceptados.
        TCPSSLDebugDir:
          type: string
          description: Directorio del debug de TLS.
        TCPSSLDebugLevel:
          type: integer
          format: int64
          description: Nivel de debug de TLS.
        TCPSSLPrivKeyFile:
          type: string
          description: Clave privada.
        TCPSSLPrivKeyPswd:
          type: string
          format: password
          description: 'Contraseña de la clave privada. Dato sensible: vuelve enmascarado en las consultas.'
        TCPv6:
          type: integer
          format: int64
        TCPMaxListen:
          type: integer
          format: int64
          description: Tamaño de la cola de conexiones pendientes.
        TCPSSLVerifyCert:
          type: integer
          format: int64
          description: '`1` valida el certificado del servidor.'
        TCPSSLOldVersionsEnabled:
          type: integer
          format: int64
          description: '`1` acepta versiones antiguas de TLS.'
        TCPMaxRecvTO:
          type: integer
          format: int64
          description: Tiempo límite de recepción.
        TCPMaxSendTO:
          type: integer
          format: int64
          description: Tiempo límite de envío.
      description: Red en la que escucha el servicio (TCP y TLS).
    CfgServiceOFTP:
      type: object
      properties:
        DLLName:
          type: string
          description: Biblioteca del módulo.
        Level:
          type: string
          description: Versión del protocolo OFTP.
        Compression:
          type: integer
          format: int64
          description: '`1` habilita la compresión.'
        Credits:
          type: integer
          format: int64
          description: Créditos (ventana de mensajes) del OFTP.
        Debug:
          type: integer
          format: int64
          description: Nivel de debug.
        Maxbufsize:
          type: integer
          format: int64
          description: Tamaño máximo del búfer.
        Mode:
          type: string
          description: '`Both`, `Sender` (solo transmite) o `Receiver` (solo recibe).'
        NumMaxRetry:
          type: integer
          format: int64
          description: Número máximo de intentos.
        Restart:
          type: integer
          format: int64
          description: '`1` habilita la reanudación de transferencias interrumpidas.'
        SpecialLogic:
          type: integer
          format: int64
        T1:
          type: integer
          format: int64
        T2:
          type: integer
          format: int64
        Timeout:
          type: integer
          format: int64
          description: Tiempo límite de inactividad.
      description: Servicio OFTP.
    CfgServiceSFTP:
      type: object
      properties:
        DLLName:
          type: string
          description: Biblioteca del módulo.
        Debug:
          type: integer
          format: int64
          description: Nivel de debug.
        Timeout:
          type: integer
          format: int64
          description: Tiempo límite de inactividad.
        MaxConnections:
          type: integer
          format: int64
          description: Número máximo de conexiones.
        MaxOpenFiles:
          type: integer
          format: int64
          description: Número máximo de archivos abiertos por conexión.
        MaxReadDirEntries:
          type: integer
          format: int64
          description: Número máximo de entradas por lectura de directorio.
        FileCreatePerms:
          type: integer
          format: int64
          description: Permisos de los archivos creados.
        AuthMode:
          type: integer
          format: int64
          description: Modo de autenticación.
      description: Servicio SFTP.
    CfgServiceAPI:
      type: object
      properties:
        DLLName:
          type: string
          description: Biblioteca del módulo.
        AuthMode:
          type: integer
          description: 'Modos de autenticación aceptados, como suma: `1` Basic, `2` Bearer, `4` token exchange (JWT), `8`
            password grant. `0` acepta todos los modos. El token Bearer siempre se exige en las rutas que no son de autenticación.'
        StaticPagesPath:
          type: string
          description: Directorio de las páginas estáticas.
        TemplatePagesPath:
          type: string
          description: Directorio de los templates de páginas.
        Uri:
          type: string
          description: URL pública del servicio.
        TLSMinVersion:
          type: string
          description: Versión mínima de TLS.
        TLSMaxVersion:
          type: string
          description: Versión máxima de TLS.
        LogEnable:
          type: integer
          format: int64
          description: '`1` habilita el log del servicio.'
        LogFile:
          type: string
          description: Archivo de log del servicio.
        CustomHeaders:
          type: object
          additionalProperties:
            type: string
          description: Headers HTTP adicionales enviados en las respuestas.
        RateLimiterMaxRequests:
          type: integer
          description: Máximo de solicitudes por cliente en la ventana. `0` o menos deshabilita el límite.
        RateLimiterWindowSeconds:
          type: integer
          description: Tamaño de la ventana del límite, en segundos (predeterminado 60).
        RateLimiterPartnerHeader:
          type: string
          description: Header que identifica al socio en el límite de solicitudes (predeterminado `anonymous`).
        RateLimiterCleanupInterval:
          type: integer
          description: Intervalo de limpieza de los controles del límite, en segundos (predeterminado 60).
        RateLimiterMaxStates:
          type: integer
          description: Número máximo de clientes controlados por el límite (predeterminado 10000).
      description: Servicio de API de Riversoft STCP DirectLink.
    CfgServiceWhatsApp:
      type: object
      properties:
        DLLName:
          type: string
          description: Biblioteca del módulo.
        AppSecret:
          type: string
          format: password
          description: 'Secreto de la aplicación en Meta. Obligatorio. Dato sensible: vuelve enmascarado en las consultas.'
        CredentialToken:
          type: string
          format: password
          description: 'Token de la credencial de sistema de Meta. Obligatorio. Dato sensible: vuelve enmascarado en las consultas.'
        Endpoint:
          type: string
          description: Endpoint de la WhatsApp Business API de Meta. Obligatorio.
        VerifyToken:
          type: string
          format: password
          description: 'Token de verificación del webhook. Obligatorio. Dato sensible: vuelve enmascarado en las consultas.'
        Uri:
          type: string
          description: URL de este servicio (webhook). Obligatorio.
        TLSMinVersion:
          type: string
          description: Versión mínima de TLS.
        TLSMaxVersion:
          type: string
          description: Versión máxima de TLS.
        LogEnable:
          type: integer
          format: int64
          description: '`1` habilita el log del servicio.'
        LogFile:
          type: string
          description: Archivo de log del servicio.
        CustomHeaders:
          type: object
          additionalProperties:
            type: string
          description: Headers HTTP adicionales enviados en las respuestas.
        TemplateMessagesPath:
          type: string
          description: Directorio de los templates de mensaje.
      description: Servicio WhatsApp Business (webhook de Meta).
    CfgServiceAS2:
      type: object
      properties:
        DLLName:
          type: string
          description: Biblioteca del módulo.
        AuthMode:
          type: integer
          description: 'Autenticación en el socio: `0` ninguna, `1` Basic, `2` Bearer.'
        Realm:
          type: string
          description: Realm de la autenticación Basic.
        Host:
          type: string
          description: Host público del servicio.
        TLSMinVersion:
          type: string
          description: Versión mínima de TLS.
        TLSMaxVersion:
          type: string
          description: Versión máxima de TLS.
        LogEnable:
          type: integer
          format: int64
          description: '`1` habilita el log del servicio.'
        LogFile:
          type: string
          description: Archivo de log del servicio.
        CustomHeaders:
          type: object
          additionalProperties:
            type: string
          description: Headers HTTP adicionales enviados en las respuestas.
      description: Servicio AS2.
    CfgServiceWebHook:
      type: object
      properties:
        DLLName:
          type: string
          description: Biblioteca del módulo.
        AuthMode:
          type: integer
          description: 'Autenticación en el socio: `0` ninguna, `1` Basic, `2` Bearer.'
        Realm:
          type: string
          description: Realm de la autenticación Basic.
        Host:
          type: string
          description: Host público del servicio.
        TLSMinVersion:
          type: string
          description: Versión mínima de TLS.
        TLSMaxVersion:
          type: string
          description: Versión máxima de TLS.
        LogEnable:
          type: integer
          format: int64
          description: '`1` habilita el log del servicio.'
        LogFile:
          type: string
          description: Archivo de log del servicio.
        CustomHeaders:
          type: object
          additionalProperties:
            type: string
          description: Headers HTTP adicionales enviados en las respuestas.
        RateLimiterMaxRequests:
          type: integer
          description: Máximo de solicitudes por cliente en la ventana. `0` o menos deshabilita el límite.
        RateLimiterWindowSeconds:
          type: integer
          description: Tamaño de la ventana del límite, en segundos (predeterminado 60).
        RateLimiterPartnerHeader:
          type: string
          description: Header que identifica al socio en el límite de solicitudes (predeterminado `anonymous`).
        RateLimiterCleanupInterval:
          type: integer
          description: Intervalo de limpieza de los controles del límite, en segundos (predeterminado 60).
        RateLimiterMaxStates:
          type: integer
          description: Número máximo de clientes controlados por el límite (predeterminado 10000).
      description: Servicio Webhook.
    CfgServiceMonitor:
      type: object
      properties:
        DLLName:
          type: string
          description: Biblioteca del módulo.
        Debug:
          type: integer
          format: int64
          description: Nivel de debug.
        ExternalCommand:
          type: string
          description: Comando externo ejecutado por el servicio.
        MaxRecvBuf:
          type: integer
          format: int64
        MaxSendBuf:
          type: integer
          format: int64
        Password:
          type: string
          format: password
          description: 'Contraseña de la credencial de supervisión. Dato sensible: vuelve enmascarado en las consultas.'
        ReqInterval:
          type: integer
          format: int64
          description: Intervalo entre solicitudes.
        Timeout:
          type: integer
          format: int64
          description: Tiempo límite de inactividad.
        UserName:
          type: string
          description: Usuario de la credencial de supervisión.
      description: Servicio de supervisión.
    CfgSchedule:
      type: object
      properties:
        Entity:
          $ref: '#/components/schemas/CfgEntity'
        Schedule:
          $ref: '#/components/schemas/CfgSchedule'
      description: '`CONFIG_TXT` de la agenda.'
    CfgFileType:
      type: object
      properties:
        Entity:
          $ref: '#/components/schemas/CfgEntity'
        FileConf:
          $ref: '#/components/schemas/CfgFileTypeFileConf'
      description: '`CONFIG_TXT` del tipo de archivo (global o del usuario).'
    CfgFileTypeFileConf:
      type: object
      properties:
        CRCharTX:
          type: integer
          format: int64
        CRCharRX:
          type: integer
          format: int64
        LFCharTX:
          type: integer
          format: int64
        LFCharRX:
          type: integer
          format: int64
        Name:
          type: string
          description: Nombre.
        Description:
          type: string
          description: Descripción.
        FileMatch:
          type: integer
          format: int64
          description: 'Identificación del archivo: `0` predeterminado, `1` prefijo/sufijo, `2` nombre del archivo, `3` expresión
            regular.'
        FileDirection:
          type: integer
          format: int64
          description: 'Sentido: `0` ambos, `1` transmisión deshabilitada, `2` recepción deshabilitada.'
        FileRegex:
          type: string
          description: Patrón de identificación del archivo, según `FileMatch`.
        MaxRecSize:
          type: integer
          format: int64
          description: Tamaño máximo del registro.
        Originator:
          type: string
          description: Originador (OFTP).
        Destination:
          type: string
          description: Destino (OFTP).
        Format:
          type: string
          description: Formato del archivo.
        TranslateTableIn:
          type: string
        TranslateTableOut:
          type: string
        InsertCRLF:
          type: integer
          format: int64
        SupressCRLF:
          type: integer
          format: int64
        TimeStampTx:
          type: integer
          format: int64
          description: '`1` incluye timestamp en el nombre del archivo transmitido.'
        TimeStampRx:
          type: integer
          format: int64
          description: '`1` incluye timestamp en el nombre del archivo recibido.'
        ConvFileNameTx:
          type: integer
          format: int64
        ConvFileNameRx:
          type: integer
          format: int64
        Overwrite:
          type: integer
          format: int64
          description: '`1` sobrescribe el archivo existente en la recepción.'
        CommandLineTx:
          type: string
          description: Comando ejecutado después de la transmisión.
        CommandLineTxWait:
          type: integer
          format: int64
          description: '`1` espera el fin del comando.'
        CommandLineRx:
          type: string
          description: Comando ejecutado después de la recepción.
        CommandLineRxWait:
          type: integer
          format: int64
          description: '`1` espera el fin del comando.'
        CommandLineRead:
          type: string
        CommandLineWrite:
          type: string
        CommandLineCheckTx:
          type: string
        CommandLineCheckRx:
          type: string
        CommandLinePreCheckTx:
          type: string
        CommandLinePreCheckRx:
          type: string
        Compressed:
          type: integer
          format: int64
          description: '`1` comprime el archivo.'
        Envelloped:
          type: integer
          format: int64
          description: '`1` ensobra (firma/cifra) el archivo.'
        EERPSigned:
          type: integer
          format: int64
          description: '`1` exige EERP firmado.'
        EERPOffRx:
          type: integer
          format: int64
        FileTimeRx:
          type: integer
          format: int64
        BackupFileTx:
          type: integer
          format: int64
        SecurityLevel:
          type: integer
          format: int64
        CipherLevel:
          type: integer
          format: int64
        StartDateHour:
          type: integer
          format: int64
          description: Hora de inicio de la ventana de horario.
        StartDateMinute:
          type: integer
          format: int64
          description: Minuto de inicio de la ventana de horario.
        StartDateSecond:
          type: integer
          format: int64
          description: Segundo de inicio de la ventana de horario.
        EndDateHour:
          type: integer
          format: int64
          description: Hora de fin de la ventana de horario.
        EndDateMinute:
          type: integer
          format: int64
          description: Minuto de fin de la ventana de horario.
        EndDateSecond:
          type: integer
          format: int64
          description: Segundo de fin de la ventana de horario.
        WeekDayInterval:
          type: integer
          format: int64
          description: Días de la semana de la ventana de horario.
        DisableLogDupRx:
          type: integer
          format: int64
        Userdata:
          type: string
          description: Userdata del archivo.
        Tags:
          type: string
          description: Tags del tipo de archivo, usadas en los informes.
      description: Identificación del archivo y tratamiento en la transmisión y la recepción.
    CfgRouting:
      type: object
      properties:
        Entity:
          $ref: '#/components/schemas/CfgEntity'
        Rules:
          $ref: '#/components/schemas/CfgRules'
      description: '`CONFIG_TXT` del enrutamiento (Riversoft STCP Gemini Rename).'
    CfgRules:
      type: object
      properties:
        General:
          $ref: '#/components/schemas/CfgRulesGeneral'
        FileMatching:
          type: array
          items:
            $ref: '#/components/schemas/CfgRulesFileMatching'
      description: Exploración y reglas del enrutamiento.
    CfgRulesGeneral:
      type: object
      properties:
        Name:
          type: string
          description: Nombre.
        Description:
          type: string
          description: Descripción.
        ScanDir:
          type: string
          description: Directorio monitoreado.
        ScanSubDir:
          type: integer
          description: '`1` incluye los subdirectorios.'
        ScanDirRegEx:
          type: string
          description: Expresión regular de los directorios incluidos.
        ScanDirRegExNeg:
          type: string
          description: Expresión regular de los directorios ignorados.
        ScanFileRegEx:
          type: string
          description: Expresión regular de los archivos incluidos.
        ScanFileRegExNeg:
          type: string
          description: Expresión regular de los archivos ignorados.
        ScanFirstRule:
          type: integer
        ScanCheckFileInUse:
          type: integer
          description: '`1` ignora los archivos en uso.'
        ScanLockSem:
          type: string
        ScanLockSemTimeout:
          type: integer
        ScanLockSemOptions:
          type: integer
        LogErrorOption:
          type: integer
        LogLevelOnSuccess:
          type: integer
        LogLevelOnWarning:
          type: integer
        LogLevelOnInfo:
          type: integer
        LogLevelOnError:
          type: integer
        DelayRetry:
          type: integer
          description: Espera entre reintentos.
        MaxRetries:
          type: integer
          description: Número máximo de reintentos.
        LastModified:
          type: string
      description: 'Exploración: directorio, filtros, lock, reintentos y niveles de log.'
    CfgRulesFileMatching:
      type: object
      properties:
        Index:
          type: integer
          description: Orden de la regla.
        Name:
          type: string
          description: Nombre.
        Description:
          type: string
          description: Descripción.
        Locked:
          type: integer
          description: '`1` = bloqueado; `0` = liberado.'
        FileRegEx:
          type: string
          description: Expresión regular del nombre del archivo.
        DirRegEx:
          type: string
          description: Expresión regular del directorio.
        SrcRegEx:
          type: string
        ContentRegEx:
          type: string
          description: Expresión regular del contenido del archivo.
        General:
          $ref: '#/components/schemas/CfgFileMatchingGeneral'
        Filename:
          $ref: '#/components/schemas/CfgFileMatchingFilename'
        Copy:
          $ref: '#/components/schemas/CfgFileMatchingCopy'
        Backup:
          $ref: '#/components/schemas/CfgFileMatchingBackup'
      description: Regla aplicada a los archivos que cumplen los filtros.
    CfgFileMatchingGeneral:
      type: object
      properties:
        SourceUser:
          type: string
          description: Usuario de origen.
        DestinationUser:
          type: string
          description: Usuario de destino.
        ExecProg:
          type: string
          description: Comando ejecutado después del procesamiento.
        ExecProgBefore:
          type: string
          description: Comando ejecutado antes del procesamiento.
        ExecProgError:
          type: string
          description: Comando ejecutado en caso de error.
        CheckLockUnlockFileName:
          type: string
        CreateLockUnlockFileName:
          type: string
        CheckLockUnlockOption:
          type: integer
        RemoveAfterCopy:
          type: integer
          description: '`1` elimina el archivo de origen después de la copia.'
        RemoveAfterHours:
          type: integer
          description: Elimina el archivo después de este número de horas.
        ProcessAfterSeconds:
          type: integer
          description: Procesa el archivo después de este número de segundos sin cambios.
        Overwrite:
          type: integer
          description: '`1` sobrescribe el archivo existente en el destino.'
        InsertTimestamp:
          type: integer
        InsertTimestampPart:
          type: integer
        InsertTimestampFormat:
          type: string
          description: Formato del timestamp insertado.
        DelayNextFileProcess:
          type: integer
        StartDateHour:
          type: integer
          description: Hora de inicio de la ventana de horario.
        StartDateMinute:
          type: integer
          description: Minuto de inicio de la ventana de horario.
        StartDateSecond:
          type: integer
          description: Segundo de inicio de la ventana de horario.
        EndDateHour:
          type: integer
          description: Hora de fin de la ventana de horario.
        EndDateMinute:
          type: integer
          description: Minuto de fin de la ventana de horario.
        EndDateSecond:
          type: integer
          description: Segundo de fin de la ventana de horario.
        WeekDayInterval:
          type: integer
          description: Días de la semana de la ventana de horario.
        FileLenOption:
          type: integer
        FileLenMin:
          type: integer
          description: Tamaño mínimo del archivo.
        FileLenMax:
          type: integer
          description: Tamaño máximo del archivo.
        ReplaceFromFileOption:
          type: integer
        ContentLinesToRead:
          type: integer
        OtherOption:
          type: integer
        LastModified:
          type: string
        NextSection:
          type: string
          description: Próxima regla a aplicar.
      description: 'Acciones generales de la regla: usuarios de origen y destino, comandos, eliminación, timestamp y ventana
        de horario.'
    CfgFileMatchingFilename:
      type: object
      properties:
        RenameFileTo:
          type: string
          description: Nuevo nombre del archivo.
        Replaces:
          type: array
          items:
            $ref: '#/components/schemas/CfgFileMatchingReplace'
        ReplacesFromFile:
          type: array
          items:
            $ref: '#/components/schemas/CfgFileMatchingReplaceByFileContent'
        ReplacesByRegEx:
          type: array
          items:
            $ref: '#/components/schemas/CfgFileMatchingReplaceByRegEx'
      description: Cambio de nombre del archivo.
    CfgFileMatchingReplace:
      type: object
      properties:
        ReplaceFileDesc:
          type: string
        ReplaceFileNamePosFrom:
          type: integer
        ReplaceFileNamePosTo:
          type: integer
        ReplaceFileNameLen:
          type: integer
        ReplaceFileNameFromPathPosFrom:
          type: integer
        ReplaceFileNameFromPathPosTo:
          type: integer
        ReplaceFileNameFromPathLen:
          type: integer
        InsertTimestampPosFrom:
          type: integer
        InsertTimestampPosTo:
          type: integer
        InsertTimestampLen:
          type: integer
        InsertSeqNumberTo:
          type: integer
        InsertSeqNumberLen:
          type: integer
        InsertSeqNumberMin:
          type: integer
        InsertSeqNumberMax:
          type: integer
        InsertSeqNumberSeq:
          type: integer
        VarReplaceFileNamePosFrom:
          type: integer
        VarReplaceFileNamePosTo:
          type: integer
        VarReplaceFileNameLen:
          type: integer
        VarReplaceFileNameValue:
          type: string
      description: Sustitución por posición en el nombre del archivo.
    CfgFileMatchingReplaceByFileContent:
      type: object
      properties:
        ReplaceFromFileDesc:
          type: string
        ReplaceFromFileRegEx:
          type: string
        ReplaceFromFilePosFrom:
          type: integer
        ReplaceFromFilePosTo:
          type: integer
        ReplaceFromFileLen:
          type: integer
        ReplaceFromFileNext:
          type: integer
      description: Sustitución con datos del contenido del archivo.
    CfgFileMatchingReplaceByRegEx:
      type: object
      properties:
        RegExReplaceDesc:
          type: string
        RegExReplaceFrom:
          type: string
          description: Expresión regular buscada.
        RegExReplaceTo:
          type: string
          description: Texto de sustitución.
        RegExReplaceOcorr:
          type: integer
          description: Ocurrencias sustituidas.
      description: Sustitución por expresión regular.
    CfgFileMatchingCopy:
      type: object
      properties:
        CopyToDir:
          type: string
          description: Directorio de destino de la copia.
        CopyFileOption:
          type: integer
        CopyTempExtension:
          type: string
          description: Extensión temporal durante la copia.
        CopyFileRecSize:
          type: integer
        Replaces:
          type: array
          items:
            $ref: '#/components/schemas/CfgFileMatchingReplaceByPath'
        ReplacesByRegEx:
          type: array
          items:
            $ref: '#/components/schemas/CfgFileMatchingReplaceByRegEx'
      description: Copia del archivo.
    CfgFileMatchingReplaceByPath:
      type: object
      properties:
        PathDesc:
          type: string
        PathReplacePosFrom:
          type: integer
        PathReplacePosTo:
          type: integer
        PathReplaceLen:
          type: integer
        PathInsertTimestampPosFrom:
          type: integer
        PathInsertTimestampPosTo:
          type: integer
        PathInsertTimestampLen:
          type: integer
        PathReplaceFromFileNamePosFrom:
          type: integer
        PathReplaceFromFileNamePosTo:
          type: integer
        PathReplaceFromFileNameLen:
          type: integer
        PathVarReplacePosFrom:
          type: integer
        PathVarReplacePosTo:
          type: integer
        PathVarReplaceLen:
          type: integer
        PathVarReplaceValue:
          type: string
      description: Sustitución por posición en la ruta de destino.
    CfgFileMatchingBackup:
      type: object
      properties:
        BkpToDir:
          type: string
          description: Directorio de backup.
        BkpFileOption:
          type: integer
        Replaces:
          type: array
          items:
            $ref: '#/components/schemas/CfgFileMatchingReplaceByPath'
        ReplacesByRegEx:
          type: array
          items:
            $ref: '#/components/schemas/CfgFileMatchingReplaceByRegEx'
      description: Backup del archivo.
  responses:
    BadRequest:
      description: 'Solicitud inválida: cuerpo vacío, `Content-Type` distinto de `application/json`, JSON inválido, validación
        de la entidad o header `Authorization` mal formado (este último responde en texto).'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            field: instance
            error: instance error
            error_description: NAME is required
    Unauthorized:
      description: 'Token ausente, inválido o expirado. Respuesta en texto: `Unauthorized`.'
      content:
        text/plain:
          schema:
            type: string
    AuthUnauthorized:
      description: Credenciales no aceptadas, operador bloqueado o código 2FA inválido.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error: authentication error
            error_description: Unauthorized
    AuthForbidden:
      description: Operador sin acceso o bloqueado tras superar el límite de fallas.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    Forbidden:
      description: El operador no tiene el permiso exigido o acceso a la entidad (grupos).
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            field: log report
            error: log report error
            error_description: Forbidden
    NotFound:
      description: Entidad no encontrada.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    UnsupportedMediaType:
      description: '`Content-Type` distinto de `application/x-www-form-urlencoded`.'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    InternalError:
      description: Error interno.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
