Меню документации

Вебхуки — Справочник API

Регистрация и тестирование эндпоинтов доставки уведомлений.

МетодПутьОписание
GET/v1/webhooksСписок эндпоинтов доставки
POST/v1/webhooksРегистрация эндпоинта доставки
GET/v1/webhooks/{webhookId}Чтение одного эндпоинта
PATCH/v1/webhooks/{webhookId}Редактирование эндпоинта
DELETE/v1/webhooks/{webhookId}Удаление эндпоинта
POST/v1/webhooks/{webhookId}/rotate-secretРотация секрета подписи
POST/v1/webhooks/{webhookId}/testОтправка тестового события
GET/v1/webhooks/{webhookId}/deliveriesЖурнал доставок одного эндпоинта

Сгенерировано из openapi.yaml во время сборки. Базовый URL https://api.tenergy.me/v1 или https://api-nile.tenergy.me/v1 в сети Nile (Окружения). Каждый запрос ниже подписывается в соответствии с разделом Аутентификация, если в строке Аутентификация не указано иное.

Список эндпоинтов доставки

GET /v1/webhooks · listWebhooks

Аутентификация: API-ключ (HMAC).

Поле secret никогда не возвращается этим эндпоинтом.

Ответы

СтатусЗначение
200OK
401Отсутствуют, некорректны или отклонены учетные данные.
500Ошибка на нашей стороне.

Поля ответа

ПолеТипОбязательноеОписание
dataarray of object (WebhookEndpoint)да
data[].idstringда
data[].urlstring (uri)да
data[].roleenum: primary, backupда
data[].eventsarray of enum (13 values, WebhookEventType) | nullnull означает все события.
data[].is_activebooleanда
data[].last_delivery_atstring (date-time) | null
data[].last_delivery_statusinteger | null
data[].created_atstring (date-time)да
data[].updated_atstring (date-time)
max_endpointsintegerда
rolesarray of enum: primary, backup

Регистрация эндпоинта доставки

POST /v1/webhooks · createWebhook

Аутентификация: API-ключ (HMAC).

Возвращает secret, который показывается ровно один раз. Им подписывается каждое уведомление на этот адрес — сохраните его сразу; при утере выполните ротацию секрета, а не повторную регистрацию.

Не более двух эндпоинтов на аккаунт: один primary (основной) и один backup (резервный). Доставка не является веерной (fan-out) — каждое событие сначала направляется на основной, и переключается на резервный только после исчерпания всех повторных попыток на основном. Первый созданный эндпоинт автоматически становится основным.

Требования к URL, проверяемые при создании и изменении: только https; должен разрешаться в публичный IP-адрес (loopback, RFC 1918, link-local вроде 169.254.169.254 и другие немаршрутизируемые диапазоны отклоняются); запрещены учетные данные в URL; длина не более 2048 символов.

Полный каталог событий, структура полезной нагрузки, схема подписи и расписание повторов описаны в разделе Вебхуки.

Тело запроса

JSON (WebhookRequest), обязательно.

ПолеТипОбязательноеОписание
urlstring (uri)даHTTPS, публично доступный, без учетных данных.
roleenum: primary, backupЕсли опущено, назначается первая свободная роль.
eventsarray of enum (13 values, WebhookEventType)Список событий для доставки. Если опущено, доставляются все события (рекомендуется: новые типы событий начнут поступать автоматически без перенастройки). Маршрутизируйте по полю event и игнорируйте неизвестные типы.

Пример тела запроса из контракта (значения для иллюстрации):

json
{
  "url": "https://acme.example/hooks/tenergy",
  "role": "primary",
  "events": ["order.confirmed","order.failed","balance.credited"]
}

Ответы

СтатусЗначение
201Создан. Поле secret возвращается только в этом ответе.
400Некорректный запрос — невалидный JSON, неизвестное поле или неверный тип.
401Отсутствуют, некорректны или отклонены учетные данные.
409Запрос противоречит текущему состоянию объекта.
422Синтаксически корректный запрос, но действие невозможно.
500Ошибка на нашей стороне.

Поля ответа

ПолеТипОбязательноеОписание
idstringда
urlstring (uri)да
roleenum: primary, backupда
eventsarray of enum (13 values, WebhookEventType) | nullnull означает все события.
is_activebooleanда
last_delivery_atstring (date-time) | null
last_delivery_statusinteger | null
created_atstring (date-time)да
updated_atstring (date-time)
secretstringдаСекрет подписи. Показывается один раз, никогда не возвращается через GET.

Чтение одного эндпоинта

GET /v1/webhooks/{webhookId} · getWebhook

Аутентификация: API-ключ (HMAC).

Параметры

ПараметрГдеТипОбязательныйОписание
webhookIdpathstringда

Ответы

СтатусЗначение
200OK
401Отсутствуют, некорректны или отклонены учетные данные.
404Объект не найден или принадлежит другому аккаунту.
500Ошибка на нашей стороне.

Поля ответа (WebhookEndpoint)

ПолеТипОбязательноеОписание
idstringда
urlstring (uri)да
roleenum: primary, backupда
eventsarray of enum (13 values, WebhookEventType) | nullnull означает все события.
is_activebooleanда
last_delivery_atstring (date-time) | null
last_delivery_statusinteger | null
created_atstring (date-time)да
updated_atstring (date-time)

Редактирование эндпоинта

PATCH /v1/webhooks/{webhookId} · updateWebhook

Аутентификация: API-ключ (HMAC).

Изменение url, events, is_active и/или role. Отправка {"role": "primary"} на резервный эндпоинт меняет роли местами в рамках одной атомарной транзакции. Новый URL проверяется повторно. Флаг is_active: false приостанавливает отправку без удаления конфигурации; пауза основного эндпоинта не переключает трафик автоматически на резервный (для этого используйте смену ролей).

Параметры

ПараметрГдеТипОбязательныйОписание
webhookIdpathstringда

Тело запроса

JSON (WebhookPatch), обязательно.

ПолеТипОбязательноеОписание
urlstring (uri)
roleenum: primary, backup
eventsarray of enum (13 values, WebhookEventType) | null
is_activeboolean

Ответы

СтатусЗначение
200Обновлен
400Некорректный запрос — невалидный JSON, неизвестное поле или неверный тип.
401Отсутствуют, некорректны или отклонены учетные данные.
404Объект не найден или принадлежит другому аккаунту.
422Синтаксически корректный запрос, но действие невозможно.
500Ошибка на нашей стороне.

Поля ответа (WebhookEndpoint)

ПолеТипОбязательноеОписание
idstringда
urlstring (uri)да
roleenum: primary, backupда
eventsarray of enum (13 values, WebhookEventType) | nullnull означает все события.
is_activebooleanда
last_delivery_atstring (date-time) | null
last_delivery_statusinteger | null
created_atstring (date-time)да
updated_atstring (date-time)

Удаление эндпоинта

DELETE /v1/webhooks/{webhookId} · deleteWebhook

Аутентификация: API-ключ (HMAC).

Полное удаление; освобождает занятую роль. Недоставленные события для данного эндпоинта отбрасываются.

Параметры

ПараметрГдеТипОбязательныйОписание
webhookIdpathstringда

Ответы

СтатусЗначение
204Удален. Тело ответа пустое.
401Отсутствуют, некорректны или отклонены учетные данные.
404Объект не найден или принадлежит другому аккаунту.
500Ошибка на нашей стороне.

Ротация секрета подписи

POST /v1/webhooks/{webhookId}/rotate-secret · rotateWebhookSecret

Аутентификация: API-ключ (HMAC).

Возвращает новый секрет один раз. Он вступает в силу немедленно для последующих доставок без периода пересечения: обновите секрет на стороне вашего сервиса перед вызовом эндпоинта либо будьте готовы к краткосрочным ошибкам проверки подписи повторных отправок. У каждого эндпоинта свой секрет — ротация на основном не затрагивает резервный.

Параметры

ПараметрГдеТипОбязательныйОписание
webhookIdpathstringда

Ответы

СтатусЗначение
200Секрет обновлен
401Отсутствуют, некорректны или отклонены учетные данные.
404Объект не найден или принадлежит другому аккаунту.
500Ошибка на нашей стороне.

Поля ответа

ПолеТипОбязательноеОписание
idstringда
secretstringда

Отправка тестового события

POST /v1/webhooks/{webhookId}/test · testWebhook

Аутентификация: API-ключ (HMAC).

Отправляет синтетическое событие на эндпоинт и возвращает ответ вашего сервера. Полезная нагрузка подписывается стандартной подписью и содержит флаг "test": true на верхнем уровне, поэтому обработчик, проверяющий этот флаг, не станет выполнять рабочие действия.

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

Параметры

ПараметрГдеТипОбязательныйОписание
webhookIdpathstringда

Тело запроса

JSON.

ПолеТипОбязательноеОписание
eventenum (13 values, WebhookEventType)Полный список событий в разделе Вебхуки. Событие balance.credited для депозита также содержит поля asset (TRX|USDT), usdt_amount, rate, rate_source, spread_bps, txid, sender, block_number.

Ответы

СтатусЗначение
200Доставка выполнена; результат описывает полученный ответ.
401Отсутствуют, некорректны или отклонены учетные данные.
404Объект не найден или принадлежит другому аккаунту.
500Ошибка на нашей стороне.

Поля ответа

ПолеТипОбязательноеОписание
deliveredbooleanдаtrue, если ваш эндпоинт вернул 2xx.
eventenum (13 values, WebhookEventType)даПолный каталог в разделе Вебхуки.
delivery_idstringда
response_statusinteger | nullHTTP-статус вашего сервера; null при ошибке подключения.
response_body_excerptstring | nullПервые 512 байт ответа для отладки.
errorstring | nullОписание ошибки транспортного уровня при delivered: false.
duration_msinteger

Журнал доставок одного эндпоинта

GET /v1/webhooks/{webhookId}/deliveries · listWebhookDeliveries

Аутентификация: API-ключ (HMAC).

Все события в очереди на доставку для данного эндпоинта (новые сначала): тип события, число попыток, статус, последний HTTP-код вашего сервера и время следующей попытки. Тестовые доставки не отображаются. Требуется scope webhooks.read или сессия панели с ролью viewer. Чужой эндпоинт возвращает 404.

Параметры

ПараметрГдеТипОбязательныйОписание
webhookIdpathstringда
limitqueryinteger
cursorquerystringНепрозрачный курсор из next_cursor предыдущего ответа.

Ответы

СтатусЗначение
200OK
400Некорректный запрос — невалидный JSON, неизвестное поле или неверный тип.
401Отсутствуют, некорректны или отклонены учетные данные.
403Аутентифицирован, но данный ключ не имеет прав на это действие.
404Объект не найден или принадлежит другому аккаунту.
500Ошибка на нашей стороне.

Поля ответа

ПолеТипОбязательноеОписание
dataarray of object (WebhookDelivery)да
data[].idstringда
data[].event_idstringдаid конверта события — ключ дедупликации, стабильный при повторных попытках.
data[].eventenum (13 values, WebhookEventType)даПолный каталог событий в разделе Вебхуки.
data[].attemptintegerдаКоличество предпринятых попыток.
data[].stateenum: pending, delivering, delivered, failed, deadдаДля failed попытка повторяется в next_attempt_at; для dead повторы прекращены.
data[].response_statusinteger | nullдаHTTP-статус последней попытки; null до отправки или при ошибке сети.
data[].errorstring | nullдаОшибка сетевого уровня последней попытки.
data[].next_attempt_atstring (date-time) | nullда
data[].delivered_atstring (date-time) | nullда
data[].created_atstring (date-time)да
data[].updated_atstring (date-time)да
next_cursorstring | nullда

Пример ответа 200 из контракта (значения для иллюстрации):

json
{
  "data": [
    {
      "id": "dlv_01K5YA1B2C3D4E5F6G7H8J9K0M",
      "event_id": "evt_01K5YA1B2C3D4E5F6G7H8J9K0N",
      "event": "order.confirmed",
      "attempt": 2,
      "state": "failed",
      "response_status": 502,
      "error": null,
      "next_attempt_at": "2026-09-25T10:31:00.000Z",
      "delivered_at": null,
      "created_at": "2026-09-25T10:30:00.000Z",
      "updated_at": "2026-09-25T10:30:30.000Z"
    }
  ],
  "next_cursor": null
}

    ↑ ↓ — выбрать · Enter — открыть · Esc — закрыть