# Webhooks empfangen und Signatur prüfen

> Jeder Statuswechsel als signierter POST (HMAC-SHA256 über Zeitstempel und rohen Body) mit Wiederholungen bei Fehlern.

Kurs: Partner-Schnittstelle (API) (Für Partnersysteme und Entwickler) · Quelle: https://www.druck-s.de/hilfe/partner/webhooks

Bei jedem echten Statuswechsel schickt dmp druckraum ein Ereignis status_changed an Ihre Webhook-URL — in der richtigen Reihenfolge je Auftrag.

## Schritt für Schritt

1. Nehmen Sie POST-Anfragen an Ihrer Webhook-URL an und lesen Sie den rohen Body.
2. Prüfen Sie x-druck-s-timestamp (höchstens 5 Minuten alt) und x-druck-s-signature (v1=HMAC-SHA256(secret, timestamp + "." + body)).
3. Entdoppeln Sie über x-druck-s-delivery.
4. Antworten Sie mit 2xx. Andere Antworten werden mit Backoff bis zu 10-mal wiederholt; 400, 410 und 422 gelten als endgültig.

## Gut zu wissen

Die Reihenfolge der JSON-Schlüssel ist nicht festgelegt — prüfen Sie die Signatur immer über den rohen Body, nie über neu serialisiertes JSON.

## Beispiel-Ereignis

```json
{"event":"status_changed","partnerRef":"bestellung-2026-0042","number":"091126-004",
 "status":"SHIPPED","occurredAt":"2026-11-09T10:00:00.000Z",
 "trackingNumber":"00340434…","specialDeliveryDate":null}
```

## Signatur prüfen (Node.js)

```js
import { createHmac, timingSafeEqual } from "node:crypto";
function valid(secret, rawBody, ts, sig) {
  if (!/^\d{9,11}$/.test(ts ?? "") || Math.abs(Date.now() / 1000 - Number(ts)) > 300) return false;
  const expected = Buffer.from(`v1=${createHmac("sha256", secret).update(`${ts}.${rawBody}`).digest("hex")}`);
  const got = Buffer.from(sig ?? "");
  return expected.length === got.length && timingSafeEqual(expected, got);
}
```
