/api/v1/vpn/webhookСекрет подписи возьмите в кабинете (раздел «API»). Проверяйте подпись:
X-Signature: sha256=hex(HMAC-SHA256(secret, raw_body)), сравнение
constant-time по сырым байтам тела до разбора JSON.
curl -X PUT https://api.relayhub.surf/api/v1/vpn/webhook \
-H "Authorization: Bearer <YOUR_API_KEY>"{
"success": true,
"url": "https://example.com/vpn-webhook",
"events": [
"deposit.credited",
"subscription.expired",
"subscription.expires_in_24h"
],
"is_active": true,
"secret_set": true,
"all_events": [
"subscription.created",
"subscription.renewed",
"subscription.upgraded",
"subscription.traffic_purchased",
"subscription.frozen",
"subscription.unfrozen",
"subscription.expires_in_72h",
"subscription.expires_in_48h",
"subscription.expires_in_24h",
"subscription.expired",
"subscription.traffic_threshold",
"deposit.credited"
],
"last_success_at": "2026-09-02T12:07:01Z",
"consecutive_failures": 0
}Заголовок Authorization: Bearer <ключ> на каждом запросе. Ключ один на аккаунт, выпускается в кабинете партнёра и показывается один раз. Он тратит депозит: держите его на сервере.
urlstring | nullнеобязательноhttps-адрес. null выключает доставку, секрет сохраняется.
eventsstring[] | nullнеобязательноПодмножество событий. null или пустой список = все, включая будущие.
successbooleanобязательноurlstringобязательноeventsarrayобязательноis_activebooleanобязательноsecret_setbooleanобязательноall_eventsarrayобязательноlast_success_atstringобязательноconsecutive_failuresintegerобязательно401unauthorized: Неверный или отсутствующий API-ключ403api_disabled: Доступ к API для этого аккаунта закрыт422validation_error: Неверные параметры запроса429rate_limited: Слишком много запросов503upstream_unavailable: Поставщик VPN временно недоступенcurl -X PUT https://api.relayhub.surf/api/v1/vpn/webhook \
-H "Authorization: Bearer <YOUR_API_KEY>"{
"success": true,
"url": "https://example.com/vpn-webhook",
"events": [
"deposit.credited",
"subscription.expired",
"subscription.expires_in_24h"
],
"is_active": true,
"secret_set": true,
"all_events": [
"subscription.created",
"subscription.renewed",
"subscription.upgraded",
"subscription.traffic_purchased",
"subscription.frozen",
"subscription.unfrozen",
"subscription.expires_in_72h",
"subscription.expires_in_48h",
"subscription.expires_in_24h",
"subscription.expired",
"subscription.traffic_threshold",
"deposit.credited"
],
"last_success_at": "2026-09-02T12:07:01Z",
"consecutive_failures": 0
}