> ## Documentation Index
> Fetch the complete documentation index at: https://docs.pruff.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Aprobar o rechazar una solicitud

> Registra la firma de un usuario en el comité de una solicitud, con la decisión `APPROVED` o `REJECTED`, el rol con el que firma y una observación. La firma queda a nombre del usuario indicado en `email`, que debe ser un usuario activo de tu empresa. Envía en `decision` solo `APPROVED` o `REJECTED`, y envía siempre `message` con un texto.

Antes de registrar, se valida que la solicitud no esté ya aprobada ni rechazada, que el rol sea uno de los que exige el comité, que el usuario tenga ese rol y que no haya firmado antes con él. Usa `GET /approvals/missing` para consultarlo.

Efectos de la firma:
- Si con esta firma todos los roles reúnen las firmas que exigen, la solicitud pasa al siguiente estado de su flujo.
- Si la decisión es `REJECTED`, la solicitud queda rechazada en ese comité (no aplica a `ResellNominee`, que solo admite `APPROVED`).
- La observación (`message`) queda registrada en el historial de la solicitud. En `FactoringRequest` también se copia al chat si tu cuenta tiene activada esa opción.
- Se envía el evento de webhook de aprobaciones a los destinos configurados en tu cuenta.

`PaymentRequestPassive` solo admite el comité `RISK` y `ResellNominee` solo admite `OPERATIONS`. `CreditLineRequest` y `FactoringResell` se firman solo en el comité `RISK`. `ResellNominee` solo admite `APPROVED`: el rechazo de una nómina no está disponible por esta API todavía. Una devolución de pasivos que ya tiene giros ejecutados no se puede rechazar.

Para `FactoringRequest`, `requestId` es el id de la solicitud de factoring (el mismo `factoringRequestId` que recibes al crearla).



## OpenAPI

````yaml openapi/clients.yaml POST /approvals/submitApproval/{requestType}/{requestId}
openapi: 3.1.0
info:
  title: API de clientes de Pruff
  version: '1'
  description: >-
    Endpoints que tus sistemas llaman para leer y operar los datos de tu empresa
    en Pruff. Todas las solicitudes van por HTTPS y se autentican con el header
    `x-api-key`. Las convenciones de formato, paginación y errores se describen
    en https://docs.pruff.com/api/introduccion.
servers:
  - url: https://api.pruff.com/api/clients
security:
  - ApiKeyAuth: []
tags:
  - name: Facturas
    description: Consulta de facturas electrónicas, facturas transables y cesiones.
  - name: Documentos
    description: Consulta y creación de documentos asociados a tus clientes.
  - name: Archivos
    description: Carga de archivos a operaciones y a los requerimientos de tus documentos.
  - name: Financiamiento
    description: >-
      Simula créditos, crea solicitudes de factoring y consulta las prórrogas de
      tu empresa.
  - name: Comité
    description: >-
      Consulta las aprobaciones de una solicitud en los comités de riesgo y de
      operaciones, y registra nuevas firmas.
  - name: Chat
    description: Exporta y envía mensajes del chat de una solicitud.
  - name: Reportes
    description: >-
      Reportes de operaciones, cartera, recaudaciones, cuentas pendientes y
      flujos de tu empresa.
  - name: Datahub
    description: >-
      Consulta de la información tributaria, financiera y de riesgo que Pruff
      tiene de tus clientes y deudores.
  - name: Mercado Público
    description: >-
      Licitaciones y órdenes de compra de Mercado Público (ChileCompra) cargadas
      en Pruff.
  - name: CRM
    description: >-
      Datos comerciales de tu CRM en Pruff: empresas con su ficha, pipeline,
      prospectos, gestiones y simulaciones.
  - name: SGR
    description: Operaciones SGR (garantías) de tu empresa.
  - name: Sincronizador
    description: >-
      Pide sincronizar a un cliente con el SII o la TGR para obtener su
      información más actualizada, y consulta el estado de esas
      sincronizaciones.
  - name: Usuarios
    description: >-
      Administra los usuarios de tu empresa en Pruff (crear, editar, eliminar,
      consultar su perfil y asignar subordinados) y consulta las cuentas
      (empresas conectadas) a las que cada usuario tiene acceso.
  - name: Contactos
    description: Crea contactos asociados a las empresas de tu cartera.
paths:
  /approvals/submitApproval/{requestType}/{requestId}:
    post:
      tags:
        - Comité
      summary: Aprobar o rechazar una solicitud
      description: >-
        Registra la firma de un usuario en el comité de una solicitud, con la
        decisión `APPROVED` o `REJECTED`, el rol con el que firma y una
        observación. La firma queda a nombre del usuario indicado en `email`,
        que debe ser un usuario activo de tu empresa. Envía en `decision` solo
        `APPROVED` o `REJECTED`, y envía siempre `message` con un texto.


        Antes de registrar, se valida que la solicitud no esté ya aprobada ni
        rechazada, que el rol sea uno de los que exige el comité, que el usuario
        tenga ese rol y que no haya firmado antes con él. Usa `GET
        /approvals/missing` para consultarlo.


        Efectos de la firma:

        - Si con esta firma todos los roles reúnen las firmas que exigen, la
        solicitud pasa al siguiente estado de su flujo.

        - Si la decisión es `REJECTED`, la solicitud queda rechazada en ese
        comité (no aplica a `ResellNominee`, que solo admite `APPROVED`).

        - La observación (`message`) queda registrada en el historial de la
        solicitud. En `FactoringRequest` también se copia al chat si tu cuenta
        tiene activada esa opción.

        - Se envía el evento de webhook de aprobaciones a los destinos
        configurados en tu cuenta.


        `PaymentRequestPassive` solo admite el comité `RISK` y `ResellNominee`
        solo admite `OPERATIONS`. `CreditLineRequest` y `FactoringResell` se
        firman solo en el comité `RISK`. `ResellNominee` solo admite `APPROVED`:
        el rechazo de una nómina no está disponible por esta API todavía. Una
        devolución de pasivos que ya tiene giros ejecutados no se puede
        rechazar.


        Para `FactoringRequest`, `requestId` es el id de la solicitud de
        factoring (el mismo `factoringRequestId` que recibes al crearla).
      operationId: submitApproval
      parameters:
        - $ref: '#/components/parameters/ApprovalRequestTypeParam'
        - $ref: '#/components/parameters/ApprovalRequestIdParam'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ApprovalSubmitBody'
            example:
              comiteeType: RISK
              email: ana.perez@example.com
              decision: APPROVED
              roleId: 1
              message: Aprobado por API
      responses:
        '200':
          description: Firma registrada.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApprovalSubmitted'
              example:
                id: 61
                status: APPROVED
                reason: Aprobado por API
                type: FactoringRequest
                comiteeType: RISK
                roleId: 1
                requestId: 1
                createdAt: '2026-01-07T20:34:27.457Z'
                updatedAt: '2026-01-07T20:34:27.457Z'
                deletedAt: null
        '400':
          description: >-
            Parámetros o body inválidos, o la firma no se puede registrar. La
            respuesta trae solo `message`.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                invalidRequestType:
                  summary: requestType inválido
                  value:
                    message: >-
                      Invalid params: Expected request type CreditLineRequest,
                      FactoringRequest, ConfirmingRequest, FactoringResell,
                      CreditRequest, FactoringExtension, SGRWarrantyRequest,
                      PaymentRequestPassive, ResellNominee, LeasingRequest
                invalidRequestId:
                  summary: requestId no numérico, cero o mayor a 2147483647
                  value:
                    message: 'Invalid params: Request id must be a number'
                invalidEmail:
                  summary: email inválido
                  value:
                    message: 'Invalid body: not-an-email is not a valid email.'
                invalidComiteeType:
                  summary: comiteeType inválido
                  value:
                    message: 'Invalid body: Expected comitee type RISK, OPERATIONS'
                invalidDecision:
                  summary: decision inválida
                  value:
                    message: >-
                      Invalid body: Expected request type APPROVED, REJECTED,
                      PENDING
                invalidRoleId:
                  summary: roleId no numérico
                  value:
                    message: 'Invalid body: role id must be a number.'
                comiteeTypeNotSupported:
                  summary: El tipo de solicitud no tiene ese comité
                  value:
                    message: Comitee type not supported
                alreadyApproved:
                  summary: La solicitud ya está aprobada en ese comité
                  value:
                    message: Request FactoringRequest 42 is already approved.
                alreadyRejected:
                  summary: La solicitud ya está rechazada en ese comité
                  value:
                    message: Request FactoringRequest 42 is rejected.
                roleNotAvailable:
                  summary: >-
                    El rol no es uno de los que exige el comité, o la solicitud
                    no tiene comité asignado
                  value:
                    message: Role Administrador not available for 42 42.
                userAlreadyApproved:
                  summary: El usuario ya firmó con ese rol
                  value:
                    message: User already approved as role Administrador.
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          description: >-
            El usuario indicado en `email` no tiene el rol con el que se intenta
            firmar.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                message: User is not Administrador.
                displayMessage: No tienes el rol necesario para aprobar esta solicitud
        '404':
          description: >-
            El usuario, el rol o la solicitud no existe. La respuesta trae solo
            `message`.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                userNotFound:
                  summary: No existe un usuario con ese email
                  value:
                    message: User ana.perez@example.com not found
                roleNotFound:
                  summary: No existe un rol con ese id
                  value:
                    message: Role 987654321 not found.
                factoringQuoteNotFound:
                  summary: >-
                    La solicitud de factoring no existe o no tiene cotización
                    activa
                  value:
                    message: Factoring quote not found from request 987654321
                requestNotFound:
                  summary: La solicitud no existe (el texto depende del tipo)
                  value:
                    message: Confirming request not found
        '409':
          description: >-
            Se intentó rechazar una devolución de pasivos que ya tiene giros
            ejecutados.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                message: PaymentRequestPassive 12 already has executed payouts.
                displayMessage: >-
                  No se puede rechazar una devolución de pasivos que ya tiene
                  giros ejecutados
        '429':
          $ref: '#/components/responses/TooManyRequests'
        '500':
          $ref: '#/components/responses/InternalError'
        '504':
          $ref: '#/components/responses/Timeout'
components:
  parameters:
    ApprovalRequestTypeParam:
      name: requestType
      in: path
      required: true
      description: >-
        Tipo de solicitud sobre la que se consultan o registran las
        aprobaciones.


        - `CreditLineRequest`: solicitud de línea de crédito.

        - `FactoringRequest`: solicitud de factoring.

        - `ConfirmingRequest`: solicitud de confirming.

        - `FactoringResell`: venta de documentos a fondos.

        - `CreditRequest`: solicitud de crédito.

        - `FactoringExtension`: prórroga de factoring.

        - `SGRWarrantyRequest`: solicitud de garantía SGR.

        - `PaymentRequestPassive`: devolución de pasivos.

        - `ResellNominee`: nómina de venta a fondo.

        - `LeasingRequest`: solicitud de leasing.
      schema:
        $ref: '#/components/schemas/ApprovalRequestType'
      example: FactoringRequest
    ApprovalRequestIdParam:
      name: requestId
      in: path
      required: true
      description: >-
        Id numérico de la solicitud del tipo indicado, un entero entre 1 y
        2147483647. Para `FactoringRequest` es el id de la solicitud de
        factoring.
      schema:
        type: integer
        minimum: 1
        maximum: 2147483647
      example: 1
  schemas:
    ApprovalSubmitBody:
      type: object
      required:
        - comiteeType
        - email
        - decision
        - roleId
        - message
      properties:
        comiteeType:
          $ref: '#/components/schemas/ApprovalComiteeType'
        email:
          type: string
          format: email
          description: >-
            Email del usuario que firma. Usa el email de un usuario activo de tu
            empresa en Pruff.
          example: ana.perez@example.com
        decision:
          type: string
          enum:
            - APPROVED
            - REJECTED
          description: >-
            Decisión de la firma. Envía solo `APPROVED` o `REJECTED`.
            `ResellNominee` solo admite `APPROVED`.
          example: APPROVED
        roleId:
          type: integer
          minimum: 1
          description: >-
            Id del rol con el que firma el usuario. Consúltalo con `GET
            /approvals/missing`.
          example: 1
        message:
          type: string
          description: >-
            Observación de la firma. Es obligatoria, así que envía siempre un
            texto. Queda registrada en el historial de la solicitud; en
            `FactoringRequest` también se copia al chat si tu cuenta tiene
            activada esa opción.
          example: Aprobado por API
    ApprovalSubmitted:
      type: object
      required:
        - id
        - status
        - reason
        - type
        - comiteeType
        - roleId
        - requestId
        - createdAt
        - updatedAt
        - deletedAt
      properties:
        id:
          type: integer
          description: Id de la firma registrada.
        status:
          type: string
          enum:
            - APPROVED
            - REJECTED
          description: Decisión registrada.
        reason:
          type:
            - string
            - 'null'
          description: Observación registrada.
        type:
          $ref: '#/components/schemas/ApprovalRequestType'
        comiteeType:
          oneOf:
            - $ref: '#/components/schemas/ApprovalComiteeType'
            - type: 'null'
          description: Comité en que se firmó.
        roleId:
          type:
            - integer
            - 'null'
          description: Id del rol con el que se firmó.
        requestId:
          type: integer
          description: >-
            Id de la solicitud firmada. Para `FactoringRequest` es el id interno
            de la cotización de la solicitud, que puede diferir del `requestId`
            que enviaste.
        createdAt:
          type: string
          format: date-time
          description: Fecha y hora de la firma, en formato ISO 8601 (UTC).
        updatedAt:
          type: string
          format: date-time
          description: Fecha y hora de la última modificación, en formato ISO 8601 (UTC).
        deletedAt:
          type:
            - string
            - 'null'
          format: date-time
          description: Siempre `null` en una firma recién registrada.
    Error:
      type: object
      required:
        - message
      properties:
        message:
          type: string
          description: >-
            Identifica el error. En algunos casos es un texto en inglés con
            valores variables. Para tu lógica, usa el código HTTP y, cuando
            exista, `data.code`.
        displayMessage:
          type: string
          description: >-
            Mensaje pensado para mostrarlo a una persona. Normalmente en
            español; algunos mensajes de validación vienen en inglés.
        data:
          description: Detalle adicional del error, cuando existe.
    ApprovalRequestType:
      type: string
      enum:
        - CreditLineRequest
        - FactoringRequest
        - ConfirmingRequest
        - FactoringResell
        - CreditRequest
        - FactoringExtension
        - SGRWarrantyRequest
        - PaymentRequestPassive
        - ResellNominee
        - LeasingRequest
      description: Tipo de solicitud que se aprueba en un comité.
    ApprovalComiteeType:
      type: string
      enum:
        - RISK
        - OPERATIONS
      description: >-
        Comité de la firma. `RISK` es el comité de riesgo y `OPERATIONS` el de
        operaciones.
  responses:
    Unauthorized:
      description: >-
        Falta el header `x-api-key`, su valor no es válido o la cuenta de API de
        tu empresa no está habilitada.
      content:
        application/json:
          schema:
            type: object
            required:
              - message
            properties:
              message:
                type: string
          example:
            message: 'Unauthorized: Invalid API Key'
    TooManyRequests:
      description: >-
        Tu empresa superó el límite de solicitudes. Todas las API keys de tu
        empresa comparten el mismo límite. Espera los segundos que indica el
        header `Retry-After` (o `data.retryAfterSeconds`) antes de reintentar.
      headers:
        Retry-After:
          description: Segundos que debes esperar antes de reintentar.
          schema:
            type: integer
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            message: >-
              Rate limit exceeded: 501 requests in the current 60s window, limit
              is 500. Retry in 12s.
            displayMessage: >-
              Superaste el límite de 500 solicitudes cada 60 segundos. Vuelve a
              intentarlo en 12 segundos.
            data:
              code: RATE_LIMIT_EXCEEDED
              scope: All API keys of your company share this budget.
              limit: 500
              used: 501
              windowSeconds: 60
              retryAfterSeconds: 12
              resetAt: '2026-11-04T15:00:12.000Z'
              hint: >-
                Wait until resetAt (or honor the Retry-After header) before
                retrying. Avoid repeating identical requests: reuse responses
                you already fetched, use filters and larger pageSize values
                instead of one request per item, and cap your client
                concurrency.
    InternalError:
      description: >-
        Error inesperado en Pruff. El texto de `message` puede variar (por
        ejemplo en mayúsculas); no dependas de él.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            message: Internal server error
    Timeout:
      description: >-
        La solicitud superó el tiempo máximo de 55 segundos. La operación puede
        haberse completado igual: antes de reintentar una solicitud que crea o
        modifica datos, verifica su estado.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            message: request_timeout
            displayMessage: La solicitud excedió el tiempo máximo permitido
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: x-api-key
      description: API key que Pruff entrega a tu empresa.

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.