Skip to content

Входящие вебхуки

Вебхуки позволяют внешним сервисам отправлять события в SNABZHENETS+ в реальном времени. Это используется для синхронизации заказов, уведомлений о платежах, обновлений статусов доставки и других событий.

Как это работает

Интеграция с входящим webhook получает уникальный URL. Внешний сервис отправляет POST-запросы на этот адрес, а SNABZHENETS+ принимает событие, обязательно проверяет подпись, применяет активные inbound mappings и записывает результат в журнал.

text
Внешний сервис → 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.

Подпись вычисляется по строке:

text
{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. Каждый запрос подписывается:

http
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.created
  • integration_api.procurement.updated
  • integration_api.procurement.status_changed
  • integration_api.catalog_item.created
  • integration_api.catalog_item.updated
  • integration_api.catalog_item.deleted
  • integration_api.counterparty.created
  • integration_api.counterparty.updated
  • integration_api.counterparty.status_changed
  • integration_api.counterparty.deleted
  • integration_api.warehouse.created
  • integration_api.warehouse.updated
  • integration_api.warehouse.deleted
  • integration_api.price_list.created
  • integration_api.price_list.updated
  • integration_api.price_list.status_changed
  • integration_api.price_list.deleted
  • integration_api.invoice.created
  • integration_api.invoice.updated
  • integration_api.invoice.status_changed
  • integration.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.
  • Настройте подпись на стороне внешнего сервиса, если он её поддерживает.
  • Проверяйте дату последнего события и счётчик полученных событий в карточке установки.

Документация платформы SNABZHENETS+.