> For the complete documentation index, see [llms.txt](https://docs.esimpay.net/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.esimpay.net/webhook/obrabotka-notifikacii.md).

# Обработка нотификаций

eSIMPAY отправляет webhook методом POST с JSON-телом.

&#x20;Укажите URL вашего сервера в eSIMPAY. Разрешены только HTTPS-адреса.&#x20;

{% hint style="info" %}
Запросы содержат заголовок `CF-ACCESS-SIGN`. Перед обработкой проверяйте подпись (см. раздел «Проверка подписи»).
{% endhint %}

#### Типы уведомлений

| Тип                | Когда отправляется                                                                                                                          |
| ------------------ | ------------------------------------------------------------------------------------------------------------------------------------------- |
| eSIM Status        | После установки eSIM-профиля на устройство                                                                                                  |
| Balance Activation | При активации баланса данных (особенно при FIRST\_USE / ON\_DEMAND)                                                                         |
| Low Balance Alert  | Когда остаток данных опускается ниже 100 MB                                                                                                 |
| Order Status       | Уведомление о статусе заказа (тело как при успешном получении статуса заказа). URL также можно передать в поле callback при создании заказа |

#### Проверка подписи

Подпись в заголовке CF-ACCESS-SIGN — это Base64 от HMAC-SHA256(api\_secret, raw\_body), где raw\_body — сырое тело запроса (bytes) до парсинга JSON.

**api\_secret** — ваш API SECRET, выданный при подключении.

```python
import hmac, hashlib, base64

def verify_webhook(raw_body: bytes, signature_header: str, api_secret: str) -> bool:
    """
    raw_body:         сырое тело запроса (bytes), ДО парсинга JSON.
    signature_header: заголовок CF-ACCESS-SIGN.
    api_secret:       ваш API SECRET, выданный при подключении.
    """
    if not signature_header:
        return False
    digest = hmac.new(api_secret.encode('utf-8'), raw_body, hashlib.sha256).digest()
    expected = base64.b64encode(digest).decode('utf-8')
    return hmac.compare_digest(expected, signature_header)
```
