> ## 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.

# Crear solicitud de factoring

> Crea una solicitud de factoring a partir de facturas y/o documentos que ya existen en tu cuenta.

Debes incluir al menos una factura o un documento. Todas las facturas y documentos deben pertenecer al mismo emisor (el cliente que cede). Cada factura referenciada genera automáticamente su documento asociado, o reutiliza el que ya existe.

Cada `paymentDate` debe ser un día hábil en Chile y no puede ser anterior a `operationDate`. Las dos fechas se comparan como días en hora de Chile: el mismo día de la operación es válido, y un instante ISO 8601 cuenta como el día que es en Chile en ese momento. La solicitud guarda ese día, sin la hora que enviaste. Ambas aceptan `YYYY-MM-DD` o un instante ISO 8601, y deben existir en el calendario: una fecha como `2026-02-30` o un texto que no sea una fecha responde 400. Los campos con valor `null` se ignoran, como si no se hubieran enviado.

Con `isDraft` en `false` (valor por defecto) la solicitud queda en estado "En revisión" y se evalúa con el motor de riesgo configurado para tu empresa. Con `isDraft` en `true` queda en estado "Borrador" y no se evalúa hasta que alguien la confirme desde Pruff.

El monto de la solicitud es la suma de los montos de las facturas y documentos incluidos. Con documentos en PEN ese monto se mide en céntimos. Los montos en dinero del body (`expensesCost`, costo variable, costo fijo y `guaranteeAmount`) van en la divisa de la solicitud: CLP si incluye facturas; si solo incluye documentos, la divisa de esos documentos. `expensesCost` y `operationCostVariableAmount` deben ser números enteros: con un valor con decimales la API responde 400 y no crea la solicitud.

Para el costo variable, envía `operationCostVariableAmount` u `operationCostVariablePercentage`, pero no ambos. Con `operationCostVariablePercentage`, el costo variable de la solicitud es porcentaje × monto total / 100, redondeado al entero más cercano.

No repitas un mismo `id` dentro de `invoices` ni dentro de `documents`: la API responde 400 `All invoices must exist` o `All documents must exist`.

Si la respuesta es 500 o 504, la solicitud puede haberse creado igual. Antes de reintentar, verifica que no exista para no duplicarla.



## OpenAPI

````yaml openapi/clients.yaml POST /financing/factoringRequest/create
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:
  /financing/factoringRequest/create:
    post:
      tags:
        - Financiamiento
      summary: Crear solicitud de factoring
      description: >-
        Crea una solicitud de factoring a partir de facturas y/o documentos que
        ya existen en tu cuenta.


        Debes incluir al menos una factura o un documento. Todas las facturas y
        documentos deben pertenecer al mismo emisor (el cliente que cede). Cada
        factura referenciada genera automáticamente su documento asociado, o
        reutiliza el que ya existe.


        Cada `paymentDate` debe ser un día hábil en Chile y no puede ser
        anterior a `operationDate`. Las dos fechas se comparan como días en hora
        de Chile: el mismo día de la operación es válido, y un instante ISO 8601
        cuenta como el día que es en Chile en ese momento. La solicitud guarda
        ese día, sin la hora que enviaste. Ambas aceptan `YYYY-MM-DD` o un
        instante ISO 8601, y deben existir en el calendario: una fecha como
        `2026-02-30` o un texto que no sea una fecha responde 400. Los campos
        con valor `null` se ignoran, como si no se hubieran enviado.


        Con `isDraft` en `false` (valor por defecto) la solicitud queda en
        estado "En revisión" y se evalúa con el motor de riesgo configurado para
        tu empresa. Con `isDraft` en `true` queda en estado "Borrador" y no se
        evalúa hasta que alguien la confirme desde Pruff.


        El monto de la solicitud es la suma de los montos de las facturas y
        documentos incluidos. Con documentos en PEN ese monto se mide en
        céntimos. Los montos en dinero del body (`expensesCost`, costo variable,
        costo fijo y `guaranteeAmount`) van en la divisa de la solicitud: CLP si
        incluye facturas; si solo incluye documentos, la divisa de esos
        documentos. `expensesCost` y `operationCostVariableAmount` deben ser
        números enteros: con un valor con decimales la API responde 400 y no
        crea la solicitud.


        Para el costo variable, envía `operationCostVariableAmount` u
        `operationCostVariablePercentage`, pero no ambos. Con
        `operationCostVariablePercentage`, el costo variable de la solicitud es
        porcentaje × monto total / 100, redondeado al entero más cercano.


        No repitas un mismo `id` dentro de `invoices` ni dentro de `documents`:
        la API responde 400 `All invoices must exist` o `All documents must
        exist`.


        Si la respuesta es 500 o 504, la solicitud puede haberse creado igual.
        Antes de reintentar, verifica que no exista para no duplicarla.
      operationId: createFactoringRequest
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/FactoringRequestCreateBody'
            example:
              invoices:
                - id: 3f2b8f2e-6d1a-4c1e-9a55-0d1b2c3d4e5f
                  paymentDate: '2026-12-21'
              documents:
                - id: c1d2e3f4-5678-90ab-cdef-1234567890ab
                  paymentDate: '2026-12-21'
              operationDate: '2026-11-09'
              createdBy: ana.perez@example.com
              recipient: carlos.soto@example.com
              advance: 98
              rate: 2
              arrearRate: 4
              expensesCost: 15000
              operationCostVariableAmount: 5000
              operationCostFixed: 3000
              guaranteeAmount: 10000
              guaranteeObservation: Retención de garantía por la operación
              exception: false
              responsibility: WITH_RESPONSIBILITY
              isDraft: false
      responses:
        '200':
          description: Solicitud creada.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FactoringRequestCreated'
              example:
                message: Factoring request created successfully
                factoringRequestId: 19
        '400':
          description: >-
            El body no cumple las validaciones, o una factura, un documento o un
            usuario indicado no existe. Los errores de validación traen en
            `message` el código del error y en `displayMessage` el detalle del
            primer problema; `data.errors` lista todos los problemas. Los
            errores de negocio traen `message` y `displayMessage` fijos.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                validationCostVariable:
                  summary: Falta el costo variable
                  value:
                    message: custom
                    displayMessage: >-
                      operationCostVariablePercentage or
                      operationCostVariableAmount is required
                    data:
                      errors:
                        - path: operationCostVariableAmount
                          message: >-
                            operationCostVariablePercentage or
                            operationCostVariableAmount is required
                          code: custom
                validationCostVariableBoth:
                  summary: Se enviaron ambos costos variables
                  value:
                    message: custom
                    displayMessage: >-
                      operationCostVariablePercentage and
                      operationCostVariableAmount cannot be present at the same
                      time
                    data:
                      errors:
                        - path: operationCostVariableAmount
                          message: >-
                            operationCostVariablePercentage and
                            operationCostVariableAmount cannot be present at the
                            same time
                          code: custom
                validationNoReferences:
                  summary: No hay facturas ni documentos
                  value:
                    message: custom
                    displayMessage: At least one invoice or document is required
                    data:
                      errors:
                        - path: invoices
                          message: At least one invoice or document is required
                          code: custom
                validationPaymentDate:
                  summary: Fecha de pago en un día no hábil
                  value:
                    message: custom
                    displayMessage: >-
                      All invoices must have a valid paymentDate (working day)
                      and id
                    data:
                      errors:
                        - path: invoices
                          message: >-
                            All invoices must have a valid paymentDate (working
                            day) and id
                          code: custom
                validationInvalidOperationDate:
                  summary: Fecha de operación que no existe en el calendario
                  value:
                    message: custom
                    displayMessage: operationDate must be a valid date
                    data:
                      errors:
                        - path: operationDate
                          message: operationDate must be a valid date
                          code: custom
                validationInvalidPaymentDate:
                  summary: Fecha de pago que no existe en el calendario
                  value:
                    message: custom
                    displayMessage: paymentDate must be a valid date
                    data:
                      errors:
                        - path: invoices.0.paymentDate
                          message: paymentDate must be a valid date
                          code: custom
                validationPaymentBeforeOperation:
                  summary: Fecha de pago anterior a la fecha de operación
                  value:
                    message: custom
                    displayMessage: >-
                      All invoices must have a paymentDate on or after the
                      operationDate
                    data:
                      errors:
                        - path: invoices
                          message: >-
                            All invoices must have a paymentDate on or after the
                            operationDate
                          code: custom
                validationGuaranteeObservation:
                  summary: Falta la observación de la garantía
                  value:
                    message: custom
                    displayMessage: guaranteeObservation is required
                    data:
                      errors:
                        - path: guaranteeObservation
                          message: guaranteeObservation is required
                          code: custom
                validationResponsibility:
                  summary: Valor de responsibility fuera de los permitidos
                  value:
                    message: invalid_value
                    displayMessage: >-
                      Invalid option: expected one of
                      "WITH_RESPONSIBILITY"|"WITHOUT_RESPONSIBILITY"
                    data:
                      errors:
                        - path: responsibility
                          message: >-
                            Invalid option: expected one of
                            "WITH_RESPONSIBILITY"|"WITHOUT_RESPONSIBILITY"
                          code: invalid_value
                validationExpensesCostNotInteger:
                  summary: expensesCost con decimales
                  value:
                    message: invalid_type
                    displayMessage: expensesCost must be an integer
                    data:
                      errors:
                        - path: expensesCost
                          message: expensesCost must be an integer
                          code: invalid_type
                validationCostVariableAmountNotInteger:
                  summary: operationCostVariableAmount con decimales
                  value:
                    message: invalid_type
                    displayMessage: operationCostVariableAmount must be an integer
                    data:
                      errors:
                        - path: operationCostVariableAmount
                          message: operationCostVariableAmount must be an integer
                          code: invalid_type
                validationRequiredField:
                  summary: Falta un campo obligatorio
                  value:
                    message: invalid_type
                    displayMessage: advance is required
                    data:
                      errors:
                        - path: advance
                          message: advance is required
                          code: invalid_type
                recipientNotFound:
                  summary: El ejecutivo indicado en recipient no existe
                  value:
                    message: Recipient not found
                    displayMessage: El destinatario indicado no existe.
                createdByNotFound:
                  summary: El usuario indicado en createdBy no existe
                  value:
                    message: Created by not found
                    displayMessage: El usuario creador indicado no existe.
                invoicesNotFound:
                  summary: Alguna factura no existe o su id está repetido
                  value:
                    message: All invoices must exist
                    displayMessage: Todas las facturas deben existir.
                documentsNotFound:
                  summary: Algún documento no existe o su id está repetido
                  value:
                    message: All documents must exist
                    displayMessage: Todos los documentos deben existir.
                differentIssuer:
                  summary: Hay facturas o documentos de emisores distintos
                  value:
                    message: >-
                      All invoices and documents must have the same
                      businessIdentifier
                    displayMessage: >-
                      Todas las facturas y documentos deben tener el mismo
                      emisor.
                documentsCurrencyWithInvoices:
                  summary: Documentos en otra divisa junto con facturas
                  value:
                    message: >-
                      All documents must have CLP currency when invoices are
                      present
                    displayMessage: >-
                      Todos los documentos deben tener divisa CLP cuando se
                      incluyen facturas del SII.
                documentsDifferentCurrency:
                  summary: Documentos con divisas distintas entre sí
                  value:
                    message: All documents must have the same currency
                    displayMessage: Todos los documentos deben tener la misma divisa.
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          description: La empresa asociada a tu API key no existe.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                message: Company not found
                displayMessage: La empresa indicada no existe.
        '429':
          $ref: '#/components/responses/TooManyRequests'
        '500':
          description: >-
            Error inesperado en Pruff. La solicitud puede haberse creado igual;
            antes de reintentar, verifica que no exista para no duplicarla.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                message: Internal server error
        '504':
          description: >-
            La solicitud superó el tiempo máximo de 55 segundos. La solicitud
            puede haberse creado igual; antes de reintentar, verifica que no
            exista para no duplicarla.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                message: request_timeout
components:
  schemas:
    FactoringRequestCreateBody:
      type: object
      required:
        - operationDate
        - createdBy
        - recipient
        - advance
        - rate
        - arrearRate
        - expensesCost
      properties:
        invoices:
          type: array
          description: >-
            Facturas a incluir, con su fecha de pago. Cada `id` es el `id` de
            una factura devuelta por **Obtener facturas** (`data[].id`) o por
            **Obtener facturas transables**. Debes enviar al menos una factura o
            un documento. No repitas un mismo `id`.
          items:
            $ref: '#/components/schemas/FactoringRequestReference'
        documents:
          type: array
          description: >-
            Documentos a incluir, con su fecha de pago. Cada `id` es el `id` de
            un documento devuelto por **Obtener documentos** (`data[].id`) o por
            **Crear documentos** (`documentsCreated[].id` o
            `documentsRepetead[].id`). Debes enviar al menos una factura o un
            documento. No repitas un mismo `id`. Si hay facturas, los documentos
            deben estar en CLP; si no, todos deben tener la misma divisa.
          items:
            $ref: '#/components/schemas/FactoringRequestReference'
        operationDate:
          type: string
          description: >-
            Fecha de la operación, es decir, desde cuándo se financia. Acepta
            `YYYY-MM-DD` o un instante ISO 8601. Debe existir en el calendario.
          example: '2026-11-09'
        createdBy:
          type: string
          format: email
          description: Email del usuario que crea la solicitud. Debe existir en Pruff.
          example: ana.perez@example.com
        recipient:
          type: string
          format: email
          description: >-
            Email del usuario asignado como ejecutivo de la solicitud. Debe
            existir en Pruff.
          example: carlos.soto@example.com
        advance:
          type: number
          minimum: 0
          maximum: 100
          description: Porcentaje del monto total que se anticipa al cliente.
          example: 98
        rate:
          type: number
          minimum: 0
          maximum: 100
          description: >-
            Tasa de negocio en porcentaje mensual. El costo de la operación se
            prorratea por los días hasta cada pago.
          example: 2
        arrearRate:
          type: number
          minimum: 0
          maximum: 100
          description: Tasa de mora en porcentaje.
          example: 4
        expensesCost:
          type: integer
          minimum: 0
          description: >-
            Gastos operacionales, como número entero, en la divisa de la
            solicitud (CLP si incluye facturas; si no, la divisa de los
            documentos). Con `0` no se registra ningún gasto.
          example: 15000
        operationCostVariablePercentage:
          type: number
          minimum: 0
          maximum: 100
          description: >-
            Costo variable como porcentaje del monto total. Es obligatorio si no
            envías `operationCostVariableAmount`; no puedes enviar ambos. El
            costo variable que se registra es porcentaje × monto total / 100,
            redondeado al entero más cercano.
          example: 1
        operationCostVariableAmount:
          type: integer
          minimum: 0
          description: >-
            Costo variable neto, como número entero, en la divisa de la
            solicitud (CLP si incluye facturas; si no, la divisa de los
            documentos). Es obligatorio si no envías
            `operationCostVariablePercentage`; no puedes enviar ambos.
          example: 5000
        operationCostFixed:
          type: integer
          minimum: 0
          description: >-
            Costo operacional fijo, como número entero, en la divisa de la
            solicitud (CLP si incluye facturas; si no, la divisa de los
            documentos).
          example: 3000
        guaranteeAmount:
          type: number
          exclusiveMinimum: 0
          description: >-
            Monto en garantía en la divisa de la solicitud (CLP si incluye
            facturas; si no, la divisa de los documentos). Debe ser mayor a 0;
            si no hay garantía, no envíes el campo (o envía `null`).
          example: 10000
        guaranteeObservation:
          type: string
          minLength: 1
          description: >-
            Observación de la garantía. Es obligatoria cuando envías
            `guaranteeAmount`.
          example: Retención de garantía por la operación
        exception:
          type: boolean
          default: false
          description: >-
            Marca la solicitud como excepción, por ejemplo al uso de líneas de
            crédito.
          example: false
        responsibility:
          type: string
          enum:
            - WITH_RESPONSIBILITY
            - WITHOUT_RESPONSIBILITY
          default: WITH_RESPONSIBILITY
          description: >-
            Indica si la operación queda con responsabilidad o sin
            responsabilidad del cedente.
          example: WITH_RESPONSIBILITY
        isDraft:
          type: boolean
          default: false
          description: >-
            Con `true` la solicitud se crea en estado "Borrador" y no se evalúa.
            Con `false` queda "En revisión" y se evalúa.
          example: false
    FactoringRequestCreated:
      type: object
      required:
        - message
        - factoringRequestId
      properties:
        message:
          type: string
          description: Confirmación de la creación.
        factoringRequestId:
          type: integer
          description: >-
            Id de la solicitud creada. Úsalo como `requestId` en los endpoints
            de comité y chat.
    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.
    FactoringRequestReference:
      type: object
      required:
        - id
        - paymentDate
      properties:
        id:
          type: string
          description: >-
            Id de la factura o del documento. La descripción de `invoices` y de
            `documents` indica de qué endpoint sale cada uno.
          example: 3f2b8f2e-6d1a-4c1e-9a55-0d1b2c3d4e5f
        paymentDate:
          type: string
          description: >-
            Fecha de pago de la factura o documento. Debe ser un día hábil en
            Chile y no anterior a `operationDate`. Acepta `YYYY-MM-DD` o un
            instante ISO 8601, y debe existir en el calendario. Esta fecha y
            `operationDate` se comparan como días en hora de Chile, así que el
            mismo día de `operationDate` es válido sin importar el formato de
            cada una.
          example: '2026-12-21'
  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.
  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.