Входящие вебхуки
Вебхуки позволяют внешним сервисам отправлять события в SNABZHENETS+ в реальном времени. Это используется для синхронизации заказов, уведомлений о платежах, обновлений статусов доставки и других событий.
Как это работает
Интеграция с входящим webhook получает уникальный URL. Внешний сервис отправляет POST-запросы на этот адрес, а SNABZHENETS+ принимает событие, обязательно проверяет подпись, применяет активные inbound mappings и записывает результат в журнал.
Внешний сервис → webhook URL SNABZHENETS+ → mapping → бизнес-сущность / журналУправление URL
Получить текущий URL
GET /api/v1/integrations/installations/:id/webhook-endpoint
Метод возвращает URL вебхука, статус активности, маску секрета, дату последнего события и количество полученных событий. Секрет для проверки подписи не возвращается в открытом виде.
Перегенерировать URL
POST /api/v1/integrations/installations/:id/webhook-endpoint/regenerate
Метод создаёт новый URL и новый секрет. Новый секрет показывается один раз — сохраните его сразу и обновите настройки вебхука во внешнем сервисе.
Проверка подписи
SNABZHENETS+ требует HMAC-SHA256 для проверки входящих запросов.
Внешний сервис должен передавать:
X-Snabplus-Timestamp— время запроса;X-Snabplus-Signature— подпись в форматеsha256=<hex>;X-Snabplus-Event— тип события для выбора mapping.
Для совместимости также принимается X-Timestamp.
Подпись вычисляется по строке:
{timestamp}.{rawBody}Запросы без подписи или с устаревшим timestamp отклоняются.
Публичный адрес приёма
POST /api/v1/webhooks/inbound/:token
Адрес доступен из интернета для внешних сервисов и не требует пользовательской авторизации. При успешном приёме возвращается 202 Accepted. Если URL неверный, интеграция отключена или подпись не прошла проверку, запрос будет отклонён.
Inbound mappings
В консоли API/Webhooks можно создать mapping без пользовательского JavaScript. Mapping описывает:
- событие, например
catalog.item.upserted; - безопасную операцию, например
catalog_item.upsert; - JSONPath-правила
source, например{ "name": "$.name" }; defaults,requiredFields,idempotencyPath,externalSource,externalIdPath.
Поддерживаемые операции v1: event.record, catalog_item.upsert, counterparty.upsert, procurement.status.
Outbound webhooks
Outbound subscriptions отправляют события SNABZHENETS+ во внешнюю систему. Payload содержит event, eventId, tenantId, entity, occurredAt, data и links. Каждый запрос подписывается:
X-Snabplus-Event: integration_api.procurement.status_changed
X-Snabplus-Event-Id: audit-log-uuid
X-Snabplus-Timestamp: 1760000000000
X-Snabplus-Signature: sha256=<hex>Стабильный каталог v1:
integration_api.procurement.createdintegration_api.procurement.updatedintegration_api.procurement.status_changedintegration_api.catalog_item.createdintegration_api.catalog_item.updatedintegration_api.catalog_item.deletedintegration_api.counterparty.createdintegration_api.counterparty.updatedintegration_api.counterparty.status_changedintegration_api.counterparty.deletedintegration_api.warehouse.createdintegration_api.warehouse.updatedintegration_api.warehouse.deletedintegration_api.price_list.createdintegration_api.price_list.updatedintegration_api.price_list.status_changedintegration_api.price_list.deletedintegration_api.invoice.createdintegration_api.invoice.updatedintegration_api.invoice.status_changedintegration.test_event
Сущности в исходящих событиях
| Сущность | Системное имя | Какие события отправляются |
|---|---|---|
| Закупка | procurement | Создание, обновление, смена статуса |
| Номенклатура | catalog_item | Создание, обновление, удаление или архивирование |
| Контрагент | counterparty | Создание, обновление, смена статуса, удаление или архивирование |
| Склад | warehouse | Создание, обновление, удаление или архивирование |
| Прайс-лист | price_list | Создание, обновление, смена статуса, удаление или архивирование |
| Счёт | invoice | Создание, обновление, смена статуса |
| Тест интеграции | integration | Тестовое событие для проверки доставки, заголовков и подписи |
Типы событий:
| Тип | Когда отправляется |
|---|---|
| Создание | В SNABZHENETS+ появилась новая сущность. |
| Обновление | Изменились поля существующей сущности. |
| Смена статуса | Изменился статус сущности, и внешняя система должна отдельно отреагировать на переход. |
| Удаление или архивирование | Сущность стала неактивной, удалена или архивирована. Этот тип есть только у архивируемых сущностей. |
| Тестовое событие | Пользователь вручную проверяет webhook-подписку без изменения бизнес-данных. |
Если список событий в подписке пустой, подписка получает все успешные бизнес-события audit trail, кроме внутренних событий управления webhook.
Подпись считается по строке {timestamp}.{rawBody}. Повторы выполняются при сетевой ошибке, 408, 429 и 5xx; каждая попытка видна в логах доставки.
Полный справочник outbound events с русскими названиями сущностей доступен в разделе Исходящие webhook-события.
Журнал входящих событий
Все полученные вебхуки записываются в журнал установки:
GET /api/v1/integrations/installations/:id/logs?direction=INBOUND
Подробнее — в разделе Управление установками.
Рекомендации по настройке
- Храните секрет вебхука в защищённом месте.
- Если секрет скомпрометирован, сразу перегенерируйте URL.
- Настройте подпись на стороне внешнего сервиса, если он её поддерживает.
- Проверяйте дату последнего события и счётчик полученных событий в карточке установки.