Passer au contenu

Référence

Webhooks

Abonnez un point de terminaison HTTPS dans votre tableau de bord pour recevoir les événements au moment où ils se produisent. Chaque livraison est signée ; les livraisons se font au moins une fois, alors dédupliquez sur l'id de l'enveloppe.

Événements

booking.createdbooking.confirmedbooking.cancelledorder.createdorder.paidorder.status_changedorder.refundedpreorder.invitedpreorder.savedreview.createdenquiry.creatednewsletter.subscribednewsletter.unsubscribedvenue_booking.createdvenue_booking.confirmedvenue_booking.cancelledvenue_rfq.createdvenue_quote.acceptedvenue_quote.declinedvenue_contract.signedvenue_contract.declinedvenue_payment.received

Enveloppe de la charge utile

{
  "id": "evt_1709...",
  "event": "order.paid",
  "createdAt": "2025-12-21T19:45:12.000Z",
  "data": { /* event-specific payload */ }
}

Vérification des signatures

Chaque requête comporte OAC-Signature: t=<unix-ts>,v1=<hex-hmac>. Calculez le HMAC de {timestamp}.{rawBody} avec le secret de votre point de terminaison et comparez en temps constant :

Node.js
import { createHmac, timingSafeEqual } from "crypto";

function verify(rawBody, header, secret) {
  if (!header) return false;
  const parts = Object.fromEntries(header.split(",").map((p) => p.split("=")));
  const ts = parts.t, sig = parts.v1;
  if (!ts || !sig) return false;
  // Reject replays older than 5 minutes.
  if (Math.abs(Date.now() / 1000 - Number(ts)) > 300) return false;
  const expected = createHmac("sha256", secret).update(`${ts}.${rawBody}`).digest("hex");
  return timingSafeEqual(Buffer.from(expected), Buffer.from(sig));
}

Vérifiez toujours par rapport au corps de requête brut — re-sérialiser le JSON invalide la signature.

Relances

Une livraison échouée (erreur réseau ou réponse non-2xx en moins de 10 s) est relancée avec un backoff exponentiel : 60s → 5m → 30m → 2h → 12h, puis s'arrête. Chaque tentative est enregistrée dans une ligne WebhookDelivery que vous pouvez consulter dans votre tableau de bord.