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

# Примеры Webhook для изменения атрибутов контакта

> Обработка событий изменения атрибутов контакта.

<Note>Полный каталог, сформированный на основе схемы, см. в разделе [все примеры](/ru/api-reference/guides/examples/webhook-examples/webhook-payload-examples).</Note>

## Что это такое

Обработка событий изменения атрибутов контакта.

## Перед началом работы

* Создайте публичный HTTPS-эндпоинт в своем приложении.
* Настройте эндпоинт Webhook YCloud для необходимых типов событий.
* Надежно сохраните секрет подписи эндпоинта.
* Обеспечьте идемпотентность обработки событий.

## Как это работает

YCloud отправляет HTTP-запрос `POST` при возникновении события. Проверьте подпись, надежно сохраните событие, верните ответ `2xx` и выполняйте длительные задачи асинхронно.

## Запрос

Ниже приведены сценарии запросов, отправляемых на ваш URL Webhook. Используйте `id` события в качестве идентификатора доставки, а `type` — для маршрутизации полезной нагрузки.

## Ответ

Возвращайте статус `2xx` после успешного приема события.

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

<Note>Сведения о настройке эндпоинта, проверке подписи и логике повторных попыток см. в разделе [Настройка Webhook](/ru/api-reference/guides/api-fundamentals/configure-webhooks).</Note>

Происходит при изменении атрибутов контакта. Полезная нагрузка Webhook содержит информацию об измененных атрибутах, включая их старые и новые значения.

## Пример изменения тегов (добавление тегов)

### Запрос

```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"
          }
        ]
      }
    }
  }
}
```

### Ответ

Подтвердите доставку после надежного сохранения события.

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

### Пояснение

Маршрутизируйте событие по `type`, выполняйте дедупликацию по `id` и передавайте медленные или потенциально сбойные задачи в асинхронный обработчик.

## Пример изменения тегов (удаление тегов)

### Запрос

```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"
          }
        ]
      }
    }
  }
}
```

### Ответ

Подтвердите доставку после надежного сохранения события.

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

### Пояснение

Маршрутизируйте событие по `type`, выполняйте дедупликацию по `id` и передавайте медленные или потенциально сбойные задачи в асинхронный обработчик.

## Пример изменения

### Запрос

```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"
          }
        ]
      }
    }
  }
}
```

### Ответ

Подтвердите доставку после надежного сохранения события.

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

### Пояснение

* **Корректная структура**: объект `contactAttributesChanged` содержит три обязательных поля: `id`, `updateTime` и `changedAttributes`.
* **Измененные атрибуты**: поле `changedAttributes` представляет собой объект, где каждый ключ — это имя атрибута, а значение — объект `ContactAttributeChange`.
* **Конфигурация свойств события**: при включении событий `contact.attributes_changed` необходимо настроить поле `eventProperties` в вашем эндпоинте Webhook, указав, какие атрибуты должны включаться в полезную нагрузку Webhook.
* **Типы атрибутов**: поля `oldValue` и `newValue` могут содержать различные типы данных:
  * String: текстовые значения
  * Number: числовые значения (целые или десятичные)
  * Boolean: логические значения (true/false)
  * Array: массивы строк
  * Object: сложные объекты с вложенными свойствами
  * Null: когда атрибут удален или сброшен
* **Изменения тегов**: для атрибутов тегов поле `extra` предоставляет подробную информацию о добавленных или удаленных тегах, включая их идентификаторы и значения.
* **Значения Null**: когда атрибут удаляется или ему присваивается значение null, поле `newValue` будет иметь значение `null`. При добавлении нового атрибута поле `oldValue` может быть `null`.
* **Пользовательские атрибуты**: пользовательские атрибуты включаются в объект `changedAttributes` точно так же, как и стандартные атрибуты, при этом в качестве имен атрибутов используются их пользовательские ключи.
* **Обнаружение изменений**: в объект `changedAttributes` включаются только те атрибуты, которые действительно изменились.
* **Поле Extra**: поле `extra` является необязательным и используется преимущественно при изменениях тегов для предоставления дополнительного контекста о выполненных действиях.


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