Passer au contenu
OpenALaCarte

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<code>id</code> de lenveloppe.

Événements

booking.createdbooking.confirmedbooking.cancelledorder.createdorder.paidorder.status_changedorder.refundedpreorder.invitedpreorder.savedreview.created

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.