Demo testen ↗

Webhooks

Sigillo meldet Ergebnisse aktiv an Ihren Server – signiert mit HMAC-SHA256 und mit automatischen Wiederholungen.

Wann Webhooks gesendet werden

Ist für Ihren Shop eine Webhook-URL hinterlegt, sendet Sigillo bei jedem Endstatus (verified, rejected, expired) einen POST:

{
  "id": "evt_780738470f1e4d6c8a79c47d2da585da",
  "type": "verification.completed",
  "created_at": "2026-09-30T14:39:33+00:00",
  "data": { "id": "…", "reference": "order-1042", "status": "verified", "min_age": 18, "age_verified": true }
}

Der Webhook enthält keine Personendaten.

  • Sigillo-Event-Id – eindeutig. Webhooks können mehrfach ankommen: anhand dieser ID deduplizieren.
  • Sigillo-Signature: t=<unix-zeit>,v1=<hex> – HMAC-SHA256 über "<t>.<body>" mit Ihrem Webhook-Secret (whsec_…).

Signatur prüfen

Verwenden Sie immer den rohen Body.

$body   = file_get_contents('php://input');
parse_str(str_replace(',', '&', $_SERVER['HTTP_SIGILLO_SIGNATURE'] ?? ''), $sig);
$expected = hash_hmac('sha256', $sig['t'] . '.' . $body, SIGILLO_WEBHOOK_SECRET);
if (!hash_equals($expected, $sig['v1'] ?? '') || abs(time() - (int)$sig['t']) > 300) {
    http_response_code(400); exit;
}
const sig = Object.fromEntries(header.split(',').map(p => p.split('=')));
const expected = crypto.createHmac('sha256', secret).update(`${sig.t}.${rawBody}`).digest('hex');
const ok = Math.abs(Date.now() / 1000 - Number(sig.t)) < 300
  && crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(sig.v1 || ''));

Antwort und Wiederholungen

Quittieren Sie mit 2xx. Bei Fehlern oder Timeout (10 s) versucht Sigillo es erneut nach 1 min, 5 min, 30 min, 2 h, 6 h und 24 h. Die URL muss https:// verwenden und öffentlich erreichbar sein; Weiterleitungen werden nicht gefolgt.

Die letzten Zustellungen sehen Sie unter GET /v1/webhook-deliveries.

Aktualisiert 30. September 2026