Вебхуки — Справочник 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 никогда не возвращается этим эндпоинтом.
Ответы
| Статус | Значение |
|---|---|
200 | OK |
401 | Отсутствуют, некорректны или отклонены учетные данные. |
500 | Ошибка на нашей стороне. |
Поля ответа
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
data | array of object (WebhookEndpoint) | да | |
data[].id | string | да | |
data[].url | string (uri) | да | |
data[].role | enum: primary, backup | да | |
data[].events | array of enum (13 values, WebhookEventType) | null | null означает все события. | |
data[].is_active | boolean | да | |
data[].last_delivery_at | string (date-time) | null | ||
data[].last_delivery_status | integer | null | ||
data[].created_at | string (date-time) | да | |
data[].updated_at | string (date-time) | ||
max_endpoints | integer | да | |
roles | array 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), обязательно.
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
url | string (uri) | да | HTTPS, публично доступный, без учетных данных. |
role | enum: primary, backup | Если опущено, назначается первая свободная роль. | |
events | array of enum (13 values, WebhookEventType) | Список событий для доставки. Если опущено, доставляются все события (рекомендуется: новые типы событий начнут поступать автоматически без перенастройки). Маршрутизируйте по полю event и игнорируйте неизвестные типы. |
Пример тела запроса из контракта (значения для иллюстрации):
{
"url": "https://acme.example/hooks/tenergy",
"role": "primary",
"events": ["order.confirmed","order.failed","balance.credited"]
}
Ответы
| Статус | Значение |
|---|---|
201 | Создан. Поле secret возвращается только в этом ответе. |
400 | Некорректный запрос — невалидный JSON, неизвестное поле или неверный тип. |
401 | Отсутствуют, некорректны или отклонены учетные данные. |
409 | Запрос противоречит текущему состоянию объекта. |
422 | Синтаксически корректный запрос, но действие невозможно. |
500 | Ошибка на нашей стороне. |
Поля ответа
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
id | string | да | |
url | string (uri) | да | |
role | enum: primary, backup | да | |
events | array of enum (13 values, WebhookEventType) | null | null означает все события. | |
is_active | boolean | да | |
last_delivery_at | string (date-time) | null | ||
last_delivery_status | integer | null | ||
created_at | string (date-time) | да | |
updated_at | string (date-time) | ||
secret | string | да | Секрет подписи. Показывается один раз, никогда не возвращается через GET. |
Чтение одного эндпоинта
GET /v1/webhooks/{webhookId} · getWebhook
Аутентификация: API-ключ (HMAC).
Параметры
| Параметр | Где | Тип | Обязательный | Описание |
|---|---|---|---|---|
webhookId | path | string | да |
Ответы
| Статус | Значение |
|---|---|
200 | OK |
401 | Отсутствуют, некорректны или отклонены учетные данные. |
404 | Объект не найден или принадлежит другому аккаунту. |
500 | Ошибка на нашей стороне. |
Поля ответа (WebhookEndpoint)
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
id | string | да | |
url | string (uri) | да | |
role | enum: primary, backup | да | |
events | array of enum (13 values, WebhookEventType) | null | null означает все события. | |
is_active | boolean | да | |
last_delivery_at | string (date-time) | null | ||
last_delivery_status | integer | null | ||
created_at | string (date-time) | да | |
updated_at | string (date-time) |
Редактирование эндпоинта
PATCH /v1/webhooks/{webhookId} · updateWebhook
Аутентификация: API-ключ (HMAC).
Изменение url, events, is_active и/или role. Отправка {"role": "primary"} на резервный эндпоинт меняет роли местами в рамках одной атомарной транзакции. Новый URL проверяется повторно. Флаг is_active: false приостанавливает отправку без удаления конфигурации; пауза основного эндпоинта не переключает трафик автоматически на резервный (для этого используйте смену ролей).
Параметры
| Параметр | Где | Тип | Обязательный | Описание |
|---|---|---|---|---|
webhookId | path | string | да |
Тело запроса
JSON (WebhookPatch), обязательно.
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
url | string (uri) | ||
role | enum: primary, backup | ||
events | array of enum (13 values, WebhookEventType) | null | ||
is_active | boolean |
Ответы
| Статус | Значение |
|---|---|
200 | Обновлен |
400 | Некорректный запрос — невалидный JSON, неизвестное поле или неверный тип. |
401 | Отсутствуют, некорректны или отклонены учетные данные. |
404 | Объект не найден или принадлежит другому аккаунту. |
422 | Синтаксически корректный запрос, но действие невозможно. |
500 | Ошибка на нашей стороне. |
Поля ответа (WebhookEndpoint)
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
id | string | да | |
url | string (uri) | да | |
role | enum: primary, backup | да | |
events | array of enum (13 values, WebhookEventType) | null | null означает все события. | |
is_active | boolean | да | |
last_delivery_at | string (date-time) | null | ||
last_delivery_status | integer | null | ||
created_at | string (date-time) | да | |
updated_at | string (date-time) |
Удаление эндпоинта
DELETE /v1/webhooks/{webhookId} · deleteWebhook
Аутентификация: API-ключ (HMAC).
Полное удаление; освобождает занятую роль. Недоставленные события для данного эндпоинта отбрасываются.
Параметры
| Параметр | Где | Тип | Обязательный | Описание |
|---|---|---|---|---|
webhookId | path | string | да |
Ответы
| Статус | Значение |
|---|---|
204 | Удален. Тело ответа пустое. |
401 | Отсутствуют, некорректны или отклонены учетные данные. |
404 | Объект не найден или принадлежит другому аккаунту. |
500 | Ошибка на нашей стороне. |
Ротация секрета подписи
POST /v1/webhooks/{webhookId}/rotate-secret · rotateWebhookSecret
Аутентификация: API-ключ (HMAC).
Возвращает новый секрет один раз. Он вступает в силу немедленно для последующих доставок без периода пересечения: обновите секрет на стороне вашего сервиса перед вызовом эндпоинта либо будьте готовы к краткосрочным ошибкам проверки подписи повторных отправок. У каждого эндпоинта свой секрет — ротация на основном не затрагивает резервный.
Параметры
| Параметр | Где | Тип | Обязательный | Описание |
|---|---|---|---|---|
webhookId | path | string | да |
Ответы
| Статус | Значение |
|---|---|
200 | Секрет обновлен |
401 | Отсутствуют, некорректны или отклонены учетные данные. |
404 | Объект не найден или принадлежит другому аккаунту. |
500 | Ошибка на нашей стороне. |
Поля ответа
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
id | string | да | |
secret | string | да |
Отправка тестового события
POST /v1/webhooks/{webhookId}/test · testWebhook
Аутентификация: API-ключ (HMAC).
Отправляет синтетическое событие на эндпоинт и возвращает ответ вашего сервера. Полезная нагрузка подписывается стандартной подписью и содержит флаг "test": true на верхнем уровне, поэтому обработчик, проверяющий этот флаг, не станет выполнять рабочие действия.
Тестовые доставки не повторяются при ошибке и не сохраняются в журнале доставок.
Параметры
| Параметр | Где | Тип | Обязательный | Описание |
|---|---|---|---|---|
webhookId | path | string | да |
Тело запроса
JSON.
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
event | enum (13 values, WebhookEventType) | Полный список событий в разделе Вебхуки. Событие balance.credited для депозита также содержит поля asset (TRX|USDT), usdt_amount, rate, rate_source, spread_bps, txid, sender, block_number. |
Ответы
| Статус | Значение |
|---|---|
200 | Доставка выполнена; результат описывает полученный ответ. |
401 | Отсутствуют, некорректны или отклонены учетные данные. |
404 | Объект не найден или принадлежит другому аккаунту. |
500 | Ошибка на нашей стороне. |
Поля ответа
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
delivered | boolean | да | true, если ваш эндпоинт вернул 2xx. |
event | enum (13 values, WebhookEventType) | да | Полный каталог в разделе Вебхуки. |
delivery_id | string | да | |
response_status | integer | null | HTTP-статус вашего сервера; null при ошибке подключения. | |
response_body_excerpt | string | null | Первые 512 байт ответа для отладки. | |
error | string | null | Описание ошибки транспортного уровня при delivered: false. | |
duration_ms | integer |
Журнал доставок одного эндпоинта
GET /v1/webhooks/{webhookId}/deliveries · listWebhookDeliveries
Аутентификация: API-ключ (HMAC).
Все события в очереди на доставку для данного эндпоинта (новые сначала): тип события, число попыток, статус, последний HTTP-код вашего сервера и время следующей попытки. Тестовые доставки не отображаются. Требуется scope webhooks.read или сессия панели с ролью viewer. Чужой эндпоинт возвращает 404.
Параметры
| Параметр | Где | Тип | Обязательный | Описание |
|---|---|---|---|---|
webhookId | path | string | да | |
limit | query | integer | ||
cursor | query | string | Непрозрачный курсор из next_cursor предыдущего ответа. |
Ответы
| Статус | Значение |
|---|---|
200 | OK |
400 | Некорректный запрос — невалидный JSON, неизвестное поле или неверный тип. |
401 | Отсутствуют, некорректны или отклонены учетные данные. |
403 | Аутентифицирован, но данный ключ не имеет прав на это действие. |
404 | Объект не найден или принадлежит другому аккаунту. |
500 | Ошибка на нашей стороне. |
Поля ответа
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
data | array of object (WebhookDelivery) | да | |
data[].id | string | да | |
data[].event_id | string | да | id конверта события — ключ дедупликации, стабильный при повторных попытках. |
data[].event | enum (13 values, WebhookEventType) | да | Полный каталог событий в разделе Вебхуки. |
data[].attempt | integer | да | Количество предпринятых попыток. |
data[].state | enum: pending, delivering, delivered, failed, dead | да | Для failed попытка повторяется в next_attempt_at; для dead повторы прекращены. |
data[].response_status | integer | null | да | HTTP-статус последней попытки; null до отправки или при ошибке сети. |
data[].error | string | null | да | Ошибка сетевого уровня последней попытки. |
data[].next_attempt_at | string (date-time) | null | да | |
data[].delivered_at | string (date-time) | null | да | |
data[].created_at | string (date-time) | да | |
data[].updated_at | string (date-time) | да | |
next_cursor | string | null | да |
Пример ответа 200 из контракта (значения для иллюстрации):
{
"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
}