> ## Documentation Index
> Fetch the complete documentation index at: https://docs.inagent.inconcertcx.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Reemplazar las reglas de un lote

> Sustituye la configuración de reglas de marcación del lote.

Reemplaza el conjunto completo de reglas de marcación del lote por el enviado en el body.


## OpenAPI

````yaml api-reference/dialer/openapi.yaml PUT /batches/{batchId}/rules
openapi: 3.1.0
info:
  title: AutoContact API
  version: final
  summary: Gestión de lotes de marcación automática y carga de contactos.
  description: >
    API de AutoContact: gestión de lotes de marcación automática y de los
    contactos que los integran.


    Todos los recursos se publican bajo `/autocontact/api/v1/`.


    ## Autenticación


    Las peticiones se autentican con el header `apikey`. La misma credencial
    permite operar los lotes

    de la cuenta a los que tenga acceso. El servicio deriva la cuenta de esa
    credencial y verifica que

    el recurso solicitado le pertenezca.


    Un lote que no pertenece a la cuenta responde `404`, igual que un lote
    inexistente.


    ## Operaciones asíncronas


    Algunas operaciones responden `202` en lugar de `200`: la petición se acepta
    y el trabajo continúa

    en segundo plano. Es el caso de la carga de contactos, el arranque y la
    eliminación de un lote.


    Esas respuestas incluyen un `operationId` que se consulta en

    `GET /batches/operations/{operationId}` para conocer el resultado.


    `POST /batches` no genera una operación: devuelve directamente el `batchId`,
    el estado `created` y

    el origen del lote, sin `operationId`.


    Tiempo de retención de las operaciones:


    | Tipo de operación | Disponible durante |

    |---|---|

    | Carga de contactos | 6 horas |

    | Ciclo de vida del lote (arranque, archivado, eliminación) | 1 hora, y 10
    minutos desde que finaliza |


    ## Reintentos seguros con `Idempotency-Key`


    Las operaciones de escritura aceptan el header opcional `Idempotency-Key`.
    Resuelve el caso en que

    se produce un error de red después de que la petición llegó al servicio: sin
    este header no es

    posible determinar si el trabajo se procesó, y reintentar podría duplicar
    llamadas telefónicas.


    Con el header, un reintento que use la misma clave y el mismo cuerpo
    devuelve la respuesta original

    sin procesar nada de nuevo. Las claves se conservan 24 horas.


    Recomendación de uso: generar un identificador único (por ejemplo un UUID)
    antes del primer intento

    y reutilizarlo solo en los reintentos de esa misma operación.


    Requisitos de la clave: entre 1 y 255 caracteres, solo ASCII imprimible. Una
    clave que no cumpla

    estos requisitos se rechaza con `400 INVALID_IDEMPOTENCY_KEY` en lugar de
    ignorarse, para evitar

    procesar la petición sin la protección que el cliente espera tener.


    ### Headers de respuesta


    | Header | Cuándo aparece | Significado |

    |---|---|---|

    | `Idempotency-Replayed: true` | En un reintento | La respuesta corresponde
    a la petición original; no se procesó de nuevo |

    | `Retry-After` | Junto a `409 IDEMPOTENCY_KEY_IN_FLIGHT` | Segundos a
    esperar antes de reintentar |

    | `Idempotency-Status: bypassed` | Excepcionalmente | La petición se procesó
    **sin** protección de idempotencia |


    El header `Idempotency-Status: bypassed` indica que el servicio de
    idempotencia no estaba

    disponible y la petición se procesó igualmente, para no interrumpir la
    operación. La respuesta es

    válida, pero esa petición concreta no quedó protegida: si no se recibe
    respuesta, se recomienda

    verificar el estado antes de reintentar.


    Las respuestas con error `5xx` no se almacenan, de modo que un reintento con
    la misma clave vuelve a

    procesar la petición.
servers:
  - url: https://api.backend.inconcertcc.com/autocontact/api/v1
    description: API de Inagent
security:
  - ApiKeyAuth: []
tags:
  - name: Lotes
    description: |
      Creación, consulta y control de lotes de marcación.
  - name: Contactos
    description: |
      Carga de contactos en un lote, reagendamiento y anulación.
  - name: Direcciones bloqueadas
    description: |
      Direcciones excluidas de la marcación en toda la cuenta.
  - name: Operaciones
    description: |
      Seguimiento de las operaciones asíncronas que devuelven `202`.
paths:
  /batches/{batchId}/rules:
    parameters:
      - $ref: '#/components/parameters/BatchId'
    put:
      tags:
        - Lotes
      summary: Reemplaza las reglas de marcación del lote
      description: >
        Define cuántas veces se intenta contactar a cada contacto, el tiempo de
        espera entre intentos y la

        ventana horaria de marcación.


        ## Sustitución completa


        El cuerpo debe contener el objeto de reglas completo. Las reglas forman
        un conjunto coherente, por

        lo que no se admiten modificaciones parciales: aceptar campos aislados
        podría dar lugar a

        configuraciones contradictorias, como más reintentos por resultado que
        el máximo por contacto.


        Enviar `null` elimina las reglas propias del lote, que pasa a usar las
        configuradas en la cuenta.


        ## Efecto sobre un lote en curso


        Los cambios se aplican a los intentos posteriores. Los contactos que ya
        tuvieran una fecha

        programada la conservan: reducir `timeBetweenAttempts` no adelanta los
        intentos ya planificados.
      operationId: updateBatchRules
      requestBody:
        required: true
        content:
          application/json:
            schema:
              oneOf:
                - $ref: '#/components/schemas/BatchRules'
                - type: 'null'
            examples:
              reglasPropias:
                summary: Reglas propias del lote
                value:
                  strategy:
                    maxAttemptsPerAddress: 2
                    maxAttemptsPerContact: 4
                    timeBetweenAttempts: 60
                    scheduleStart: '09:00'
                    scheduleEnd: '20:00'
                    timezone: America/Argentina/Buenos_Aires
                    daysOfWeek:
                      - 1
                      - 2
                      - 3
                      - 4
                      - 5
                    processAllContactsFirst: true
                  resultRules:
                    NO_ANSWER:
                      retryDelay: 30
                      maxRetries: 2
                    BUSY:
                      retryDelay: 15
                      maxRetries: 3
              heredarDeLaCuenta:
                summary: Usar las reglas de la cuenta
                value: null
      responses:
        '200':
          description: Reglas actualizadas.
          content:
            application/json:
              schema:
                type: object
                additionalProperties: true
        '400':
          description: >
            La estructura del cuerpo es incorrecta, o algún valor está fuera de
            rango.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ValidationError'
              example:
                code: VALIDATION_FAILED
                message: Validación fallida en las reglas
                details:
                  - field: strategy
                    code: REQUIRED
                    reason: >-
                      required: attempt limits, wait between attempts and the
                      dialing window
        '404':
          description: El lote no existe o no pertenece a la cuenta.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SimpleError'
        '500':
          $ref: '#/components/responses/InternalError'
components:
  parameters:
    BatchId:
      name: batchId
      in: path
      required: true
      schema:
        type: string
        format: uuid
      description: Id del lote.
  schemas:
    BatchRules:
      type: object
      required:
        - strategy
      description: >
        Reglas de marcación del lote. Objeto completo: no admite actualizaciones
        parciales.
      properties:
        strategy:
          type: object
          description: >
            Límites de intentos y ventana horaria. Los rangos los valida el
            servicio; los valores

            fuera de rango responden `400`.
          properties:
            maxAttemptsPerAddress:
              type: integer
              description: Intentos máximos por cada teléfono o email del contacto.
            maxAttemptsPerContact:
              type: integer
              description: >
                Intentos máximos por contacto, sumando todas sus direcciones.
                Tiene que ser coherente

                con `maxAttemptsPerAddress`.
            timeBetweenAttempts:
              type: integer
              description: Minutos de espera entre intentos al mismo contacto.
            scheduleStart:
              type: string
              pattern: ^([01]\d|2[0-3]):([0-5]\d)$
              example: '09:00'
            scheduleEnd:
              type: string
              pattern: ^([01]\d|2[0-3]):([0-5]\d)$
              example: '20:00'
            timezone:
              type: string
              example: America/Argentina/Buenos_Aires
            daysOfWeek:
              type: array
              items:
                type: integer
                minimum: 0
                maximum: 6
              description: >
                Días habilitados, `0` domingo a `6` sábado. Vacío u omitido
                significa todos los días.
            processAllContactsFirst:
              type: boolean
              description: >
                Con `true`, se recorre la lista completa de contactos antes de
                reintentar con los que no

                atendieron. Con `false`, cada contacto se reintenta en cuanto
                vence su tiempo de espera.
        resultRules:
          type: object
          additionalProperties:
            type: object
            properties:
              retryDelay:
                type: integer
                description: Minutos a esperar antes de reintentar tras este resultado.
              maxRetries:
                type: integer
                description: |
                  Reintentos para este resultado. `0` significa no reintentar.
          description: >
            Reglas por resultado de la llamada. Entre las claves admitidas se
            encuentran `noAnswer`,

            `busy` y `voicemail`. Qué resultados aplican depende del tipo de
            canal del lote.
        addressPriority:
          type: object
          description: >-
            Define cómo se recorren las direcciones de un contacto antes de
            reintentarlas.
          properties:
            tryAllBeforeRetry:
              type: boolean
              description: >
                Con `true`, se prueban todas las direcciones del contacto antes
                de reintentar una ya

                utilizada.
        amd:
          type: object
          description: Detección de contestador automático.
          properties:
            amdEnabled:
              type: boolean
            amdAction:
              type: string
              enum:
                - HANGUP
                - LEAVE_MESSAGE
                - CONTINUE
    ValidationError:
      type: object
      required:
        - message
      properties:
        code:
          type: string
          enum:
            - VALIDATION_FAILED
          description: >
            Presente cuando el rechazo corresponde a la validación de contactos.
            No aparece en los

            rechazos por límites de la petición, como un cuerpo vacío o más de
            1000 contactos.
        message:
          type: string
        details:
          description: >
            Detalle del rechazo. La estructura varía según el caso: una lista de
            textos para los límites

            de la petición, o una lista de `FieldRejection` cuando el rechazo es
            de validación de

            contactos.
          oneOf:
            - type: array
              items:
                type: string
            - type: array
              items:
                $ref: '#/components/schemas/FieldRejection'
    SimpleError:
      type: object
      required:
        - message
      description: >
        Error con mensaje descriptivo.


        Algunos traen `code` estable (los más nuevos); otros solo `message`.


        Los mensajes pueden aparecer en español o en inglés según el caso, y
        algunos errores todavía no

        incluyen `code`. Cuando esté presente, utilice `code` para tratar el
        error de forma programática.
      properties:
        code:
          type: string
          description: >
            Presente en los errores ya normalizados (`MISSING_PARAMETER`,
            `OPERATION_NOT_FOUND`,

            `VALIDATION_FAILED`, `INVALID_IDEMPOTENCY_KEY`, y los de
            idempotencia).
        message:
          type: string
    FieldRejection:
      type: object
      required:
        - index
        - field
        - code
        - reason
      description: >
        Campo rechazado de un contacto concreto.


        Se incluyen todos los rechazos, no solo el primero de cada contacto: un
        contacto con tres campos

        incorrectos genera tres entradas.


        Utilice `code`, que es estable, para tratar el error de forma
        programática. El campo `reason` es

        un texto descriptivo de apoyo y puede cambiar sin aviso.
      properties:
        index:
          type: integer
          description: Posición del contacto en el array enviado, base 0.
          example: 3
        field:
          type: string
          description: >
            Ruta del campo rechazado, precedida por la posición del contacto.
            Permite localizarlo en la

            petición enviada.
          example: contacts[3].addresses[0].address
        code:
          type: string
          enum:
            - REQUIRED
            - INVALID_TYPE
            - INVALID_PHONE_FORMAT
            - INVALID_EMAIL_FORMAT
            - INVALID_ADDRESS_TYPE
            - INVALID_PRIORITY
            - EMPTY_ARRAY
            - INVALID_DATE
            - DATE_NOT_FUTURE
            - DATE_OUT_OF_RANGE
            - DUPLICATED_IN_REQUEST
          description: >
            Código estable del motivo del rechazo. Es el valor recomendado para
            tratar el error de forma

            programática y para traducir el mensaje al idioma del usuario final.
        reason:
          type: string
          description: >
            Descripción del rechazo, en español. Informativa: puede cambiar sin
            aviso.
        meta:
          type: object
          additionalProperties: true
          description: >
            Datos del rechazo: el valor recibido, el esperado o el límite
            aplicado. Permiten construir un

            mensaje propio sin necesidad de interpretar el texto de `reason`.
          example:
            received: '123'
            expected: digits only, 7-15 characters
        error:
          type: string
          deprecated: true
          description: >
            Contiene el mismo valor que `reason`. Se mantiene por compatibilidad
            con versiones anteriores;

            utilice `reason`.
  responses:
    InternalError:
      description: Error interno.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/SimpleError'
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: apikey
      description: API key obtenida desde la interfaz de Inagent, dentro del marcador.

````