> ## Documentation Index
> Fetch the complete documentation index at: https://oblodai.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Тестовые вебхуки

Набор методов, чтобы отправить пробное уведомление на ваш URL и проверить приёмник, не дожидаясь
реальной оплаты.

**Аутентификация:** обязательна.

<Note>
  Примеры используют хелпер `call()` и переменные `$SECRET`/`$PUBLIC_ID` — их определение см. в
  [Как подписать запрос](/guides/signing-requests). Проще не писать подпись руками, а взять
  [SDK](/sdk/overview).
</Note>

<Warning>
  **Пробные тела содержат `"is_test": true`.** Отправка на явный `url`/`url_callback` НЕ
  подписывается (к произвольному URL не привязан секрет). Исключение —
  `/v1/payment/testing-webhook` **без `url`**: пробное тело уходит на зарегистрированный endpoint
  проекта и подписано его настоящим секретом (стандартные заголовки `X-Webhook-*`), так что можно
  проверить и свою [проверку подписи](/reference/webhook-object).
</Warning>

***

## POST /v1/payment/testing-webhook

Синхронно шлёт пробное тело и возвращает HTTP‑код и время ответа вашего эндпоинта.

<ParamField body="url" type="string">
  Куда отправить пробное тело. **Не передан** — доставка уходит на зарегистрированный
  [endpoint проекта](/reference/webhooks-register), подписанная его секретом; если endpoint не
  зарегистрирован, вернётся ошибка `webhook.no_endpoint`.
</ParamField>

<ParamField body="status" type="string">
  Статус в теле. По умолчанию `paid`.
</ParamField>

Ответ:

```json theme={null}
{ "state": 0, "result": { "result": true, "url": "https://shop.example/hook", "signed": true, "duration_ms": 42, "status_code": 200 } }
```

Если ваш эндпоинт не ответил, метод возвращает не ошибку, а результат пробы:

```json theme={null}
{ "state": 0, "result": { "result": false, "url": "https://shop.example/hook", "signed": true, "duration_ms": 10004, "error": "..." } }
```

***

## POST /v1/test-webhook/payment · /wallet · /payout

Пробный вебхук заданного типа на `url_callback`.

<ParamField body="url_callback" type="string" required>
  Куда отправить пробное тело.
</ParamField>

<ParamField body="currency" type="string">
  Валюта в теле.
</ParamField>

<ParamField body="network" type="string">
  Сеть в теле.
</ParamField>

<ParamField body="uuid" type="string">
  UUID объекта (платежа, кошелька или выплаты), который попадёт в пробное тело события.
</ParamField>

<ParamField body="order_id" type="string">
  Ваш `order_id`, который попадёт в пробное тело события.
</ParamField>

<ParamField body="status" type="string">
  Статус в теле.
</ParamField>

Ответ:

```json theme={null}
{ "state": 0, "result": { "result": true, "status_code": 200 } }
```

`status_code` — HTTP‑код, которым ответил ваш эндпоинт.

***

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

<CodeGroup>
  ```bash cURL wrap theme={null}
  BODY='{"url_callback":"https://shop.example/oblodai/callback","status":"paid","currency":"USDT","network":"tron"}'
  TS=$(date +%s)
  SIG=$(printf '%s\n%s\n%s\n%s' "$TS" 'POST' '/v1/test-webhook/payment' "$BODY" \
    | openssl dgst -sha256 -hmac "$SECRET" -hex | sed 's/^.* //')
  curl -s https://api.oblodai.com/v1/test-webhook/payment \
    -X POST -H 'Content-Type: application/json' \
    -H "X-Public-Id: $PUBLIC_ID" -H "X-Timestamp: $TS" -H "X-Signature: $SIG" \
    -d "$BODY"
  ```

  ```python Python theme={null}
  call("/v1/test-webhook/payment", {
      "url_callback": "https://shop.example/oblodai/callback",
      "status": "paid", "currency": "USDT", "network": "tron",
  })
  ```

  ```js Node.js theme={null}
  await call("/v1/test-webhook/payment", {
    url_callback: "https://shop.example/oblodai/callback",
    status: "paid", currency: "USDT", network: "tron",
  });
  ```
</CodeGroup>

***

## Коды ошибок

| Код                       | Значение                             |
| ------------------------- | ------------------------------------ |
| `400 webhook.no_url`      | Не передан `url` / `url_callback`.   |
| `400 webhook.bad_url`     | Некорректный URL.                    |
| `503 webhook.test_failed` | Ваш эндпоинт не принял пробное тело. |

***

## Нюансы

* Пробные тела **не подписаны** и помечены `"is_test": true`. Ваш код проверки подписи должен уметь
  отличать их (или тестируйте подпись отдельно на боевых событиях).
* `testing-webhook` — легаси‑форма; для новых интеграций предпочитайте `test-webhook/*`.

***

## Связанные страницы

<CardGroup cols={2}>
  <Card title="Объект вебхука и проверка подписи" href="/reference/webhook-object" icon="arrow-right" horizontal />

  <Card title="Отладка вебхуков" href="/guides/webhooks-debug" icon="arrow-right" horizontal />
</CardGroup>
