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

# Subir archivos a una operación

> Sube uno o más archivos adjuntos a una operación (factoring, confirming, línea de crédito o solicitud de crédito). Los archivos se guardan en la carpeta de documentos de esa operación.

Los archivos nuevos reemplazan a los existentes según su nombre: si la parte del nombre antes del primer punto (por ejemplo `factura` en `factura.v2.pdf`) coincide con el comienzo del nombre de un archivo ya guardado, ese archivo existente se elimina y se reemplaza por el nuevo. Por eso, usa un nombre base único para cada archivo, que no sea el comienzo del nombre de otro archivo de la operación, y no empieces un nombre con un punto (por ejemplo `.pdf`).

Con `creditLine`, usa nombres base únicos entre todas las líneas de crédito del mismo cliente.

Revisa que el `requestId` corresponda a una operación de tu empresa antes de subir.

La solicitud se envía como `multipart/form-data` (no JSON). Repite el campo `files` por cada archivo. Usa exactamente ese nombre de campo. La subida completa debe terminar en 55 segundos.

Puedes subir hasta 10 archivos por solicitud, de hasta 20 MB cada uno. La solicitud completa (`Content-Length`) no puede superar 51 MB: 50 MB de archivos más 1 MB para el resto del formulario. Envía siempre el header `Content-Length`; una subida sin él (por ejemplo, con `Transfer-Encoding: chunked`) se rechaza.

Formatos permitidos: PDF, JPG, JPEG, PNG, GIF, WEBP, HEIC, DOC, DOCX, XLS, XLSX, PPT, PPTX, ODT, CSV, TXT, XML, MSG, ZIP y RAR. Pruff revisa solo la extensión del nombre de cada archivo; el `Content-Type` de cada parte no se valida y puede faltar.



## OpenAPI

````yaml openapi/clients.yaml POST /files/requestType/{requestType}/requestId/{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:
  /files/requestType/{requestType}/requestId/{requestId}:
    post:
      tags:
        - Archivos
      summary: Subir archivos a una operación
      description: >-
        Sube uno o más archivos adjuntos a una operación (factoring, confirming,
        línea de crédito o solicitud de crédito). Los archivos se guardan en la
        carpeta de documentos de esa operación.


        Los archivos nuevos reemplazan a los existentes según su nombre: si la
        parte del nombre antes del primer punto (por ejemplo `factura` en
        `factura.v2.pdf`) coincide con el comienzo del nombre de un archivo ya
        guardado, ese archivo existente se elimina y se reemplaza por el nuevo.
        Por eso, usa un nombre base único para cada archivo, que no sea el
        comienzo del nombre de otro archivo de la operación, y no empieces un
        nombre con un punto (por ejemplo `.pdf`).


        Con `creditLine`, usa nombres base únicos entre todas las líneas de
        crédito del mismo cliente.


        Revisa que el `requestId` corresponda a una operación de tu empresa
        antes de subir.


        La solicitud se envía como `multipart/form-data` (no JSON). Repite el
        campo `files` por cada archivo. Usa exactamente ese nombre de campo. La
        subida completa debe terminar en 55 segundos.


        Puedes subir hasta 10 archivos por solicitud, de hasta 20 MB cada uno.
        La solicitud completa (`Content-Length`) no puede superar 51 MB: 50 MB
        de archivos más 1 MB para el resto del formulario. Envía siempre el
        header `Content-Length`; una subida sin él (por ejemplo, con
        `Transfer-Encoding: chunked`) se rechaza.


        Formatos permitidos: PDF, JPG, JPEG, PNG, GIF, WEBP, HEIC, DOC, DOCX,
        XLS, XLSX, PPT, PPTX, ODT, CSV, TXT, XML, MSG, ZIP y RAR. Pruff revisa
        solo la extensión del nombre de cada archivo; el `Content-Type` de cada
        parte no se valida y puede faltar.
      operationId: uploadRequestFiles
      parameters:
        - name: requestType
          in: path
          required: true
          description: Tipo de operación a la que pertenecen los archivos.
          schema:
            type: string
            enum:
              - factoring
              - confirming
              - creditLine
              - creditRequest
          example: factoring
        - name: requestId
          in: path
          required: true
          description: >-
            Identificador numérico de la operación (`id` de la solicitud, la
            línea o el crédito).
          schema:
            type: integer
            minimum: 1
          example: 123
      requestBody:
        required: true
        content:
          multipart/form-data:
            schema:
              type: object
              required:
                - files
              properties:
                files:
                  type: array
                  description: Archivos a subir. Repite el campo `files` por cada archivo.
                  items:
                    type: string
                    format: binary
            example:
              files:
                - factura-10235.pdf
            encoding:
              files:
                contentType: application/octet-stream
      responses:
        '200':
          description: Archivos guardados.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FileUploadResponse'
              example:
                requestType: factoring
                requestId: 123
                uploaded: 2
        '400':
          description: >-
            Los parámetros de la URL no son válidos, no adjuntaste ningún
            archivo, un archivo supera 20 MB, enviaste más de 10 archivos, un
            archivo viene en un campo que no se llama `files` o un archivo tiene
            un formato no permitido. Para distinguir los rechazos de la subida,
            usa `data.code` (`LIMIT_FILE_SIZE`, `LIMIT_FILE_COUNT`,
            `LIMIT_UNEXPECTED_FILE` o `UNSUPPORTED_FILE_FORMAT`). Otros rechazos
            del multipart responden 400 con otro `data.code`.
          content:
            application/json:
              schema:
                anyOf:
                  - $ref: '#/components/schemas/ValidationError'
                  - $ref: '#/components/schemas/Error'
              examples:
                invalidRequestType:
                  summary: requestType no permitido
                  value:
                    message: invalid_value
                    displayMessage: >-
                      requestType must be one of: factoring, confirming,
                      creditLine, creditRequest
                    data:
                      errors:
                        - path: requestType
                          message: >-
                            requestType must be one of: factoring, confirming,
                            creditLine, creditRequest
                          code: invalid_value
                invalidRequestId:
                  summary: requestId no es un número
                  value:
                    message: invalid_type
                    displayMessage: requestId must be a number
                    data:
                      errors:
                        - path: requestId
                          message: requestId must be a number
                          code: invalid_type
                noFiles:
                  summary: Sin archivos
                  value:
                    message: No files were provided
                    displayMessage: Debes adjuntar al menos un archivo.
                fileTooLarge:
                  summary: Un archivo supera 20 MB
                  value:
                    message: LIMIT_FILE_SIZE
                    displayMessage: El archivo supera el límite de 20MB
                    data:
                      code: LIMIT_FILE_SIZE
                tooManyFiles:
                  summary: Más de 10 archivos
                  value:
                    message: LIMIT_FILE_COUNT
                    displayMessage: Puedes adjuntar hasta 10 archivos
                    data:
                      code: LIMIT_FILE_COUNT
                unexpectedField:
                  summary: Archivo en un campo que no se llama files
                  value:
                    message: LIMIT_UNEXPECTED_FILE
                    displayMessage: >-
                      El campo file no es válido o superó la cantidad de
                      archivos permitida
                    data:
                      code: LIMIT_UNEXPECTED_FILE
                unsupportedFormat:
                  summary: Formato no permitido
                  value:
                    message: Unsupported file extension "exe"
                    displayMessage: >-
                      Formato no permitido. Puedes subir PDF, JPG, JPEG, PNG,
                      GIF, WEBP, HEIC, DOC, DOCX, XLS, XLSX, PPT, PPTX, ODT,
                      CSV, TXT, XML, MSG, ZIP, RAR
                    data:
                      code: UNSUPPORTED_FILE_FORMAT
        '401':
          $ref: '#/components/responses/Unauthorized'
        '413':
          description: >-
            La solicitud supera 51 MB o no incluye el header `Content-Length`.
            Pruff la rechaza antes de leer los archivos. Divide los archivos en
            varias solicitudes. `data.code` indica el caso (`UPLOAD_TOO_LARGE` o
            `UPLOAD_LENGTH_REQUIRED`).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                tooLarge:
                  summary: Solicitud mayor a 51 MB
                  value:
                    message: UPLOAD_TOO_LARGE
                    displayMessage: Los archivos superan el límite de 50MB por solicitud
                    data:
                      code: UPLOAD_TOO_LARGE
                lengthRequired:
                  summary: Sin header Content-Length
                  value:
                    message: UPLOAD_LENGTH_REQUIRED
                    displayMessage: Los archivos superan el límite de 50MB por solicitud
                    data:
                      code: UPLOAD_LENGTH_REQUIRED
        '429':
          $ref: '#/components/responses/TooManyRequests'
        '500':
          description: >-
            Error inesperado. Revisa que la solicitud multipart esté bien
            formada y que el `requestId` corresponda a una operación de tu
            empresa.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                internalError:
                  summary: Error inesperado en Pruff
                  value:
                    message: Internal server error
                invalidMultipart:
                  summary: Multipart mal formado
                  value:
                    message: Something went wrong!
        '504':
          $ref: '#/components/responses/Timeout'
components:
  schemas:
    FileUploadResponse:
      type: object
      required:
        - requestType
        - requestId
        - uploaded
      properties:
        requestType:
          type: string
          enum:
            - factoring
            - confirming
            - creditLine
            - creditRequest
          description: Tipo de operación indicado en la URL.
          example: factoring
        requestId:
          type: integer
          description: Identificador de la operación indicado en la URL.
          example: 123
        uploaded:
          type: integer
          description: Cantidad de archivos guardados.
          example: 2
    ValidationError:
      type: object
      required:
        - message
        - displayMessage
        - data
      description: Error de validación del body, de los query params o de los path params.
      properties:
        message:
          type: string
          description: >-
            Código del primer error de validación (por ejemplo `custom`,
            `invalid_type`, `invalid_format`, `invalid_value`, `invalid_union`).
        displayMessage:
          type: string
          description: >-
            Mensaje del primer error de validación, pensado para mostrarlo a una
            persona. Normalmente en español; algunos mensajes de validación
            vienen en inglés.
        data:
          type: object
          required:
            - errors
          properties:
            errors:
              type: array
              description: Todos los errores de validación encontrados.
              items:
                type: object
                required:
                  - path
                  - message
                  - code
                properties:
                  path:
                    type: string
                    description: >-
                      Campo con el error. Para listas incluye la posición, por
                      ejemplo `types.0`. `(root)` si el error es del body
                      completo.
                  message:
                    type: string
                    description: Descripción del error en español.
                  code:
                    type: string
                    description: Código del tipo de error.
    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.
  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.
    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.