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

# Sincronizar cliente

> Pide sincronizar a un cliente enrolado de tu empresa con el SII o la TGR para obtener su información más actualizada.

Este endpoint es asíncrono: la respuesta `200` solo confirma que la sincronización quedó en curso, no que terminó. Para saber si se actualizó, revisa `isUpdated` en el endpoint "Listar últimas sincronizaciones" (en `tgr`, compara además `lastScrapedAt` con `date`) o las fechas del endpoint "Obtener estado de sincronización".

Antes de iniciar, Pruff valida las credenciales del cliente. Si la clave del SII ya no es válida, el cliente deja de figurar como enrolado en tu cuenta y debes enrolarlo de nuevo.

Cada tipo de sincronización tiene un tiempo de espera entre solicitudes para el mismo cliente. Si vuelves a pedirla antes de que pase, recibes un `429` que indica cuántos minutos esperar. El `429` también puede deberse al límite de solicitudes de tu empresa, que incluye el header `Retry-After`.

Si recibes un `500`, un `503` o un `504`, antes de reintentar consulta "Obtener estado de sincronización"; un reintento inmediato puede responder `429`. Si el `504` indica que el inicio quedó sin confirmar, esa sincronización no aparece en "Listar últimas sincronizaciones": usa "Obtener estado de sincronización".

En el `body` puedes enviar `months` para acotar la sincronización de documentos del SII a meses específicos. Para `tgr` no se usa, pero si lo envías se valida igual (por ejemplo, una lista vacía responde `400`). El `body` es opcional.



## OpenAPI

````yaml openapi/clients.yaml POST /syncronizations/execute/{scrapingType}/{businessIdentifier}
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:
  /syncronizations/execute/{scrapingType}/{businessIdentifier}:
    post:
      tags:
        - Sincronizador
      summary: Sincronizar cliente
      description: >-
        Pide sincronizar a un cliente enrolado de tu empresa con el SII o la TGR
        para obtener su información más actualizada.


        Este endpoint es asíncrono: la respuesta `200` solo confirma que la
        sincronización quedó en curso, no que terminó. Para saber si se
        actualizó, revisa `isUpdated` en el endpoint "Listar últimas
        sincronizaciones" (en `tgr`, compara además `lastScrapedAt` con `date`)
        o las fechas del endpoint "Obtener estado de sincronización".


        Antes de iniciar, Pruff valida las credenciales del cliente. Si la clave
        del SII ya no es válida, el cliente deja de figurar como enrolado en tu
        cuenta y debes enrolarlo de nuevo.


        Cada tipo de sincronización tiene un tiempo de espera entre solicitudes
        para el mismo cliente. Si vuelves a pedirla antes de que pase, recibes
        un `429` que indica cuántos minutos esperar. El `429` también puede
        deberse al límite de solicitudes de tu empresa, que incluye el header
        `Retry-After`.


        Si recibes un `500`, un `503` o un `504`, antes de reintentar consulta
        "Obtener estado de sincronización"; un reintento inmediato puede
        responder `429`. Si el `504` indica que el inicio quedó sin confirmar,
        esa sincronización no aparece en "Listar últimas sincronizaciones": usa
        "Obtener estado de sincronización".


        En el `body` puedes enviar `months` para acotar la sincronización de
        documentos del SII a meses específicos. Para `tgr` no se usa, pero si lo
        envías se valida igual (por ejemplo, una lista vacía responde `400`). El
        `body` es opcional.
      operationId: executeSyncronization
      parameters:
        - $ref: '#/components/parameters/SyncronizationScrapingType'
        - $ref: '#/components/parameters/SyncronizationBusinessIdentifier'
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SyncronizationExecuteRequest'
            example:
              months:
                - 2026-09
                - 2026-10
      responses:
        '200':
          description: La sincronización quedó en curso.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SyncronizationExecuteResponse'
              example:
                message: Scraping executed
        '400':
          description: >-
            Algún parámetro o el `body` no son válidos, o el cliente tiene
            demasiadas sesiones abiertas en el SII.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                tipoInvalido:
                  summary: Tipo de sincronización desconocido
                  value:
                    message: 'Invalid params. Expected scraping types: sii, tgr.'
                rutInvalido:
                  summary: RUT inválido
                  value:
                    message: >-
                      Invalid params: business identifier must be a valid rut
                      (format: 12312312-K).
                mesesVacio:
                  summary: Lista de meses vacía
                  value:
                    message: too_small
                    displayMessage: Se debe seleccionar al menos un mes.
                    data:
                      errors:
                        - path: months
                          message: Se debe seleccionar al menos un mes.
                          code: too_small
                demasiadosMeses:
                  summary: Más de 6 meses
                  value:
                    message: too_big
                    displayMessage: No se pueden sincronizar más de 6 meses a la vez.
                    data:
                      errors:
                        - path: months
                          message: No se pueden sincronizar más de 6 meses a la vez.
                          code: too_big
                formatoMes:
                  summary: Mes con formato inválido
                  value:
                    message: invalid_format
                    displayMessage: Cada mes debe venir en formato YYYY-MM.
                    data:
                      errors:
                        - path: months.0
                          message: Cada mes debe venir en formato YYYY-MM.
                          code: invalid_format
                mesRepetido:
                  summary: Mes repetido
                  value:
                    message: custom
                    displayMessage: No se puede repetir un mes en la selección.
                    data:
                      errors:
                        - path: months
                          message: No se puede repetir un mes en la selección.
                          code: custom
                mesFuturo:
                  summary: Mes futuro
                  value:
                    message: custom
                    displayMessage: No se pueden sincronizar meses futuros.
                    data:
                      errors:
                        - path: months
                          message: No se pueden sincronizar meses futuros.
                          code: custom
                sesionesAbiertas:
                  summary: El cliente tiene demasiadas sesiones abiertas en el SII
                  value:
                    message: Business is blocked
                    displayMessage: >-
                      El cliente se encuentra con muchas sesiones abiertas.
                      Intente denuevo más tarde.
                tgrSolicitudInvalida:
                  summary: No se pudieron validar las credenciales de la TGR
                  value:
                    message: 'Invalid TGR credentials validation request: <detalle>'
                    displayMessage: >-
                      No se pudo validar las credenciales de la TGR con los
                      datos entregados.
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          description: >-
            El RUT no corresponde a un cliente enrolado y activo de tu empresa,
            o sus credenciales ya no son válidas.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                clienteNoEncontrado:
                  summary: El cliente no está enrolado en tu empresa
                  value:
                    message: Company not found
                    displayMessage: Empresa no encontrada
                claveSiiInvalida:
                  summary: La clave del SII ya no es válida
                  value:
                    message: Business in not errolled
                    displayMessage: El cliente ya no se encuentra enrolado.
                claveTgrInvalida:
                  summary: Las credenciales de la TGR no son válidas
                  value:
                    message: Invalid TGR credentials
                    displayMessage: >-
                      Credenciales no válidas para la TGR. A veces la contraseña
                      de la TGR del cliente puede ser diferente a la del SII.
        '429':
          description: >-
            No se pudo pedir la sincronización por una de dos causas. (1)
            Pediste sincronizar a este cliente demasiado pronto: espera los
            minutos indicados en `displayMessage` antes de reintentar; en este
            caso la respuesta no trae el header `Retry-After` ni `data`. (2) Tu
            empresa superó el límite de solicitudes, compartido por todas sus
            API keys: espera los segundos que indica el header `Retry-After` (o
            `data.retryAfterSeconds`).
          headers:
            Retry-After:
              description: >-
                Segundos que debes esperar antes de reintentar. Solo viene
                cuando se superó el límite de solicitudes de tu empresa.
              schema:
                type: integer
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                esperaPorCliente:
                  summary: Sincronización pedida demasiado pronto para este cliente
                  value:
                    message: Scrapers with rate limit blocked
                    displayMessage: Debes esperar 12 minutos para volver a sincronizar SII.
                limiteDeSolicitudes:
                  summary: Tu empresa superó el límite de solicitudes
                  value:
                    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.
        '500':
          description: >-
            Error inesperado en Pruff. Antes de reintentar, consulta "Obtener
            estado de sincronización". 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
        '503':
          description: >-
            El SII o la TGR no están disponibles en este momento, o no se pudo
            iniciar la sincronización. Reintenta más tarde. En `sii`, si el
            `displayMessage` menciona IVA, consulta "Obtener estado de
            sincronización" antes de reintentar. El campo `message` siempre es
            `Internal server error`; el detalle viene en `displayMessage`.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                siiNoDisponible:
                  summary: El SII no responde
                  value:
                    message: Internal server error
                    displayMessage: >-
                      El SII no está respondiendo. Intenta nuevamente en unos
                      minutos.
                tgrNoDisponible:
                  summary: La TGR no está disponible
                  value:
                    message: Internal server error
                    displayMessage: >-
                      El servicio de la TGR no se encuentra disponible. Por
                      favor, intente denuevo más tarde.
                errorAlIniciar:
                  summary: No se pudo iniciar la sincronización
                  value:
                    message: Internal server error
                    displayMessage: Error al iniciar actualización de documentos SII
        '504':
          description: >-
            No se pudo confirmar a tiempo el inicio de la sincronización, o la
            solicitud superó el tiempo máximo de 55 segundos. En ambos casos la
            sincronización puede estar en curso y un reintento puede responder
            `429`: consulta "Obtener estado de sincronización" antes de
            reintentar. Si el inicio quedó sin confirmar, la sincronización no
            aparece en "Listar últimas sincronizaciones".
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                inicioSinConfirmar:
                  summary: Inicio de la sincronización sin confirmar
                  value:
                    message: Internal server error
                    displayMessage: >-
                      Actualización de documentos SII sin confirmar; puede estar
                      en curso.
                tiempoMaximo:
                  summary: >-
                    La solicitud superó el tiempo máximo (la sincronización
                    puede haber quedado en curso)
                  value:
                    message: request_timeout
                    displayMessage: La solicitud excedió el tiempo máximo permitido
components:
  parameters:
    SyncronizationScrapingType:
      name: scrapingType
      in: path
      required: true
      description: >-
        Tipo de sincronización: `sii` (documentos del SII: facturas, cesiones e
        IVA) o `tgr` (Tesorería General de la República: cobranza judicial,
        convenios de pago y cartola fiscal).
      schema:
        type: string
        enum:
          - sii
          - tgr
      example: sii
    SyncronizationBusinessIdentifier:
      name: businessIdentifier
      in: path
      required: true
      description: RUT del cliente, sin puntos y con guion, con dígito verificador válido.
      schema:
        type: string
      example: 11111111-1
  schemas:
    SyncronizationExecuteRequest:
      type: object
      properties:
        months:
          type: array
          description: >-
            Meses de documentos del SII que quieres sincronizar, en formato
            YYYY-MM. Entre 1 y 6 meses, sin repetir y sin meses futuros. Solo
            aplica a `sii`; en `tgr` no se usa, pero si lo envías se valida
            igual. Si no lo envías, se sincroniza el período por defecto.
          minItems: 1
          maxItems: 6
          uniqueItems: true
          items:
            type: string
            pattern: ^\d{4}-(0[1-9]|1[0-2])$
            example: 2026-10
    SyncronizationExecuteResponse:
      type: object
      required:
        - message
      properties:
        message:
          type: string
          description: Confirmación de que la sincronización quedó en curso.
          example: Scraping executed
    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'
  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.