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

# Ejemplos de webhook para cambios en los atributos de contactos

> Gestiona eventos de cambio en los atributos de contactos.

<Note>Para consultar el catálogo exhaustivo derivado del esquema, consulta [todos los ejemplos](/es/api-reference/guides/examples/webhook-examples/webhook-payload-examples).</Note>

## Qué es

Gestiona eventos de cambio en los atributos de contactos.

## Antes de comenzar

* Crea un endpoint HTTPS público en tu aplicación.
* Configura un endpoint de webhook de YCloud para los tipos de evento que necesites.
* Almacena el secreto de firma del endpoint de forma segura.
* Haz que el procesamiento de eventos sea idempotente.

## Cómo funciona

YCloud envía una solicitud HTTP `POST` cuando ocurre el evento. Verifica la firma, registra el evento de forma duradera, devuelve una respuesta `2xx` y procesa el trabajo lento de forma asíncrona.

## Solicitud

Los escenarios a continuación muestran solicitudes enviadas a tu URL de webhook. Trata el evento `id` como el identificador de entrega y utiliza `type` para enrutar la carga útil.

## Respuesta

Devuelve un estado `2xx` tras aceptar el evento.

```http theme={"theme":{"light":"github-light","dark":"github-dark"}}
HTTP/1.1 200 OK
```

<Note>Para la configuración del endpoint, la validación de firmas y el comportamiento de reintentos, consulta [Configurar webhooks](/es/api-reference/guides/api-fundamentals/configure-webhooks).</Note>

Ocurre cuando se modifican los atributos de un contacto. La carga útil del webhook contiene información sobre qué atributos cambiaron, incluidos sus valores anteriores y nuevos.

## Ejemplo de cambio de etiquetas (Añadir etiquetas)

### Solicitud

```json theme={"theme":{"light":"github-light","dark":"github-dark"}}
{
  "id": "evt_1234567892",
  "type": "contact.attributes_changed",
  "apiVersion": "v2",
  "createTime": "2024-01-01T12:00:00.000Z",
  "contactAttributesChanged": {
    "id": "1824266594102064128",
    "updateTime": "2024-01-01T12:00:00.000Z",
    "changedAttributes": {
      "tags": {
        "oldValue": ["premium", "newsletter"],
        "newValue": ["premium", "newsletter", "vip"],
        "extra": [
          {
            "action": "ADDED",
            "id": "686dd294334be8606a5bf312",
            "value": "vip"
          }
        ]
      }
    }
  }
}
```

### Respuesta

Confirma la recepción tras aceptar el evento de forma duradera.

```http theme={"theme":{"light":"github-light","dark":"github-dark"}}
HTTP/1.1 200 OK
```

### Explicación

Enruta el evento mediante `type`, elimínalo de forma duplicada mediante `id` y traslada el trabajo lento o propenso a errores a un procesador asíncrono.

## Ejemplo de cambio de etiquetas (Eliminar etiquetas)

### Solicitud

```json theme={"theme":{"light":"github-light","dark":"github-dark"}}
{
  "id": "evt_1234567893",
  "type": "contact.attributes_changed",
  "apiVersion": "v2",
  "createTime": "2024-01-01T12:00:00.000Z",
  "contactAttributesChanged": {
    "id": "1824266594102064128",
    "updateTime": "2024-01-01T12:00:00.000Z",
    "changedAttributes": {
      "tags": {
        "oldValue": ["premium", "newsletter", "vip"],
        "newValue": ["premium", "newsletter"],
        "extra": [
          {
            "action": "REMOVED",
            "id": "686dd294334be8606a5bf312",
            "value": "vip"
          }
        ]
      }
    }
  }
}
```

### Respuesta

Confirma la recepción tras aceptar el evento de forma duradera.

```http theme={"theme":{"light":"github-light","dark":"github-dark"}}
HTTP/1.1 200 OK
```

### Explicación

Enruta el evento mediante `type`, elimínalo de forma duplicada mediante `id` y traslada el trabajo lento o propenso a errores a un procesador asíncrono.

## Ejemplo de cambio

### Solicitud

```json theme={"theme":{"light":"github-light","dark":"github-dark"}}
{
  "id": "evt_1234567900",
  "type": "contact.attributes_changed",
  "apiVersion": "v2",
  "createTime": "2024-01-01T12:00:00.000Z",
  "contactAttributesChanged": {
    "id": "1824266594102064128",
    "updateTime": "2024-01-01T12:00:00.000Z",
    "changedAttributes": {
      "waba_id": {
        "oldValue": "waba_old_123456",
        "newValue": "waba_new_789012",
        "extra": [
          {
            "action": "CHANGED"
          }
        ]
      }
    }
  }
}
```

### Respuesta

Confirma la recepción tras aceptar el evento de forma duradera.

```http theme={"theme":{"light":"github-light","dark":"github-dark"}}
HTTP/1.1 200 OK
```

### Explicación

* **Estructura correcta**: El objeto `contactAttributesChanged` contiene tres campos obligatorios: `id`, `updateTime` y `changedAttributes`.
* **Atributos modificados**: El campo `changedAttributes` es un objeto donde cada clave es el nombre del atributo y el valor es un objeto `ContactAttributeChange`.
* **Configuración de propiedades del evento**: Al habilitar los eventos `contact.attributes_changed`, debes configurar el campo `eventProperties` en tu endpoint de webhook para especificar qué atributos deben incluirse en la carga útil del webhook.
* **Tipos de atributos**: Los campos `oldValue` y `newValue` pueden contener diferentes tipos de datos:
  * String: valores de texto
  * Number: valores numéricos (enteros o decimales)
  * Boolean: valores true/false
  * Array: arrays de cadenas de texto
  * Object: objetos complejos con propiedades anidadas
  * Null: cuando un atributo se elimina o no está establecido
* **Cambios en etiquetas**: Para los atributos de tipo etiqueta, el campo `extra` proporciona información detallada sobre qué etiquetas se agregaron o eliminaron, incluidos sus ID y valores.
* **Valores nulos**: Cuando un atributo se elimina o se establece en null, el valor de `newValue` será `null`. Cuando un atributo se agrega como nuevo, `oldValue` puede ser `null`.
* **Atributos personalizados**: Los atributos personalizados se incluyen en el objeto `changedAttributes` al igual que los atributos estándar, utilizando sus claves personalizadas como nombres de atributo.
* **Detección de cambios**: Solo los atributos que realmente hayan cambiado se incluyen en el objeto `changedAttributes`.
* **Campo extra**: El campo `extra` es opcional y se utiliza principalmente para cambios relacionados con etiquetas para proporcionar contexto adicional sobre las acciones específicas realizadas.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.