Webhooks

Events, Signaturprüfung, Wiederholversuche und Replay.

Events

Bei Abschluss einer Analyse sendet Adlass Extract einen POST an Ihre Webhook-URL: analysis.succeeded oder analysis.failed. Der Body enthält das gleiche Objekt wie GET /v1/analyses/:id:

{
  "id": "<delivery_id>",
  "event": "analysis.succeeded",
  "created_at": "2026-07-28T12:00:00.000Z",
  "data": { "id": "<analysis_id>", "status": "succeeded", … }
}

Die URL kommt pro Request (webhook_url) oder als Account-Endpoint aus dem Dashboard; der Request-Wert überschreibt den Account-Default. Nur öffentliche HTTPS-Endpunkte sind zulässig.

Signatur prüfen

Jede Zustellung trägt den Header extract-signature: t=<timestamp>,v1=<signatur>. Die Signatur ist ein HMAC-SHA256 über `${timestamp}.${body}` mit Ihrem Signing-Secret (Dashboard → Webhooks):

import { createHmac, timingSafeEqual } from "node:crypto";

function verifyExtractSignature(header, rawBody, secret) {
  const parts = Object.fromEntries(
    header.split(",").map((part) => part.split("=", 2)),
  );
  const expected = createHmac("sha256", secret)
    .update(`${parts.t}.${rawBody}`)
    .digest("hex");
  const a = Buffer.from(expected, "hex");
  const b = Buffer.from(parts.v1 ?? "", "hex");
  if (a.length !== b.length || !timingSafeEqual(a, b)) return false;
  const ageSeconds = Math.abs(Date.now() / 1000 - Number(parts.t));
  return ageSeconds < 300;
}

Prüfen Sie den Timestamp gegen Replay-Angriffe (Toleranz z. B. 5 Minuten) und antworten Sie mit einem 2xx-Status, sobald Sie das Event angenommen haben — die Verarbeitung sollte asynchron erfolgen.

Wiederholversuche

Antwortet Ihr Endpoint nicht mit 2xx, wird die Zustellung mit exponentiellem Backoff (mit Jitter) über rund 24 Stunden wiederholt, maximal 8 Versuche. Danach gilt sie als aufgegeben. Jede Zustellung ist im Dashboard-Zustell-Log mit Versuchen, Statuscode und Fehler sichtbar.

Replay

Aufgegebene oder fehlgeschlagene Zustellungen lassen sich im Dashboard per Replay erneut anstoßen. Unabhängig davon bleibt das Ergebnis 7 Tage per GET /v1/analyses/:id abrufbar — Polling ist der verlässliche Fallback bei Webhook-Ausfällen.