Вебхуки
Когда приложение в режиме HIOBuy warehouse fulfillment, HIOBuy отправляет события жизненного цикла fulfillment на ваш HTTPS endpoint. Настройте в Developer Portal → Webhooks . Доставка асинхронна; ответы Public API не ждут ваш webhook-сервер.
Требование: Авторизация каналов → режим fulfillment = HIOBuy warehouse. В self-режиме виден только intro; создать/включить Endpoint нельзя.
Обзор {#overview}
| Параметр | Значение |
|---|---|
| Транспорт | POST JSON на ваш endpoint |
| Таймаут | 10 сек. |
| Успех | HTTP 2xx |
| Секрет подписи | whsec_… (показывается один раз при создании / ротации) |
| Заголовок подписи | HioBuy-Signature |
| Заголовок ID события | HioBuy-Event-Id |
| User-Agent | HioBuy-Webhooks/1.0 |
| Повторы | до 5 попыток: сразу, затем 1m / 5m / 30m / 2h |
| Тестовые события | Портал Send test → livemode: false, префикс id evt_test_ |
Регистрация, ротация секрета, история доставок и ручной retry — только в портале (сессионная авторизация). В v1 нет Public API /v1/webhooks/*.
Каталог событий {#events}
Подписка на endpoint. Нужно ≥ 1 событие.
| Категория | Тип события | Когда срабатывает |
|---|---|---|
| Закупка | procurement.failed | Ошибка складской закупки |
| Закупка | procurement.out_of_stock | SKU нет в наличии при закупке |
| Склад | package.received | Внутренний пакет принят на склад |
| Склад | package.exception | Исключение входящего пакета (data.exception_type) |
| Консолидация | consolidation.completed | Консолидация завершена |
| Доставка | shipment.created | Международная отправка создана |
| Доставка | shipment.dispatched | Передано перевозчику |
| Доставка | shipment.delivered | Доставлено получателю |
| Доставка | shipment.exception | Исключение отправки (data.exception_type) |
| Аккаунт | balance.low | Баланс склада ниже порога |
Live-пуш warehouse→developer внедряется поэтапно; сейчас проверяйте приёмник через Send test в портале.
Публичный envelope {#envelope}
Тело каждой доставки — JSON:
{
"id": "evt_01HXYZ…",
"type": "package.received",
"created_at": "2026-08-16T04:00:00.000Z",
"livemode": true,
"app_id": "app_…",
"data": {
"package_id": "pkg_…",
"order_id": "ord_…",
"status": "received"
}
}| Поле | Тип | Описание |
|---|---|---|
id | string | Публичный id события (evt_… live, evt_test_… test) |
type | string | Тип из каталога |
created_at | string | ISO-8601 |
livemode | boolean | false для тестовых событий портала |
app_id | string | ID вашего app |
data | object | Полезная нагрузка без внутренних полей склада |
Примеры data {#data-shapes}
Ниже — тестовые сэмплы портала; live использует те же ключи.
procurement.failed
{
"order_id": "ord_…",
"status": "failed",
"reason": "supplier_rejected"
}package.exception
{
"package_id": "pkg_…",
"order_id": "ord_…",
"status": "exception",
"exception_type": "DAMAGED"
}shipment.dispatched
{
"shipment_id": "shp_…",
"tracking_number": "…",
"status": "dispatched"
}balance.low
{
"available_amount": 12.5,
"currency": "USD",
"threshold": 50
}HTTP-доставка {#delivery}
POST /your/webhook-path HTTP/1.1
Host: your-server.example
Content-Type: application/json
User-Agent: HioBuy-Webhooks/1.0
HioBuy-Event-Id: evt_01HXYZ…
HioBuy-Signature: t=1723780800,v1=abcdef0123456789…- В production URL должен быть HTTPS. Вне production допускаются
http://localhost/ туннели. - Ответьте
2xxза 10 с. Иначе — retry до исчерпания попыток. - Доставка at-least-once. Дедуплицируйте по
id(и опциональноHioBuy-Event-Id).
Проверка подписи {#signature}
- Прочитайте
HioBuy-Signature(t=<unix_seconds>,v1=<hex_hmac>). - Соберите строку:
"{t}.{raw_body}", гдеraw_body— сырое тело (UTF-8 JSON как пришло). - Вычислите
HMAC-SHA256(secret, signed_payload)и hex. - Сравните с
v1за постоянное время. - Отклоните при слишком большом
|now - t|(рекомендуемый допуск: 5 минут).
Node.js пример
import crypto from "node:crypto";
function verifyHioBuySignature(rawBody, signatureHeader, secret, toleranceSec = 300) {
const match = /^t=(\d+),v1=([0-9a-f]+)$/i.exec(signatureHeader || "");
if (!match) return false;
const t = Number(match[1]);
const expected = match[2].toLowerCase();
if (!Number.isFinite(t)) return false;
if (Math.abs(Math.floor(Date.now() / 1000) - t) > toleranceSec) return false;
const signed = `${t}.${rawBody}`;
const digest = crypto
.createHmac("sha256", secret)
.update(signed, "utf8")
.digest("hex");
const a = Buffer.from(digest, "utf8");
const b = Buffer.from(expected, "utf8");
return a.length === b.length && crypto.timingSafeEqual(a, b);
}Храните
whsec_…только на сервере. В портале — маска (последние 6 символов). После ротации обновите сервер до следующей доставки.
Повторы и статусы {#retries}
| Попытка | Задержка после предыдущей ошибки |
|---|---|
| 1 | Сразу (в очередь) |
| 2 | 1 мин. |
| 3 | 5 мин. |
| 4 | 30 мин. |
| 5 | 2 ч. |
После последней ошибки статус failed. В деталях доставки можно Retry now.
Статусы: pending · success · retrying · failed.
Сценарий в портале {#portal}
- В Channel Auth / fulfillment setup включите warehouse fulfillment.
- Откройте Webhooks → Add endpoint.
- Укажите HTTPS URL, описание и события.
- Сразу скопируйте секрет (показывается один раз).
- Отправьте test event и проверьте deliveries / attempts.
- При необходимости ротируйте секрет, отключите или удалите endpoint.
Лимиты и хранение {#limits}
| Лимит | Значение |
|---|---|
| Payload | ≤ 64 KB |
| тело ответа в attempt | ≤ 4 KB |
| хранение событий / доставок | ~30 дн. |
| Attempt | ~14 дн. |
Связанные разделы
- Fulfillment setup — режим warehouse
- Fulfillment API — международная отправка
- Authentication — API keys (не секрет webhook)
- Sandbox — заказы sandbox не пушат автоматически; используйте Send test
Get Support
Need integration help? Contact Developer Support at support@hiobuy.com · Response within 1–2 business days