> ## 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 documento a un requerimiento

> Asocia un archivo a un requerimiento de un documento (por ejemplo, la **Factura** de una factura cedida). Obtén el `requirementTemplateId` en **Listar requerimientos de documentos** y el `documentId` en **Obtener documentos** o **Crear documentos**.

La operación es idempotente: si ya existe un registro para ese requerimiento y ese documento, se actualiza y el archivo nuevo reemplaza al anterior, que se elimina. Si actualizas el registro sin enviar un archivo (en requerimientos que no exigen archivo), se conserva el archivo anterior. Si no envías `observation`, la observación del registro queda vacía.

La solicitud se envía como `multipart/form-data` (no JSON). El campo del archivo debe llamarse exactamente `file`. El archivo es obligatorio cuando el requerimiento tiene `requiresFile: true`; si no lo tiene, puedes omitirlo y registrar solo la `observation`. La subida completa debe terminar en 55 segundos.

El archivo puede pesar hasta 20 MB, y la solicitud completa (`Content-Length`) no puede superar 21 MB. 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 del archivo; el `Content-Type` de la parte no se valida y puede faltar.



## OpenAPI

````yaml openapi/clients.yaml POST /requirements/record
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:
  /requirements/record:
    post:
      tags:
        - Archivos
      summary: Subir documento a un requerimiento
      description: >-
        Asocia un archivo a un requerimiento de un documento (por ejemplo, la
        **Factura** de una factura cedida). Obtén el `requirementTemplateId` en
        **Listar requerimientos de documentos** y el `documentId` en **Obtener
        documentos** o **Crear documentos**.


        La operación es idempotente: si ya existe un registro para ese
        requerimiento y ese documento, se actualiza y el archivo nuevo reemplaza
        al anterior, que se elimina. Si actualizas el registro sin enviar un
        archivo (en requerimientos que no exigen archivo), se conserva el
        archivo anterior. Si no envías `observation`, la observación del
        registro queda vacía.


        La solicitud se envía como `multipart/form-data` (no JSON). El campo del
        archivo debe llamarse exactamente `file`. El archivo es obligatorio
        cuando el requerimiento tiene `requiresFile: true`; si no lo tiene,
        puedes omitirlo y registrar solo la `observation`. La subida completa
        debe terminar en 55 segundos.


        El archivo puede pesar hasta 20 MB, y la solicitud completa
        (`Content-Length`) no puede superar 21 MB. 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 del archivo; el `Content-Type` de la parte
        no se valida y puede faltar.
      operationId: registerRequirementRecord
      requestBody:
        required: true
        content:
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/RequirementRecordRequest'
            example:
              requirementTemplateId: 1
              documentId: fb36463e-903f-44ff-8c8d-a3713df70744
              observation: Factura firmada
              file: factura-10235.pdf
            encoding:
              file:
                contentType: application/octet-stream
      responses:
        '200':
          description: Registro guardado.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RequirementRecordResponse'
              example:
                requirementTemplateId: 1
                documentId: fb36463e-903f-44ff-8c8d-a3713df70744
                fileUploaded: true
        '400':
          description: >-
            Los campos del formulario no son válidos, el requerimiento exige un
            archivo y no lo enviaste, el archivo supera 20 MB, enviaste más de
            un archivo, el archivo viene en un campo que no se llama `file` o
            tiene un formato no permitido. En los errores de validación,
            `displayMessage` describe el primer error y `data.errors` los lista
            todos. 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:
                missingFields:
                  summary: Faltan campos requeridos
                  value:
                    message: invalid_type
                    displayMessage: requirementTemplateId must be a number
                    data:
                      errors:
                        - path: requirementTemplateId
                          message: requirementTemplateId must be a number
                          code: invalid_type
                        - path: documentId
                          message: documentId is required
                          code: invalid_type
                fileRequired:
                  summary: El requerimiento exige un archivo
                  value:
                    message: This requirement needs a file but none was provided
                    displayMessage: Este requerimiento necesita un archivo adjunto.
                fileTooLarge:
                  summary: El 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 un archivo
                  value:
                    message: LIMIT_FILE_COUNT
                    displayMessage: Solo puedes adjuntar un archivo
                    data:
                      code: LIMIT_FILE_COUNT
                unexpectedField:
                  summary: >-
                    Archivo en un campo que no se llama file (por ejemplo,
                    files)
                  value:
                    message: LIMIT_UNEXPECTED_FILE
                    displayMessage: >-
                      El campo files 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'
        '404':
          description: >-
            El requerimiento no es uno de los que devuelve **Listar
            requerimientos de documentos** (por ejemplo, un requerimiento de
            garantías) o el documento no existe en tu empresa.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                requirementNotFound:
                  summary: Requerimiento no encontrado
                  value:
                    message: Requirement template 99 not found
                    displayMessage: El requerimiento indicado no existe.
                documentNotFound:
                  summary: Documento no encontrado
                  value:
                    message: Document fb36463e-903f-44ff-8c8d-a3713df70744 not found
                    displayMessage: El documento indicado no existe.
        '413':
          description: >-
            La solicitud supera 21 MB o no incluye el header `Content-Length`.
            Pruff la rechaza antes de leer el archivo. `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 21 MB
                  value:
                    message: UPLOAD_TOO_LARGE
                    displayMessage: El archivo supera el límite de 20MB
                    data:
                      code: UPLOAD_TOO_LARGE
                lengthRequired:
                  summary: Sin header Content-Length
                  value:
                    message: UPLOAD_LENGTH_REQUIRED
                    displayMessage: El archivo supera el límite de 20MB
                    data:
                      code: UPLOAD_LENGTH_REQUIRED
        '429':
          $ref: '#/components/responses/TooManyRequests'
        '500':
          description: >-
            Error inesperado. Revisa que la solicitud multipart esté bien
            formada.
          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:
    RequirementRecordRequest:
      type: object
      required:
        - requirementTemplateId
        - documentId
      properties:
        requirementTemplateId:
          type: integer
          minimum: 1
          description: >-
            Identificador del requerimiento, obtenido en **Listar requerimientos
            de documentos**. Usa solo ids devueltos por ese endpoint.
          example: 1
        documentId:
          type: string
          minLength: 1
          description: >-
            Identificador (`id`) del documento de tu empresa al que se asocia el
            archivo.
          example: fb36463e-903f-44ff-8c8d-a3713df70744
        observation:
          type: string
          description: Observación opcional asociada al registro.
          example: Factura firmada
        file:
          type: string
          format: binary
          description: >-
            Archivo a subir. Obligatorio si el requerimiento tiene
            `requiresFile` en `true`.
    RequirementRecordResponse:
      type: object
      required:
        - requirementTemplateId
        - documentId
        - fileUploaded
      properties:
        requirementTemplateId:
          type: integer
          description: Identificador del requerimiento registrado.
          example: 1
        documentId:
          type: string
          description: Identificador del documento al que se asoció.
          example: fb36463e-903f-44ff-8c8d-a3713df70744
        fileUploaded:
          type: boolean
          description: Indica si en esta solicitud enviaste un archivo.
          example: true
    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.