// documentation

Webhooks

Прообраз событий, доставки уведомлений и проверки подписи webhook-запросов.

API Preview: публичный контракт ещё не опубликован

Событийная модель

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

Имена событий, payload и правила подписки ещё не утверждены.

Проверка подписи

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

Доставка и повторы

Обработчик должен быстро подтверждать получение, выполнять тяжёлую работу асинхронно и быть готовым к повторной доставке одного события.

Идемпотентность

Сохраняйте идентификатор события и не применяйте одно изменение дважды. Порядок доставки разных событий не следует считать гарантированным без отдельного указания в контракте.

POSThttps://example.com/webhooks/markethouse
import { createHmac, timingSafeEqual } from 'node:crypto';

export async function POST(request) {
  const body = await request.text();
  const signature = request.headers.get('x-markethouse-signature') ?? '';
  const expected = createHmac(
    'sha256',
    process.env.MARKETHOUSE_WEBHOOK_SECRET,
  )
    .update(body)
    .digest('hex');

  const signatureIsValid =
    signature.length === expected.length &&
    timingSafeEqual(Buffer.from(signature), Buffer.from(expected));

  if (!signatureIsValid) {
    return new Response('Invalid signature', { status: 401 });
  }

  const event = JSON.parse(body);
  await processEventOnce(event.id, event);

  return Response.json({ received: true });
}
200 OKПример ответа
{
  "received": true
}