Yandex Metrika

Manual webhook test events

Описание

Общее описание функционала

Ручные тестовые вебхуки позволяют отправить HTTP-запрос на ваш HTTP/HTTPS-туннель или облачный webhook inbox прямо из инспектора HTTP-трафика, без вызова из внешнего провайдера. Запрос всегда идёт только на текущую цель выбранного эндпоинта — абсолютные URL и сторонние хосты недоступны.

Вы можете собрать запрос вручную, выбрать встроенный пример, сохранить шаблон для повторного запуска или создать шаблон из уже зафиксированного события инспектора с маскировкой чувствительных полей. Каждая успешная отправка или запуск шаблона создаёт новое событие в инспекторе с тегом webhook-test-event, чтобы результат сразу открыть в деталях.

Функция доступна на тарифах с возможностью webhook-test-events (как правило, на оплачиваемых планах). Панель тестирования отображается только на странице HTTP-инспектора HTTP/HTTPS-туннеля или inbox, не на TCP/UDP-инспекторах.

В первой версии библиотека шаблонов личная: шаблоны принадлежат вашему аккаунту и одному эндпоинту (tunnel_id). Общие библиотеки команды, сред или организации пока недоступны. Шаблоны и события других пользователей через API не видны — запрос возвращает отказ «не найдено».

Как пользователь может использовать

  • Разработчик проверяет обработчик вебхука на локальном сервисе: подключает клиент туннеля, открывает инспектор, отправляет POST с JSON и сравнивает код ответа downstream с ожиданием.
  • Интегратор тестирует webhook inbox в режиме «только хранение»: отправляет ручной запрос и убеждается, что событие сохранено в инспекторе без доставки на локальный сервис.
  • QA воспроизводит сценарий с query-параметрами и заголовками, сохраняет шаблон «успешный платёж» и запускает его перед каждым релизом.
  • Пользователь находит неудачный входящий вебхук в инспекторе, нажимает «Сохранить как шаблон», получает очищенную копию с перечислением замаскированных полей и правит шаблон перед повторными прогонами.
  • Разработчик выбирает встроенный пример «Invalid JSON» или «Missing field JSON», отправляет его на staging через туннель и проверяет валидацию на бэкенде.
  • Команда документирует ожидаемый исход сценария через поле «пример результата» (success, failure, unspecified) и теги в библиотеке шаблонов.
  • Пользователь с несколькими эндпоинтами держит отдельные библиотеки шаблонов: каждый шаблон принадлежит одному tunnel_id и не переносится на другой URL автоматически.
  • После исправления кода пользователь запускает сохранённый шаблон кнопкой Run и сразу видит новое событие в деталях инспектора — без ручного поиска в списке.
  • Пользователь сравняет ручную отправку с повтором запроса (Replay): replay воспроизводит уже зафиксированное событие, а ручной тест создаёт новый синтетический запрос с нуля или из шаблона.
  • Разработчик через REST API автоматизирует прогон набора шаблонов в CI, используя POST /api/webhook-test-events/templates/<id>/run с сессией дашборда или токеном.
  • Пользователь на тарифе без функции видит скрытую или неактивную панель; при попытке вызова API получает отказ с объяснением по тарифу (см. ошибки).
  • Оператор поддержки просит клиента отправить тест из инспектора конкретного inbox и проверяет event_id в ответе панели, чтобы сопоставить с записью в журнале.
  • Пользователь готовит библиотеку шаблонов, пока клиент туннеля ещё не подключён: сохраняет запросы на своём эндпоинте и запускает их после появления доставки.
  • Пользователь переключается между вкладками Тест, События и Настройки в инспекторе, не теряя несохранённые поля ручного запроса на вкладке Тест.
  • Пользователь редактирует поля вручную и выбирает встроенный пример — интерфейс спрашивает подтверждение, прежде чем заменить уже изменённый запрос.
  • Владелец webhook inbox открывает инспектор эндпоинта, а настройки inbox (режим доставки, состояние) переходит через пункт Webhook inbox в боковом меню дашборда.

Как это реализовано в сервисе

1. Вы открываете /dashboard/tunnels/<tunnel_id>/inspector для HTTP/HTTPS-туннеля или webhook inbox. Для HTTP-эндпоинтов инспектор разделён на вкладки Тест, События и Настройки; блок ручного тестирования находится на Тест. Несохранённый запрос остаётся в форме при переключении вкладок. Если тариф и тип эндпоинта позволяют, панель тестирования доступна для отправки и шаблонов.

2. Запрос (ручной, из встроенного примера или из сохранённого шаблона) проходит проверку входа, доступа к эндпоинту, лимита частоты HTTP-запросов и ограничения размера тела (32 КБ). Чувствительные заголовки и поля в query/JSON маскируются до сохранения шаблона или доставки.

3. Сервис определяет текущую цель эндпоинта (локальный адрес туннеля, режим inbox или пересылка) и отправляет запрос только через этот канал — без подстановки адреса из шаблона, если эндпоинт уже изменён или удалён.

4. Для inbox в режиме «только хранение» или при недоступной доставке создаётся синтетическое событие с ответом «сохранено»; для активного туннеля с подключённым клиентом фиксируются реальный код и тело ответа downstream.

5. Событие записывается в инспектор синхронно: API возвращает event_id только после того, как записи доступны через GET /api/v1/inspector/events/<event_id>. Интерфейс открывает это событие в деталях.

6. Шаблоны хранятся в аккаунте (до 100 на пользователя), с версией для безопасного редактирования: при конфликте версий клиент должен перечитать шаблон перед сохранением. Создание и обновление шаблона требуют только доступного вам tunnel_id; неактивный туннель или отключённый клиент не мешают сохранить сценарий — доставка проверяется только при Отправить тест и Run. Допустимые HTTP-методы: GET, POST, PUT, PATCH, DELETE, HEAD, OPTIONS. Удаление туннеля или inbox удаляет связанные шаблоны.

Подробные контракты API, коды ошибок и ограничения — в справочнике API, ошибках и известных ограничениях. Пользовательские истории — в отдельном документе.

Справочник API

Обзор

Ручные тестовые вебхуки и библиотека шаблонов доступны через REST API с префиксом /api/webhook-test-events. Все методы требуют авторизованной сессии дашборда (кука) или эквивалентной аутентификации.

Мутации из браузера с сессионной кукой дополнительно требуют заголовок X-CSRF-Token с значением из куки csrf_token (см. защита CSRF).

| Метод | Путь | Назначение |

| --- | --- | --- |

| GET | /api/webhook-test-events/builtins | Список встроенных неизменяемых примеров запросов |

| GET | /api/webhook-test-events/templates?tunnel_id=<id> | Список сохранённых шаблонов для эндпоинта |

| GET | /api/webhook-test-events/templates/<id> | Один сохранённый шаблон |

| POST | /api/webhook-test-events/templates | Создать шаблон из редактора |

| POST | /api/webhook-test-events/templates/from-event | Создать шаблон из события инспектора |

| PATCH | /api/webhook-test-events/templates/<id> | Обновить шаблон (с ожидаемой версией) |

| DELETE | /api/webhook-test-events/templates/<id> | Удалить шаблон |

| POST | /api/webhook-test-events/send | Отправить один ручной запрос |

| POST | /api/webhook-test-events/templates/<id>/run | Выполнить сохранённый шаблон |

Поддерживаются только HTTP/HTTPS-эндпоинты (HTTP-туннель или webhook inbox). TCP/UDP-туннели возвращают отказ.

Сохранение шаблонов и доставка: POST /templates, POST /templates/from-event и PATCH /templates/<id> проверяют владение эндпоинтом, но не требуют активной доставки (подключённого клиента или доступного режима inbox). POST /send и POST /templates/<id>/run проверяют текущую цель и при недоступности возвращают 409 с code: "endpoint_unavailable".

Область видимости: список и чтение шаблонов, событий и эндпоинтов ограничены вашим аккаунтом. Чужой или недоступный идентификатор возвращает 404 с code: "not_found" — без подтверждения существования ресурса.

---

Общая модель запроса (request)

Используется в создании шаблона, ручной отправке и в поле request шаблона.

| Поле | Тип | Описание |

| --- | --- | --- |

| method | строка | HTTP-метод: GET, POST, PUT, PATCH, DELETE, HEAD или OPTIONS (нормализуется к верхнему регистру). Другие методы (CONNECT, TRACE и т. п.) отклоняются при создании, обновлении и отправке |

| path | строка | Путь относительно эндпоинта, начинается с /; не абсолютный URL |

| raw_query | строка | Необязательная query-строка без ведущего ? |

| headers | массив | Элементы { "name", "value" }; запрещённые заголовки удаляются |

| content_type | строка | Необязательный Content-Type |

| body | строка | Необязательное тело; максимум 32 КБ после декодирования |

| body_encoding | строка | Кодирование поля body: text (по умолчанию, UTF-8 текст) или base64 (двоичные или не-UTF-8 данные). Неверная base64 → 400 invalid_request |

---

GET /api/webhook-test-events/builtins

Возвращает четыре встроенные примеры: Empty POST, JSON event, Invalid JSON, Missing field JSON. Их не редактируют и не удаляют через API.

Успешный ответ 200

| Поле | Описание |

| --- | --- |

| builtins | Массив объектов с полями id, name, description, request |

---

GET /api/webhook-test-events/templates

Список сохранённых шаблонов только для одного эндпоинта. Параметр tunnel_id обязателен; без него или с недоступным эндпоинтом запрос отклоняется.

Параметры запроса

| Параметр | Обязательность | Описание |

| --- | --- | --- |

| tunnel_id | да | Идентификатор HTTP/HTTPS-туннеля или webhook inbox, принадлежащего вашему аккаунту |

Успешный ответ 200

| Поле | Описание |

| --- | --- |

| templates | Массив объектов шаблона (может быть пустым) |

---

GET /api/webhook-test-events/templates/<id>

Успешный ответ 200

| Поле | Описание |

| --- | --- |

| template | Объект шаблона |

Объект template:

| Поле | Описание |

| --- | --- |

| id | UUID шаблона |

| tunnel_id | Эндпоинт, к которому привязан шаблон |

| name | Имя (до 120 символов; уникально для эндпоинта без учёта регистра) |

| description | Описание (до 1000 символов) |

| tags | До 50 тегов |

| example_outcome | success, failure или unspecified |

| version | Целое число; увеличивается при каждом успешном обновлении |

| created_at, updated_at | Время в RFC3339 |

| request | Объект запроса (см. выше) |

Устаревшие методы в шаблоне: если шаблон был сохранён ранее с методом вне списка поддерживаемых, GET по-прежнему возвращает его как есть. Чтобы обновить или запустить такой шаблон, выберите поддерживаемый метод в редакторе или в API.

---

POST /api/webhook-test-events/templates

Создаёт новый шаблон. Тело очищается до сохранения.

Тело запроса (JSON)

| Поле | Описание |

| --- | --- |

| tunnel_id | Эндпоинт |

| request | Объект запроса |

| name | Имя шаблона |

| description | Необязательно |

| tags | Необязательный массив строк |

| example_outcome | Необязательно: success, failure, unspecified |

Успешный ответ 201

| Поле | Описание |

| --- | --- |

| template | Созданный шаблон (version = 1) |

| redacted_fields | Список путей замаскированных полей (например query.token, body.password) |

---

POST /api/webhook-test-events/templates/from-event

Создаёт шаблон из доступного HTTP-события инспектора. Исходное событие не изменяется.

Тело запроса (JSON)

| Поле | Описание |

| --- | --- |

| event_id | UUID события инспектора |

| name | Имя нового шаблона |

| description, tags, example_outcome | Необязательно |

| body | Необязательно: { "omit": true } или { "body": "…", "body_encoding": "text|base64" } для замены непрозрачного захваченного тела |

Успешный ответ 201

Как при создании шаблона: template и redacted_fields.

---

PATCH /api/webhook-test-events/templates/<id>

Обновление с оптимистичной блокировкой: поле version в теле должно совпадать с текущей версией в сервисе. При расхождении (параллельное редактирование) — 409 stale_version; перечитайте шаблон и повторите PATCH с актуальной version.

Тело запроса (JSON)

| Поле | Описание |

| --- | --- |

| version | Обязательно. Ожидаемая текущая версия шаблона (целое число из последнего GET) |

| name, description, tags, example_outcome | Необязательные поля для изменения |

| request | Необязательный полный объект запроса |

Успешный ответ 200

| Поле | Описание |

| --- | --- |

| template | Обновлённый шаблон с version + 1 |

| redacted_fields | Замаскированные поля после санитизации |

---

DELETE /api/webhook-test-events/templates/<id>

Успешный ответ 204

Без тела.

---

POST /api/webhook-test-events/send

Отправляет один ручной запрос на текущую цель tunnel_id.

Тело запроса (JSON)

| Поле | Описание |

| --- | --- |

| tunnel_id | Эндпоинт |

| request | Объект запроса |

Успешный ответ 200

| Поле | Описание |

| --- | --- |

| event_id | UUID нового события инспектора |

| delivered | true, если ответ от цели получен |

| downstream_status | HTTP-код ответа цели (если доставка выполнена) |

| duration_ms | Время доставки в миллисекундах |

| notes | Необязательная поясняющая строка (например режим «только хранение» или пауза доставки) |

| redacted_fields | Поля, замаскированные при отправке |

Событие помечается тегом webhook-test-event. Исход доставки зависит от режима эндпоинта: активный туннель — реальный ответ downstream; inbox «только хранение» или пауза — синтетическое «сохранено» без вызова локального сервиса; forward_local / forward_remote — по правилам webhook inbox. См. известные ограничения.

---

POST /api/webhook-test-events/templates/<id>/run

Выполняет сохранённый шаблон на текущей цели эндпоинта шаблона. Шаблон не изменяется.

Тело запроса

Пустой объект {} или пустое тело.

Успешный ответ 200

Как при send, плюс тег webhook-template:<template_id> на событии инспектора.

---

Подробнее об ошибках — в справочнике ошибок. Ограничения размера, квот и доставки — в известных ограничениях.

Ошибки

401 Unauthorized

Когда: запрос к /api/webhook-test-events/* без действующей сессии или с недействительными учётными данными.

Тело ответа (JSON): code: "unauthorized", сообщение о необходимости входа.

Что делать: войдите в личный кабинет или передайте корректную авторизацию, как для остальных API дашборда.

---

403 Forbidden — заблокированный аккаунт

Когда: аккаунт приостановлен.

Тело ответа (JSON): code: "user_suspended".

Что делать: обратитесь в поддержку для восстановления аккаунта.

---

403 Forbidden — функция недоступна на тарифе

Когда: на плане нет возможности webhook-test-events или панель скрыта политикой тарифа.

Тело ответа (JSON): code: "feature_disabled", сообщение о недоступности ручных тестов вебхуков.

Что делать: проверьте тариф в разделе оплаты или обновите план. В дашборде панель тестирования не отображается или показывает отказ при вызове API.

---

403 Forbidden — CSRF (браузерная сессия)

Когда: мутация (POST, PATCH, DELETE) с сессионной кукой без заголовка X-CSRF-Token или с неверным токеном.

Текст ответа: содержит csrf forbidden.

Что делать: для вызовов из браузера скопируйте значение куки csrf_token в заголовок X-CSRF-Token. Для чистого API-клиента с bearer-токеном правило может не применяться — следуйте общим правилам защиты CSRF.

---

404 Not Found

Когда:

  • шаблон, событие инспектора или эндпоинт не существует;
  • ресурс принадлежит другому пользователю или эндпоинт вам недоступен (намеренно без раскрытия существования);
  • запрос списка шаблонов без tunnel_id или с чужим/недоступным tunnel_id.

Тело ответа (JSON): code: "not_found".

Что делать: проверьте tunnel_id, event_id и id шаблона. Перечитайте список шаблонов после удаления эндпоинта. Не используйте идентификаторы из другого аккаунта.

---

409 Conflict — имя шаблона

Когда: создание или переименование шаблона с именем, которое уже используется на том же эндпоинте (без учёта регистра).

Тело ответа (JSON): code: "template_name_conflict".

В дашборде: «Шаблон с таким названием уже существует для этого endpoint.»

Что делать: выберите другое имя или удалите существующий шаблон.

---

409 Conflict — квота шаблонов

Когда: в аккаунте уже 100 сохранённых шаблонов (суммарно по всех эндпоинтов).

Тело ответа (JSON): code: "template_quota_exceeded".

В дашборде: «Достигнут лимит шаблонов для аккаунта.»

Что делать: удалите неиспользуемые шаблоны или объедините сценарии.

---

409 Conflict — лимит тегов

Когда: в шаблоне больше 50 тегов.

Тело ответа (JSON): code: "template_tag_limit".

В дашборде: «Достигнут лимит тегов для шаблона.»

Что делать: сократите список тегов.

---

409 Conflict — устаревшая версия

Когда: PATCH с полем version, которое не совпадает с текущей версией в сервисе (параллельное редактирование).

Тело ответа (JSON): code: "stale_version", сообщение о необходимости перечитать шаблон.

В дашборде: «Шаблон изменился в другом месте. Перезагрузите его перед сохранением.» Редактор предлагает перезагрузить последнюю версию.

Что делать: выполните GET /api/webhook-test-events/templates/<id>, обновите форму и отправьте patch с актуальной version.

---

409 Conflict — эндпоинт недоступен

Когда: при отправке (send) или запуске шаблона (run) туннель или inbox удалён, неактивен, истёк или иным образом недоступен для доставки. Сохранение и обновление шаблонов (POST/PATCH) этой проверкой не блокируется.

Тело ответа (JSON): code: "endpoint_unavailable".

В дашборде: «Текущий endpoint недоступен. Проверьте статус туннеля, подключение клиента и режим доставки inbox.»

Что делать: проверьте статус туннеля/inbox в дашборде, подключение клиента и режим доставки inbox. Шаблон можно сохранить заранее и запустить после восстановления доставки.

---

413 Payload Too Large

Когда: тело запроса в send или в шаблоне превышает 32 КБ.

Тело ответа (JSON): code: "body_too_large".

Что делать: уменьшите тело или разбейте сценарий на несколько запросов.

---

422 Unprocessable Entity — неподдерживаемый эндпоинт или запрос

Когда:

  • tunnel_id указывает на TCP/UDP-туннель или другой не-HTTP тип;
  • запрос не соответствует правилам HTTP-эндпоинта.

Тело ответа (JSON): code: "unsupported_request".

Что делать: используйте HTTP/HTTPS-туннель или webhook inbox. Откройте инспектор только для HTTP-эндпоинта.

---

422 Unprocessable Entity — нужна ручная очистка тела

Когда: сохранение шаблона из события инспектора, у которого захваченное тело непрозрачно или обрезано, без явного omit или замены тела.

Тело ответа (JSON): code: "manual_sanitization_required".

Что делать: в диалоге «Сохранить как шаблон» отметьте «Не включать тело» или задайте замену; в API передайте body.omit или новое body.body.

---

400 Bad Request — невалидные поля

Когда:

  • абсолютный или protocol-relative путь (https://…, //…);
  • HTTP-метод вне списка GET, POST, PUT, PATCH, DELETE, HEAD, OPTIONS;
  • неверный JSON в теле API;
  • неверная base64 в body_encoding;
  • пустое имя, недопустимый example_outcome, CR/LF в заголовках и другие нарушения валидации.

Тело ответа (JSON): code: "invalid_request" или сообщение о неверном кодировании поля.

Что делать: исправьте путь (только относительный, с /), метод, синтаксис JSON и значения полей. В панели инспектора поля остаются на экране для правки.

---

429 Too Many Requests

Когда: исчерпан лимит частоты HTTP-запросов для аккаунта или эндпоинта (общий с другими HTTP-операциями туннеля).

Тело ответа (JSON): code: "rate_limited".

Что делать: подождите и повторите отправку. Снизьте частоту автоматических прогонов шаблонов.

---

502 / 504 и коды от downstream

Когда: цель недоступна, таймаут или отказ при доставке на активный туннель.

Что делать: при успешном ответе API 200 смотрите downstream_status и детали события в инспекторе. Убедитесь, что клиент туннеля подключён и локальный сервис отвечает.

---

500 Internal Server Error

Когда: непредвиденная ошибка на стороне сервиса при обработке запроса.

Текст ответа: общее сообщение о внутренней ошибке без технических деталей.

Что делать: повторите операцию позже. Если ошибка сохраняется — обратитесь в поддержку с event_id (если был возвращён) и временем запроса.

Ограничения

Известные ограничения

Граница первой версии (личные шаблоны)
  • Только владелец и эндпоинт. Сохранённые шаблоны привязаны к вашему аккаунту и одному tunnel_id. Общих библиотек команды, среды (staging/production) или аккаунта нет — каждый эндпоинт имеет свою библиотеку.
  • Чужие идентификаторы — 404. Запрос шаблона, события или эндпоинта другого пользователя или недоступного вам ресурса возвращает not_found без раскрытия, существует ли объект.
  • Без переноса между эндпоинтами. Чтобы тестировать другой URL, создайте новый шаблон на нужном эндпоинте.
Режимы доставки эндпоинта

Поведение send и run зависит от текущего состояния выбранного HTTP/HTTPS-туннеля или webhook inbox (цель не хранится в шаблоне):

| Режим | Что происходит при ручной отправке |

| --- | --- |

| Активный HTTP/HTTPS-туннель с подключённым клиентом | Запрос доставляется на локальную цель; в событии фиксируются реальный код и тело ответа downstream |

| Webhook inbox «только хранение» (store_only) | Локальный сервис не вызывается; создаётся синтетическое событие с ответом «сохранено» |

| Inbox или туннель на паузе | Как при «только хранение» — синтетическое сохранение без доставки на локальный сервис |

| Inbox «пересылка на локальный клиент» (forward_local) | Пересылка по правилам inbox; фиксируется ответ цели или ошибка отключённого клиента |

| Inbox «пересылка на удалённый HTTPS» (forward_remote) | Пересылка только на заранее одобренный HTTPS-адрес inbox (нужна соответствующая возможность тарифа) |

| Удалённый, недоступный или не-HTTP эндпоинт | Отказ (not_found, endpoint_unavailable или unsupported_request) без ложного «успешного» события |

Подробнее о webhook inbox.

Общие ограничения
  • Только HTTP/HTTPS-эндпоинты. Ручные тесты и шаблоны недоступны для TCP/UDP-туннелей; панель в инспекторе не отображается на их страницах.
  • Разрешённые HTTP-методы. При создании, обновлении и отправке допустимы только GET, POST, PUT, PATCH, DELETE, HEAD, OPTIONS. Старые шаблоны с другим методом (например CONNECT) можно прочитать, но перед сохранением или Run нужно выбрать поддерживаемый метод в редакторе.
  • Сохранение шаблона ≠ доставка. Создание и обновление шаблона не требуют подключённого клиента или активной доставки inbox; Отправить тест и Run по-прежнему проверяют текущую цель и при недоступности возвращают 409 endpoint_unavailable.
  • Вкладка «Тест» в инспекторе. Несохранённый ручной запрос сохраняется в форме при переключении на События или Настройки; выбор встроенного примера поверх изменённых полей требует подтверждения.
  • Фиксированная цель. Запрос всегда идёт на текущую цель выбранного tunnel_id. Нельзя указать внешний хост или абсолютный URL в поле пути.
  • Размер тела 32 КБ. Более крупные payload отклоняются до отправки и до сохранения в шаблон.
  • Квоты шаблонов. До 100 сохранённых шаблонов на аккаунт (все эндпоинты суммарно), до 50 тегов на шаблон, имя до 120 символов, описание до 1000 символов.
  • Шаблон привязан к эндпоинту. Запуск шаблона всегда использует эндпоинт, с которым он был создан; перенос на другой URL требует создания нового шаблона.
  • Удаление эндпоинта удаляет шаблоны. После удаления туннеля или inbox связанные шаблоны недоступны.
  • Встроенные примеры неизменяемы. Список built-in можно только читать и копировать в редактор; PATCH/DELETE по их id не сохраняют изменения.
  • Санитизация заголовков и секретов. Authorization, Cookie, Host, hop-by-hop и аналогичные заголовки не сохраняются и не отправляются. Ключи query и JSON, похожие на секреты, маскируются в шаблонах и в redacted_fields.
  • Без настраиваемой политики маскировки. Нельзя задать отдельные правила скрытия полей для каждого эндпоинта или раскрывать секреты по запросу — действуют единые правила сервиса.
  • Непрозрачное тело события. При сохранении шаблона из инспектора бинарное или обрезанное захваченное тело требует явного пропуска (body.omit) или замены — автоматическое копирование блокируется (manual_sanitization_required). Вручную введённое непрозрачное тело в редакторе — ваш явный ввод; структурная очистка произвольного бинарного payload не гарантируется.
  • Без гарантии «ровно один раз». Каждая успешная send или run создаёт отдельное событие инспектора. Повтор того же запроса, повторная отправка после сетевого сбоя или двойной клик (интерфейс блокирует кнопку только на время запроса) может создать дубликат — встроенной идемпотентности и долговременного ключа дедупликации нет.
  • Синхронная запись в инспектор. Ответ с event_id выдаётся после фиксации события; при сбое записи инспектора операция завершается ошибкой, даже если downstream уже ответил.
  • Лимит частоты HTTP. Действует общий ограничитель HTTP-запросов; частые ручные тесты могут получить 429.
  • Доставка зависит от режима inbox и клиента. Inbox «только хранение» не вызывает локальный сервис; для пересылки нужен подключённый клиент или доступная remote-цель — как для обычного inbox-трафика (см. webhook inbox).
  • Захват тел в инспекторе. Полное отображение request/response body в деталях события зависит от тарифа и настроек захвата тел; ручной тест не обходит эти правила.
  • Тарифная функция. На планах без webhook-test-events API и UI недоступны; на бесплатном плане функция обычно не включена.
  • Отличие от Replay. Повтор запроса (Replay) воспроизводит существующее событие с его политикой подавления capture; ручной тест всегда создаёт новое синтетическое событие с тегом webhook-test-event.