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

# Bloquear direcciones

> Añade una o varias direcciones a la lista de bloqueo de la cuenta.

El bloqueo se aplica a toda la cuenta, no solo a un lote concreto.


## OpenAPI

````yaml api-reference/dialer/openapi.yaml POST /blocked-addresses
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:
  /blocked-addresses:
    post:
      tags:
        - Direcciones bloqueadas
      summary: Bloquea una o varias direcciones
      description: >
        Añade direcciones a la lista de bloqueo de la cuenta. Una dirección
        bloqueada queda excluida de la

        marcación en todos los lotes, presentes y futuros.


        ## Alcance del bloqueo


        El bloqueo es de ámbito de cuenta, no de lote. Se utiliza cuando la
        persona solicita no ser

        contactada.


        Para dejar de llamar a un contacto en una campaña concreta sin afectar
        al resto, utilice la

        anulación del contacto:

        `PUT /batches/{batchId}/contacts/cancel/`.


        ## Direcciones ya bloqueadas


        Una dirección que ya estaba bloqueada no se duplica ni produce error: se
        cuenta en `skipped`. Esto

        permite reenviar una lista completa sin necesidad de comprobar antes qué
        direcciones existen.


        ## Normalización


        Las direcciones se normalizan a minúsculas y se eliminan los espacios de
        los extremos antes de

        almacenarlas. La unicidad se establece por la combinación de dirección y
        tipo, de modo que el

        mismo valor puede bloquearse como `phone` y como `whatsapp` de forma
        independiente.


        ## Aplicación


        La sincronización con el motor de marcación se realiza en segundo plano
        tras responder. Las

        llamadas ya en curso en el momento del bloqueo no se interrumpen.
      operationId: blockAddresses
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - addressType
              properties:
                addresses:
                  type: array
                  items:
                    type: string
                  minItems: 1
                  description: >
                    Direcciones a bloquear. Para una sola dirección puede
                    utilizarse el campo `address`.
                  example:
                    - '5491155551234'
                    - '5491155555678'
                address:
                  type: string
                  description: >
                    Dirección única a bloquear. Alternativa a `addresses` para
                    un solo valor.
                  example: '5491155551234'
                addressType:
                  type: string
                  enum:
                    - phone
                    - email
                    - whatsapp
                  description: >
                    Tipo de las direcciones enviadas. Se aplica a todas las
                    direcciones de la petición.
                reason:
                  type: string
                  description: >
                    Motivo del bloqueo. Se almacena a título informativo y
                    aparece en el listado.
                  example: Solicitud del titular
            examples:
              variasDirecciones:
                summary: Varias direcciones
                value:
                  addresses:
                    - '5491155551234'
                    - '5491155555678'
                  addressType: phone
                  reason: Solicitud del titular
              unaDireccion:
                summary: Una sola dirección
                value:
                  address: cliente@example.com
                  addressType: email
                  reason: Baja de comunicaciones comerciales
      responses:
        '201':
          description: >
            Direcciones procesadas. Los recuentos indican cuántas se bloquearon
            y cuántas ya lo estaban.
          content:
            application/json:
              schema:
                type: object
                required:
                  - blocked
                  - skipped
                properties:
                  blocked:
                    type: integer
                    description: Direcciones añadidas a la lista de bloqueo.
                    example: 2
                  skipped:
                    type: integer
                    description: >
                      Direcciones que ya estaban bloqueadas y no se han vuelto a
                      registrar.
                    example: 1
              example:
                blocked: 2
                skipped: 1
        '400':
          description: No se ha indicado ninguna dirección.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SimpleError'
              example:
                message: address or addresses is required
        '500':
          $ref: '#/components/responses/InternalError'
components:
  schemas:
    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
  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.

````