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.
Header
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