Aller au contenu

Webhooks

Les webhooks sortants informent vos systèmes (CRM, outil d’e-mailing, entrepôt de données) de ce qui se passe dans un workspace.

Studio → Paramètres → Webhooks, ou POST /workspaces/{ws}/webhooks : URL HTTPS, événements souhaités, en-têtes supplémentaires éventuels. Le secret de signature est généré par Remizo ; il peut être renouvelé avec une période de recouvrement de 24 heures pendant laquelle l’ancien et le nouveau secret sont acceptés.

transaction.committed, transaction.cancelled, transaction.refunded, offer.applied, offer.published, offer.suspended, offer.budget_exhausted, coupon.issued, coupon.rendered, coupon.redeemed, coupon.expired, coupon.cancelled, points.earned, points.burnt, points.expired, points.adjusted, customer.created, customer.merged, customer.anonymized, customer.event, segment.computed, sync.run_finished, backup.finished, alert.raised, et ping pour les tests.

POST https://crm.example.com/remizo
Content-Type: application/json
X-Remizo-Event: coupon.issued
X-Remizo-Delivery: 0193a1b2-6c3e-7a10-9f00-5a1e2b3c4d5e
X-Remizo-Signature: t=1762681333,v1=5f1c…
{ "id": "…", "type": "coupon.issued", "version": 1, "workspace": "acme",
"occurredAt": "2026-11-09T09:42:13.120Z", "source": "remizo-acme-engine-1", "data": { … } }

v1 = HMAC-SHA256 hexadécimal du secret sur la chaîne t + "." + corps brut.

import { createHmac, timingSafeEqual } from 'node:crypto';
function verify(secret, header, rawBody, toleranceSeconds = 300) {
const parts = Object.fromEntries(header.split(',').map((p) => p.split('=')));
if (Math.abs(Date.now() / 1000 - Number(parts.t)) > toleranceSeconds) return false;
const expected = createHmac('sha256', secret).update(`${parts.t}.${rawBody}`).digest('hex');
return timingSafeEqual(Buffer.from(expected), Buffer.from(parts.v1));
}
  • Réponse attendue : un statut 2xx dans le délai imparti (10 s par défaut).
  • Sinon, nouvelles tentatives avec un délai exponentiel ; après la dernière tentative, la livraison passe à l’état dead et reste consultable (et relançable) dans le studio.
  • Les livraisons peuvent arriver en double ou dans le désordre : dédupliquez sur X-Remizo-Delivery / id et utilisez occurredAt pour l’ordre.