Перейти к содержимому
API-документация

Создать подписку на вебхуки

POST/api/partner/v1/webhooks
Scope
cards:write

Регистрирует HTTPS-адрес и возвращает секрет подписи.

Секрет показывается ОДИН раз. Каждая доставка несёт X-Timestamp и X-Signature, где подпись — hex(HMAC-SHA256(secret, timestamp \n POST \n path \n body)), та же конструкция, которой вы подписываете запросы к нам, так что одна реализация покрывает оба направления. path — всё после хоста, включая query-строку: адрес подписки с ?tenant=42 подписывается вместе с ним.

Ответьте 2xx, чтобы подтвердить доставку. Любой другой ответ повторяется с паузами 1, 5, 15, 30 и 60 минут, после чего доставка прекращается.

Тело запроса

ПолеТипОбяз.Описание
event_typesarray<string>нетНе передавайте или оставьте пустым, чтобы получать все типы. Неизвестный тип отклоняется, а не тихо никогда не доставляется.
urlstringдаHTTPS-адрес. Обычный HTTP отклоняется: тело содержит идентификаторы операций и карт, а подпись доказывает, кто отправил, но не защищает от того, кто читает.

Пример запроса

BODY='{"url":"https://partner.example.com/hooks/cards","event_types":["card.issued","card.issue_failed","card.topped_up","card.topup_failed","operation.needs_review"]}'
TS=$(date +%s)
SIG=$(printf '%s\n%s\n%s\n%s' "$TS" "POST" "/api/partner/v1/webhooks" "$BODY" \
  | openssl dgst -sha256 -hmac "$PP_SECRET" -hex | awk '{print $NF}')

curl -sS -X POST "https://api.plativputi.com/api/partner/v1/webhooks" \
  -H "X-Key-Id: $PP_KEY_ID" \
  -H "X-Timestamp: $TS" \
  -H "X-Signature: $SIG" \
  -H "Content-Type: application/json" \
  -d "$BODY"
const res = await pp("POST", "/webhooks", {
  "url": "https://partner.example.com/hooks/cards",
  "event_types": [
    "card.issued",
    "card.issue_failed",
    "card.topped_up",
    "card.topup_failed",
    "operation.needs_review"
  ]
});
res = pp("POST", "/webhooks", body={
    "url": "https://partner.example.com/hooks/cards",
    "event_types": [
        "card.issued",
        "card.issue_failed",
        "card.topped_up",
        "card.topup_failed",
        "operation.needs_review",
    ],
})
$res = pp('POST', '/webhooks', [
    'url' => 'https://partner.example.com/hooks/cards',
    'event_types' => [
        'card.issued',
        'card.issue_failed',
        'card.topped_up',
        'card.topup_failed',
        'operation.needs_review',
    ],
]);

pp() — функция-обёртка с подписью из раздела Аутентификация и подпись.

Ответ

201 Created — CreatedWebhookDTO

ПолеТипОбяз.Описание
secretstringдаСекрет подписи доставок. Показывается один раз — сохраните сразу
warningstringдаНапоминание, что секрет больше не покажут
webhookWebhookDTOдаСозданная подписка
webhook.created_atstringдаКогда подписка создана, UTC
webhook.event_typesarray<string>даПусто — все типы событий
webhook.idstringдаИдентификатор подписки
webhook.is_activebooleanдаИдут ли доставки
webhook.secret_last4stringдаПоследние четыре символа секрета подписи
webhook.urlstringдаАдрес доставки

Примеры ответа

{
  "webhook": {
    "id": "5b6c7d8e-9f0a-4b1c-8d2e-3f4a5b6c7d8e",
    "url": "https://partner.example.com/hooks/cards",
    "event_types": [
      "card.issued",
      "card.issue_failed",
      "card.topped_up",
      "card.topup_failed",
      "operation.needs_review"
    ],
    "is_active": true,
    "secret_last4": "9f3a",
    "created_at": "2026-10-07T09:00:00Z"
  },
  "secret": "q3Vx8LmT2bR7kJ0pWz5NcY1hFd6sGa4EiUo9Pn_9f3a",
  "warning": "Секрет показывается один раз. Сохраните его сейчас — восстановить нельзя, только создать новую подписку."
}
{
  "title": "Bad Request",
  "status": 400,
  "detail": "validation: url must use https",
  "errors": [
    {
      "message": "validation_failed",
      "location": "error.code",
      "value": "validation_failed"
    }
  ]
}

Ошибки

HTTPКодКогда
400validation_failedАдрес не HTTPS или в event_types неизвестный тип события.

Плюс общие ошибки подписи и лимитов — см. Ошибки.