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

# Enrolar cliente

> Enrola a un cliente en tu empresa. Con `CLP`, Pruff también obtiene su información tributaria del SII.

Para clientes en `CLP` (valor por defecto) envías el RUT y la clave del SII del cliente. Pruff valida la clave contra el SII antes de enrolar (esta validación puede tardar hasta unos 12 segundos) y, si es válida, registra al cliente y comienza a obtener su información en segundo plano. La activación del cliente y sus datos pueden tardar en estar disponibles después de la respuesta: justo después de enrolar, `GET /datahub/isEnrolled/{identifier}` puede mostrar `active: false` durante unos instantes. Si el SII no responde, recibes `503` y puedes reintentar.

Si el cliente ya estaba enrolado, se actualiza con la clave nueva. Si estaba pausado, se reactiva. Al enrolar de nuevo a un cliente, envía siempre su clave vigente. Si no envías clave (solo es posible en otras monedas), Pruff conserva la clave que el cliente ya tenía guardada.

Para otras monedas la clave es opcional y no se consulta al SII. `identifier` se valida según `currency`: RUT para `CLP`, `UF` y `UTM`; Nit para `COP`; RUC para `PEN`. Usa una de esas monedas con el identificador que le corresponde.

La clave del SII del cliente solo se usa para validar el acceso y obtener su información; nunca se devuelve en las respuestas.



## OpenAPI

````yaml openapi/clients.yaml POST /datahub/enroll
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:
  /datahub/enroll:
    post:
      tags:
        - Datahub
      summary: Enrolar cliente
      description: >-
        Enrola a un cliente en tu empresa. Con `CLP`, Pruff también obtiene su
        información tributaria del SII.


        Para clientes en `CLP` (valor por defecto) envías el RUT y la clave del
        SII del cliente. Pruff valida la clave contra el SII antes de enrolar
        (esta validación puede tardar hasta unos 12 segundos) y, si es válida,
        registra al cliente y comienza a obtener su información en segundo
        plano. La activación del cliente y sus datos pueden tardar en estar
        disponibles después de la respuesta: justo después de enrolar, `GET
        /datahub/isEnrolled/{identifier}` puede mostrar `active: false` durante
        unos instantes. Si el SII no responde, recibes `503` y puedes
        reintentar.


        Si el cliente ya estaba enrolado, se actualiza con la clave nueva. Si
        estaba pausado, se reactiva. Al enrolar de nuevo a un cliente, envía
        siempre su clave vigente. Si no envías clave (solo es posible en otras
        monedas), Pruff conserva la clave que el cliente ya tenía guardada.


        Para otras monedas la clave es opcional y no se consulta al SII.
        `identifier` se valida según `currency`: RUT para `CLP`, `UF` y `UTM`;
        Nit para `COP`; RUC para `PEN`. Usa una de esas monedas con el
        identificador que le corresponde.


        La clave del SII del cliente solo se usa para validar el acceso y
        obtener su información; nunca se devuelve en las respuestas.
      operationId: enrollDatahubClient
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/DatahubEnrollBody'
            examples:
              chile:
                summary: Cliente chileno
                value:
                  identifier: 11111111-1
                  password: ClaveEjemplo123
                  name: Cliente Ejemplo SpA
              colombia:
                summary: Cliente colombiano
                value:
                  identifier: 900123456-8
                  currency: COP
                  name: Cliente Ejemplo SAS
      responses:
        '200':
          description: Cliente enrolado.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DatahubMessage'
              example:
                message: Enrollment ok
        '400':
          description: >-
            El body no es válido o el SII no aceptó la clave. En errores de
            validación del body, `data.errors` lista todos los problemas; cuando
            el SII no acepta la clave, el body solo trae `message` y
            `displayMessage`. `Invalid password` también aparece cuando el
            cliente tiene demasiadas sesiones abiertas en el SII o su clave
            tributaria está bloqueada. En ese caso espera unos minutos y
            reintenta antes de pedir una clave nueva al cliente.
          content:
            application/json:
              schema:
                anyOf:
                  - $ref: '#/components/schemas/ValidationError'
                  - $ref: '#/components/schemas/Error'
              examples:
                invalidIdentifier:
                  summary: RUT inválido
                  value:
                    message: custom
                    displayMessage: El Rut ingresado no es válido
                    data:
                      errors:
                        - path: identifier
                          message: El Rut ingresado no es válido
                          code: custom
                missingIdentifier:
                  summary: Falta identifier
                  value:
                    message: invalid_type
                    displayMessage: El identificador es requerido
                    data:
                      errors:
                        - path: identifier
                          message: El identificador es requerido
                          code: invalid_type
                missingPassword:
                  summary: Falta la clave (CLP)
                  value:
                    message: custom
                    displayMessage: La contraseña es requerida
                    data:
                      errors:
                        - path: password
                          message: La contraseña es requerida
                          code: custom
                invalidPassword:
                  summary: >-
                    Clave no aceptada por el SII (inválida, bloqueada o con
                    demasiadas sesiones)
                  value:
                    message: Invalid password
                    displayMessage: La contraseña ingresada no es válida
        '401':
          $ref: '#/components/responses/Unauthorized'
        '429':
          description: >-
            Superaste el límite general de la API de clientes: **500 solicitudes
            por minuto por empresa** (todas las API keys de tu empresa suman en
            el mismo contador). El body y el header `Retry-After` indican cuándo
            puedes reintentar.
          headers:
            Retry-After:
              description: Segundos que debes esperar antes de reintentar.
              schema:
                type: integer
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DatahubRateLimitError'
              example:
                message: >-
                  Rate limit exceeded: 501 requests in the current 60s window,
                  limit is 500. Retry in 25s.
                displayMessage: >-
                  Superaste el límite de 500 solicitudes cada 60 segundos.
                  Vuelve a intentarlo en 25 segundos.
                data:
                  code: RATE_LIMIT_EXCEEDED
                  scope: All API keys of your company share this budget.
                  limit: 500
                  used: 501
                  windowSeconds: 60
                  retryAfterSeconds: 25
                  resetAt: '2026-03-10T15:00:25.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.
        '500':
          $ref: '#/components/responses/InternalError'
        '503':
          description: >-
            No se pudo validar la clave porque el SII no responde o el servicio
            de validación no está disponible. Reintenta más tarde. El cliente no
            queda enrolado.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                siiUnavailable:
                  summary: El SII no responde
                  value:
                    message: Internal server error
                    displayMessage: >-
                      El SII no está respondiendo. Intenta nuevamente en unos
                      minutos.
                validationUnavailable:
                  summary: Validación no disponible
                  value:
                    message: Internal server error
                    displayMessage: >-
                      El servicio de validación de credenciales no se encuentra
                      disponible.
        '504':
          $ref: '#/components/responses/Timeout'
components:
  schemas:
    DatahubEnrollBody:
      type: object
      required:
        - identifier
      properties:
        identifier:
          type: string
          example: 11111111-1
          description: >-
            Identificador tributario del cliente, sin puntos y con guion. Se
            valida según `currency`: RUT chileno con dígito verificador para
            `CLP`, `UF` y `UTM`; Nit colombiano para `COP`; RUC de 11 dígitos
            para `PEN`. Usa una de esas monedas con el identificador que le
            corresponde.
        password:
          type:
            - string
            - 'null'
          example: ClaveEjemplo123
          description: >-
            Clave del SII del cliente. Obligatoria cuando `currency` es `CLP`:
            Pruff la valida contra el SII antes de enrolar. Para las demás
            monedas es opcional y no se valida. Al enrolar de nuevo a un
            cliente, envía siempre su clave vigente. Si no envías la clave al
            enrolar de nuevo a un cliente que ya tenía una, Pruff conserva la
            que tenía guardada.
        currency:
          type: string
          enum:
            - CLP
            - UF
            - USD
            - EUR
            - UTM
            - COP
            - ARS
            - PEN
            - BRL
            - MXN
          default: CLP
          description: >-
            Moneda del cliente. Determina cómo se valida `identifier` y si
            `password` es obligatoria. Para clientes chilenos usa `CLP` (valor
            por defecto), con el que Pruff obtiene su información tributaria del
            SII. La moneda se registra la primera vez que Pruff conoce al
            cliente; si ya lo conocía, no cambia la que tiene guardada.
        name:
          type:
            - string
            - 'null'
          minLength: 1
          example: Cliente Ejemplo SpA
          description: >-
            Razón social del cliente. Se usa solo si el cliente aún no existe en
            Pruff y Pruff no encuentra su razón social en fuentes externas; en
            ese caso reemplaza el valor por defecto `Razon Social Desconocida`.
            Si el cliente ya existe, se ignora.
    DatahubMessage:
      type: object
      required:
        - message
      properties:
        message:
          type: string
          description: Resultado de la operación.
    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.
    DatahubRateLimitError:
      type: object
      required:
        - message
        - displayMessage
        - data
      description: Respuesta cuando superas el límite de solicitudes.
      properties:
        message:
          type: string
          description: Detalle del límite superado, en inglés.
        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:
          type: object
          properties:
            code:
              type: string
              enum:
                - RATE_LIMIT_EXCEEDED
              description: Código estable del error.
            scope:
              type: string
              description: A quién aplica el límite.
            limit:
              type: integer
              description: Máximo de solicitudes permitidas en la ventana.
            used:
              type: integer
              description: Solicitudes contadas en la ventana actual.
            windowSeconds:
              type: integer
              description: Duración de la ventana, en segundos.
            retryAfterSeconds:
              type: integer
              description: Segundos que debes esperar antes de reintentar.
            resetAt:
              type:
                - string
                - 'null'
              format: date-time
              description: >-
                Instante (ISO 8601, UTC) en que se reinicia el contador. Puede
                ser `null`.
            hint:
              type: string
              description: Recomendación para evitar el límite.
  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'
    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.