Zum Inhalt springen
LinkProfit

Webhooks

Signierte Ereigniszustellungen: verfügbare Ereignisse, X-LinkProfit-Signature in JavaScript und Python prüfen, Wiederholungen und der Fehlerzustand.

Aktualisiert 13. August 2026

Webhooks schicken Ereignisse als JSON-POST-Anfragen an Ihren Endpunkt — ohne Abfragen im Takt. Registrieren Sie Endpunkte im Dashboard (Einstellungen → Webhooks) oder per POST /v1/webhooks; das Signaturgeheimnis wird bei der Erstellung einmalig angezeigt.

Ereignisse

| Ereignis | Wird ausgelöst, wenn | Verfügbar für | |---|---|---| | link.created / link.updated / link.deleted | Ein Link sich ändert — über Dashboard, API oder Massenimport | Workspace- und Partner-Endpunkte | | domain.pending_ssl | DNS geprüft, Zertifikat wird ausgestellt | Workspace und Partner | | domain.activated | Die Domain liefert Traffic aus | Workspace und Partner | | domain.error | Die Bereitstellung ist fehlgeschlagen; Details enthalten | Workspace und Partner | | click.threshold | 80 % / 100 % des monatlichen Limits erfasster Klicks | Workspace und Partner | | conversion.created | Eine Conversion wurde erfasst: eine Bestellung, eine Anmeldung oder ein eigenes Ziel, einem Klick zugerechnet | Workspace und Partner | | workspace.subscribed | Ein Kunde hat die erste Rechnung eines Abos bezahlt | nur Partner | | workspace.past_due | Eine Kundenzahlung ist fehlgeschlagen | nur Partner | | workspace.suspended | Ein Kunde wurde gesperrt (Mahnlauf oder manuell) | nur Partner | | payment.succeeded | Eine Kundenzahlung ist verrechnet, mit Gebührenaufschlüsselung | nur Partner | | payment.refunded | Eine Zahlung wurde erstattet | nur Partner |

Die Zustellung

POST /your/endpoint HTTP/1.1
Content-Type: application/json
X-LinkProfit-Event: link.created
X-LinkProfit-Delivery: dlv_8Yq2…
X-LinkProfit-Signature: t=1755081600,v1=5f8a2c…
{
  "id": "dlv_8Yq2…",
  "type": "link.created",
  "created_at": "2026-08-13T10:00:00.000Z",
  "data": { "id": "lnk_…", "domain": "go.your-brand.com", "slug": "x7f2q1z", "url": "https://example.com" }
}

Antworten Sie innerhalb von 10 Sekunden mit einem beliebigen 2xx. Alles andere — auch ein Timeout — gilt als Fehlschlag und plant eine Wiederholung ein. Zustellungen können in abweichender Reihenfolge und selten auch doppelt eintreffen: Entdoppeln Sie über die id.

Die Signatur prüfen

Die Signatur ist HMAC-SHA256 über `${t}.${rawBody}` mit dem Geheimnis Ihres Endpunkts, hex-kodiert. Prüfen Sie immer gegen den rohen Anfragerumpf, vor jedem JSON-Parsen, und weisen Sie Zeitstempel zurück, die älter als 5 Minuten sind.

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

function verifySignature(secret, rawBody, header, toleranceSeconds = 300) {
  const parts = Object.fromEntries(
    header.split(",").map((piece) => piece.split("=", 2)),
  );
  if (!parts.t || !parts.v1) return false;
  if (Math.abs(Date.now() / 1000 - Number(parts.t)) > toleranceSeconds) return false;

  const expected = createHmac("sha256", secret)
    .update(`${parts.t}.${rawBody}`)
    .digest("hex");
  const a = Buffer.from(expected);
  const b = Buffer.from(parts.v1);
  return a.length === b.length && timingSafeEqual(a, b);
}
import hashlib
import hmac
import time


def verify_signature(secret: str, raw_body: bytes, header: str, tolerance: int = 300) -> bool:
    parts = dict(piece.split("=", 1) for piece in header.split(",") if "=" in piece)
    timestamp, signature = parts.get("t"), parts.get("v1")
    if not timestamp or not signature:
        return False
    if abs(time.time() - int(timestamp)) > tolerance:
        return False

    expected = hmac.new(
        secret.encode(), f"{timestamp}.".encode() + raw_body, hashlib.sha256
    ).hexdigest()
    return hmac.compare_digest(expected, signature)

Wiederholungen und der Fehlerzustand

Der erste Versuch erfolgt sofort. Fehlschläge werden nach festem Plan wiederholt: 1 Min. → 5 Min. → 30 Min. → 2 Std. → 12 Std. Nach der fünften Wiederholung wird der Endpunkt als failing markiert, erhält keine neuen Ereignisse mehr, und der Inhaber bekommt eine E-Mail.

Reparieren Sie den Endpunkt und aktivieren Sie ihn dann im Dashboard oder mit PATCH /v1/webhooks/{id} und {"status": "active"} wieder. Verpasste Ereignisse werden nicht automatisch nachgeliefert — das Zustellprotokoll (GET /v1/webhooks/{id}/deliveries oder das Dashboard) zeigt jede Nutzlast, sodass Sie abgleichen können.

Eine erfolgreiche Zustellung setzt die Fehlerserie zurück.

Testen

Der Button Test senden (oder POST /v1/webhooks/{id}/test) stellt ein echtes, signiertes Ereignis mit "data": { "test": true } über dieselbe Verarbeitungskette zu wie Produktionsereignisse — das Zustellprotokoll zeigt die Antwort Ihres Endpunkts.