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

# Consultar varias facturas

> Busca hasta 500 facturas en un solo llamado, cada una por RUT del emisor, folio y tipo de DTE. Úsalo en vez de llamar a `GET /invoices` una vez por factura: cada llamado cuenta para el rate limit.

Solo lee lo que ya está en Pruff; no consulta al SII durante el llamado. Cada factura encontrada viene con los mismos campos que en `GET /invoices` más `lastUpdate`: la fecha y hora desde la que Pruff tiene al día con el SII tanto la factura como su estado de cesión. Si te parece antigua, pide una sincronización de tu cliente con `POST /syncronizations/execute/{scrapingType}/{businessIdentifier}` y vuelve a consultar cuando termine.

`data` respeta el orden en que enviaste las facturas. Si repites una factura en el body, viene una sola vez. Las facturas que no existen en Pruff vienen en `notFound`, tal como las enviaste y con `code` completado.



## OpenAPI

````yaml openapi/clients.yaml POST /invoices/search
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:
  /invoices/search:
    post:
      tags:
        - Facturas
      summary: Consultar varias facturas
      description: >-
        Busca hasta 500 facturas en un solo llamado, cada una por RUT del
        emisor, folio y tipo de DTE. Úsalo en vez de llamar a `GET /invoices`
        una vez por factura: cada llamado cuenta para el rate limit.


        Solo lee lo que ya está en Pruff; no consulta al SII durante el llamado.
        Cada factura encontrada viene con los mismos campos que en `GET
        /invoices` más `lastUpdate`: la fecha y hora desde la que Pruff tiene al
        día con el SII tanto la factura como su estado de cesión. Si te parece
        antigua, pide una sincronización de tu cliente con `POST
        /syncronizations/execute/{scrapingType}/{businessIdentifier}` y vuelve a
        consultar cuando termine.


        `data` respeta el orden en que enviaste las facturas. Si repites una
        factura en el body, viene una sola vez. Las facturas que no existen en
        Pruff vienen en `notFound`, tal como las enviaste y con `code`
        completado.
      operationId: searchInvoices
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/InvoiceSearchRequest'
            example:
              invoices:
                - businessIdentifier: 76111111-6
                  folio: '1333'
                  code: '33'
                - businessIdentifier: 76111111-6
                  folio: '3213'
                - businessIdentifier: 76111111-6
                  folio: '9999'
      responses:
        '200':
          description: Facturas encontradas y facturas que no existen en Pruff.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/InvoiceSearchResponse'
              example:
                data:
                  - id: 3f2b8a3e-5d1c-4c7e-9a52-0d6f1c2b7a10
                    businessIdentifier: 76111111-6
                    stakeholderIdentifier: 96111111-0
                    businessName: Cliente Ejemplo SpA
                    stakeholderName: Pagador Ejemplo SpA
                    paymentType: null
                    issuedDate: '2024-11-15T00:00:00.000Z'
                    receiptDate: '2024-11-16T00:00:00.000Z'
                    amount: 4123123
                    status: Transable
                    issuer: true
                    code: '33'
                    folio: '1333'
                    creditNoteAmount: 250000
                    debitNoteAmount: 0
                    creditNotes:
                      - folio: '1201'
                        code: '61'
                        issuedDate: '2024-11-20'
                        amount: 250000
                    cessionary: '--'
                    cessionaries: []
                    lastCessionDate: null
                    confirmDate: '2024-11-18T00:00:00.000Z'
                    cancelDate: null
                    enforceableTitle: true
                    currency: CLP
                    lastUpdate: '2024-11-21T13:05:00.000Z'
                  - id: 9c1d7e42-6b0a-4f3d-8e15-2a4b9d6c3f21
                    businessIdentifier: 76111111-6
                    stakeholderIdentifier: 96111111-0
                    businessName: Cliente Ejemplo SpA
                    stakeholderName: Pagador Ejemplo SpA
                    paymentType: null
                    issuedDate: '2024-11-10T00:00:00.000Z'
                    receiptDate: '2024-11-11T00:00:00.000Z'
                    amount: 3748500
                    status: Cedida
                    issuer: true
                    code: '33'
                    folio: '3213'
                    creditNoteAmount: 0
                    debitNoteAmount: 0
                    creditNotes: []
                    cessionary: Factoring Ejemplo SpA
                    cessionaries:
                      - giver: Cliente Ejemplo SpA
                        giverIdentifier: 76111111-6
                        cessionary: Factoring Ejemplo SpA
                        cessionaryIdentifier: 77222222-K
                        cessionDate: '2024-11-12T15:36:00.000Z'
                    lastCessionDate: '2024-11-12T15:36:00.000Z'
                    confirmDate: null
                    cancelDate: null
                    enforceableTitle: true
                    currency: CLP
                    lastUpdate: '2024-11-21T13:05:00.000Z'
                notFound:
                  - businessIdentifier: 76111111-6
                    folio: '9999'
                    code: '33'
        '400':
          description: >-
            El body no cumple el formato esperado. `displayMessage` describe el
            primer error y `data.errors` los lista todos, con `path` apuntando
            al elemento (por ejemplo `invoices.0.folio`).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ValidationError'
              examples:
                missingInvoices:
                  summary: Falta la lista de facturas
                  value:
                    message: invalid_type
                    displayMessage: invoices must be an array
                    data:
                      errors:
                        - path: invoices
                          message: invoices must be an array
                          code: invalid_type
                tooMany:
                  summary: Más de 500 facturas
                  value:
                    message: too_big
                    displayMessage: invoices cannot have more than 500 elements
                    data:
                      errors:
                        - path: invoices
                          message: invoices cannot have more than 500 elements
                          code: too_big
                invalidIdentifier:
                  summary: RUT no válido
                  value:
                    message: invalid_union
                    displayMessage: El RUT o Nit ingresado no es válido.
                    data:
                      errors:
                        - path: invoices.0.businessIdentifier
                          message: El RUT o Nit ingresado no es válido.
                          code: invalid_union
                invalidCode:
                  summary: Tipo de DTE no permitido
                  value:
                    message: invalid_value
                    displayMessage: code must be one of 33, 34, 46
                    data:
                      errors:
                        - path: invoices.0.code
                          message: code must be one of 33, 34, 46
                          code: invalid_value
        '401':
          $ref: '#/components/responses/Unauthorized'
        '429':
          $ref: '#/components/responses/TooManyRequests'
        '500':
          $ref: '#/components/responses/InternalError'
        '504':
          $ref: '#/components/responses/Timeout'
components:
  schemas:
    InvoiceSearchRequest:
      type: object
      additionalProperties: false
      required:
        - invoices
      properties:
        invoices:
          type: array
          description: Facturas a buscar. Entre 1 y 500.
          minItems: 1
          maxItems: 500
          items:
            $ref: '#/components/schemas/InvoiceSearchKey'
    InvoiceSearchResponse:
      type: object
      required:
        - data
        - notFound
      properties:
        data:
          type: array
          description: Facturas encontradas, en el orden en que las enviaste.
          items:
            $ref: '#/components/schemas/InvoiceSearchItem'
        notFound:
          type: array
          description: Facturas que no existen en Pruff.
          items:
            $ref: '#/components/schemas/InvoiceSearchKey'
    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.
    InvoiceSearchKey:
      type: object
      additionalProperties: false
      required:
        - businessIdentifier
        - folio
      properties:
        businessIdentifier:
          type: string
          description: RUT del emisor de la factura, sin puntos y con guion.
          example: 76111111-6
        folio:
          type: string
          description: Folio de la factura.
          example: '1333'
        code:
          type: string
          description: >-
            Tipo de DTE. `33` es factura afecta, `34` es factura exenta y `46`
            es factura de compra. Si no lo envías, se usa `33`.
          enum:
            - '33'
            - '34'
            - '46'
          default: '33'
    InvoiceSearchItem:
      allOf:
        - $ref: '#/components/schemas/InvoiceListItem'
        - type: object
          required:
            - lastUpdate
          properties:
            lastUpdate:
              type:
                - string
                - 'null'
              format: date-time
              description: >-
                Fecha y hora (UTC) de la sincronización más antigua entre dos
                del SII de tu cliente: la de sus facturas de este tipo de DTE y
                la de sus cesiones. Con `issuer: true` son las ventas y las
                cesiones del emisor; con `issuer: false`, las compras y las
                cesiones donde el receptor es deudor. Así, `status` y
                `cessionStatus` están al día al menos hasta esa fecha. La fecha
                de facturas avanza con cualquier mes que Pruff lea, no solo con
                el mes de esta factura, así que `lastUpdate` no garantiza que se
                haya vuelto a leer esta factura. Es `null` si Pruff aún no
                sincroniza alguna de las dos.
    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.
    InvoiceListItem:
      type: object
      description: Factura electrónica con su estado, notas de crédito y cesiones.
      required:
        - id
        - folio
        - code
        - businessIdentifier
        - businessName
        - stakeholderIdentifier
        - stakeholderName
        - issuedDate
        - receiptDate
        - amount
        - status
        - issuer
        - creditNoteAmount
        - debitNoteAmount
        - creditNotes
        - cessionary
        - cessionaries
        - lastCessionDate
        - confirmDate
        - cancelDate
        - enforceableTitle
        - currency
      properties:
        id:
          type: string
          format: uuid
          description: Identificador único de la factura.
          example: 3f2b8a3e-5d1c-4c7e-9a52-0d6f1c2b7a10
        businessIdentifier:
          type: string
          description: RUT del emisor de la factura.
          example: 76111111-6
        businessName:
          type: string
          description: Nombre del emisor de la factura.
          example: Cliente Ejemplo SpA
        stakeholderIdentifier:
          type: string
          description: RUT del receptor de la factura (el deudor).
          example: 96111111-0
        stakeholderName:
          type: string
          description: Nombre del receptor de la factura.
          example: Pagador Ejemplo SpA
        paymentType:
          type:
            - string
            - 'null'
          description: >-
            Forma de pago informada en la factura. Los valores conocidos son `P`
            (pago al contado), `C` y `A`. Es null si la factura no la informa.
          example: null
        issuedDate:
          type: string
          format: date-time
          description: Fecha de emisión de la factura, en formato ISO 8601 (UTC).
          example: '2024-11-15T00:00:00.000Z'
        receiptDate:
          type: string
          format: date-time
          description: >-
            Fecha de recepción de la factura. Si Pruff no la conoce, es igual a
            `issuedDate`.
          example: '2024-11-16T00:00:00.000Z'
        amount:
          type: integer
          description: Monto total de la factura, en CLP.
          example: 4123123
        status:
          type: string
          enum:
            - Transable
            - Cedida
            - Reclamada
            - Nota de crédito
            - Pago al contado
          description: >-
            Estado de la factura. Las reglas para calcularlo están en la
            descripción del endpoint. No tiene el mismo significado que
            `invoiceStatus` en **Obtener cesiones**.
          example: Transable
        issuer:
          type: boolean
          description: >-
            Indica de qué registro del SII obtuvo Pruff la factura, `true` si
            vino del registro de ventas del emisor y `false` si vino del
            registro de compras del receptor. No indica quién la emitió. El
            emisor siempre es `businessIdentifier` y el receptor siempre es
            `stakeholderIdentifier`.
          example: true
        code:
          type: string
          description: >-
            Tipo de DTE de la factura, por ejemplo `33` (afecta), `34` (exenta)
            o `46` (de compra).
          example: '33'
        folio:
          type: string
          description: Folio de la factura.
          example: '1333'
        creditNoteAmount:
          type: integer
          description: >-
            Suma de los montos de todas las notas de crédito de la factura, en
            CLP. Es 0 si no tiene.
          example: 250000
        debitNoteAmount:
          type: integer
          description: >-
            Suma de los montos de las notas de débito que anulan notas de
            crédito de esta factura, en CLP. Es 0 si no tiene.
          example: 0
        creditNotes:
          type: array
          description: >-
            Detalle de las notas de crédito de la factura, ordenadas por fecha
            de emisión ascendente. Arreglo vacío si no tiene. La suma de sus
            `amount` es `creditNoteAmount`.
          items:
            $ref: '#/components/schemas/InvoiceCreditNote'
        cessionary:
          type: string
          description: >-
            Nombre del cesionario de la última cesión. Es `--` si la factura
            nunca se cedió.
          example: '--'
        cessionaries:
          type: array
          description: >-
            Historial de cesiones de la factura, de la más antigua a la más
            reciente. Arreglo vacío si nunca se cedió.
          items:
            $ref: '#/components/schemas/InvoiceCessionary'
        lastCessionDate:
          type:
            - string
            - 'null'
          format: date-time
          description: >-
            Fecha y hora de la última cesión. Es null si la factura nunca se
            cedió.
          example: null
        confirmDate:
          type:
            - string
            - 'null'
          format: date-time
          description: >-
            Fecha del acuse de recibo de la factura. Es null si no se ha
            confirmado.
          example: '2024-11-18T00:00:00.000Z'
        cancelDate:
          type:
            - string
            - 'null'
          format: date-time
          description: >-
            Fecha en que la factura fue reclamada o anulada. Es null si no lo
            fue.
          example: null
        enforceableTitle:
          type: boolean
          description: >-
            Indica si la factura tiene mérito ejecutivo. Es `false` si fue
            reclamada; es `true` si tiene acuse de recibo o si pasaron al menos
            9 días desde su fecha de recepción; en cualquier otro caso es
            `false`.
          example: true
        currency:
          type: string
          description: Moneda de los montos de la factura. Siempre `CLP`.
          example: CLP
    InvoiceCreditNote:
      type: object
      description: Nota de crédito asociada a una factura.
      required:
        - folio
        - code
        - issuedDate
        - amount
      properties:
        folio:
          type: string
          description: Folio de la nota de crédito.
          example: '1201'
        code:
          type: string
          description: Tipo de DTE de la nota de crédito. Siempre `61`.
          example: '61'
        issuedDate:
          type:
            - string
            - 'null'
          format: date
          description: Fecha de emisión de la nota, en formato `YYYY-MM-DD`.
          example: '2024-11-20'
        amount:
          type: integer
          description: Monto total de la nota de crédito, en CLP.
          example: 250000
    InvoiceCessionary:
      type: object
      description: Una cesión de la factura.
      required:
        - giver
        - giverIdentifier
        - cessionary
        - cessionaryIdentifier
        - cessionDate
      properties:
        giver:
          type: string
          description: >-
            Nombre de quien cede en esta cesión. En una recesión, es el
            cesionario anterior.
          example: Cliente Ejemplo SpA
        giverIdentifier:
          type: string
          description: RUT de quien cede.
          example: 76111111-6
        cessionary:
          type: string
          description: Nombre del cesionario.
          example: Factoring Ejemplo SpA
        cessionaryIdentifier:
          type: string
          description: RUT del cesionario.
          example: 77222222-K
        cessionDate:
          type: string
          format: date-time
          description: Fecha y hora de la cesión, en formato ISO 8601 (UTC).
          example: '2024-11-12T15:36:00.000Z'
  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.