Webhooks einrichten und absichern

Webhooks im PSB konfigurieren: Topics, HMAC SHA256-Sicherheit und IP-Whitelisting.

Webhooks sind die primäre Methode, um Echtzeit-Benachrichtigungen vom PSB zu empfangen. Bei jedem relevanten Ereignis (eine empfangene Rechnung, eine Statusänderung, eine Zustellbestätigung) sendet der PSB eine HTTP POST-Anfrage an Ihren Endpoint mit den Details des Events.

Wie funktionieren Webhooks im PSB?

Sie registrieren einen Webhook (einen "Hook") im PSB mit einer URL und einem Topic. Der PSB sendet dann alle Events für dieses Topic an Ihre URL. Jedes Event enthält die relevanten Daten als JSON-Payload.

Einen Webhook erstellen

Keine UI verfügbar: Es ist derzeit nicht möglich, einen Hook über die Benutzeroberfläche der Plattform zu konfigurieren. Hooks werden über die API oder über den eConnect-Support eingerichtet. Eine Hook-Self-Service-UI ist in der Roadmap (geplant für Q4 2026) und wird Teil von Control (Platform 2.0): Benutzer können Hooks dort dann selbst erstellen, ändern und löschen. Bis dahin ist kein Schritt-für-Schritt-Artikel für die manuelle Hook-Konfiguration über die API geplant.

Registrieren Sie einen Hook über die API:

POST /api/v1/hook

Die wichtigsten Konfigurationselemente:

FeldBeschreibungurlDer HTTPS-Endpoint, an den der PSB Events sendettopicDer Event-Typ, auf den Sie hören möchten (z. B. InvoiceReceived)secretEin geheimer Schlüssel für die HMAC-Signaturverifizierung

Achtung: Vermeiden Sie das schnelle Hintereinander-Löschen und Neuanlegen von Hooks für dieselbe partyId und dasselbe Topic. Durch Race Conditions in der Aufgabenverarbeitung kann es vorkommen, dass vorübergehend kein aktiver Hook existiert und Events nicht zugestellt werden. Warten Sie nach dem Löschen eines Hooks einen Moment, bevor Sie einen neuen anlegen, oder verwenden Sie ein Update statt Löschen und Neuanlegen.

Ein Topic zu einem bestehenden Hook hinzufügen

Möchten Sie einem bestehenden Hook ein weiteres Topic (z. B. InvoiceReceived) hinzufügen? Aktualisieren Sie die bestehende Webhook-Konfiguration über die reguläre /hook-API, sodass das gewünschte Topic im topics-Array enthalten ist:

{
  "topics": ["InvoiceReceived"]
}

Aktualisieren Sie den bestehenden Hook, anstatt ihn zu löschen und neu anzulegen. Löschen und Neuanlegen führt zu einer Race Condition, bei der Events vorübergehend nicht zugestellt werden können (siehe Warnung oben).

Kein Self-Service für nicht-technische Kunden. Das Hinzufügen eines Topics zu einem bestehenden Hook ist eine technische Aufgabe: Die ausführende Person muss wissen, wohin der Webhook gehen soll (die Endpoint-URL), und verstehen, was ein Webhook ist. Ein nicht-technischer Kunde kann dies in der Regel nicht eigenständig durchführen. Ziehen Sie jemanden mit technischem Know-how hinzu (kunden-IT oder eConnect-Support).

Häufig verwendete Topics
TopicWannInvoiceReceivedEine Eingangsrechnung wurde empfangenInvoiceSentEine Ausgangsrechnung wurde erfolgreich versendetInvoiceSentErrorEine Ausgangsrechnung konnte nicht zugestellt werdenInvoiceSentRetryEin erneuter Sendeversuch wurde gestartetInvoiceResponseReceivedEine Invoice Response (Statusnachrichten) wurde empfangenMessageLevelStatusReceivedEine MLS-Statusnachricht wurde von der sendenden Partei empfangenMessageLevelStatusSentEine MLS-Statusnachricht wurde erfolgreich versendetOrderReceivedEine Bestellung wurde empfangen
Message Level Status (MLS)

MLS (Message Level Status) ist der Nachfolger des älteren MLR und gibt der sendenden Partei Feedback über den Empfang und die Verarbeitung eines Dokuments. MLS ist nicht standardmäßig aktiviert und muss pro Party über die reviews-Capability in der SMP-Konfiguration konfiguriert werden. Sobald MLS aktiviert ist, handhabt der PSB es automatisch: als empfangender Service Provider sendet der PSB eine MLS-Nachricht an den Absender zurück nach Empfang und Zustellung.

Wenn Sie selbst Dokumente über den PSB versenden, erhalten Sie MLS-Feedback von der empfangenden Partei als Webhook-Event zum Topic MessageLevelStatusReceived. Als empfangender Service Provider folgt ein separater Webhook mit Topic MessageLevelStatusSent, sobald der PSB im Auftrag von Ihnen eine MLS an den sendenden SP verschickt. Nutzen Sie dieses Topic, um zu überwachen, ob Ihre eigenen ausgehenden MLS-Antworten korrekt zugestellt werden.

MessageLevelStatusSent ist keine Bestätigung einer versendeten Rechnung. Das Topic betrifft eine MLS, die der PSB als Reaktion auf ein empfangenes Dokument sendet (Sie als empfangender SP senden die Statusmeldung an den ursprünglichen Absender zurück), nicht eine von Ihnen selbst versendete E-Rechnung. Bei vielen MessageLevelStatusSent-Meldungen neben wenigen versendeten Rechnungen: prüfen Sie, ob der Hook auf der Wildcard *sent statt spezifisch auf InvoiceSent hört (siehe Wildcard-Topics).

Der Payload enthält unter anderem:

FeldBeschreibungdocumentIdEindeutige ID der MLS-NachrichtrefToDocumentIdID des Originaldokumentsdetails.statusCodePeppol-Status: AP (accepted), RE (rejected), AB (acknowledged)details.descriptionErläuterung des Empfängers

Um MLS-Nachrichten zu empfangen, muss der Peppol-Hook das Feld mlsType enthalten. Die möglichen Werte sind ALWAYS_SEND (immer MLS zurücksenden) und FAILURE_ONLY (nur bei Ablehnungen).

Tipp: Das vollständige MLS-Dokument können Sie über GET /api/v1-beta/{partyId}/generic/{documentId}/download abrufen, aber der Webhook-Payload enthält in der Regel ausreichend Informationen.

Webhooks mit HMAC absichern

Der PSB sichert alle Webhook-Zustellungen mit HMAC SHA256-Signaturen. Bei jeder Anfrage sendet der PSB den Header:

X-EConnect-Signature: sha256={Signatur}
Verifizierung implementieren

Um die Signatur zu verifizieren:

  1. Nehmen Sie den rohen JSON-Payload der Anfrage.
  2. Berechnen Sie den HMAC SHA256-Hash mit Ihrem geheimen Schlüssel (derselbe, den Sie beim Erstellen des Hooks angegeben haben).
  3. Vergleichen Sie Ihren berechneten Hash mit dem Wert im X-EConnect-Signature-Header.
  4. Wenn sie übereinstimmen, ist die Anfrage authentisch.
Replay-Attack-Prävention

Prüfen Sie auch das sentOn-Feld im Payload. Wenn dieser Zeitstempel älter als 5 Minuten ist, lehnen Sie die Anfrage ab. Dies verhindert Replay-Attacks, bei denen eine abgefangene Anfrage später erneut abgespielt wird.

Zusätzliche Sicherheitsoptionen

Neben der HMAC-Verifizierung bietet der PSB zusätzliche Sicherheitsebenen:

  • IP-Whitelisting: Beschränken Sie eingehende Anfragen auf die PSB-Produktions-IPs (104.40.188.59 und 104.47.148.207)
  • OAuth Webhook-Authentifizierung: Der PSB kann sich bei Ihrem Endpoint mit OAuth2-Credentials authentifizieren
  • Mutual SSL: Verwenden Sie Client-Zertifikate für gegenseitige TLS-Authentifizierung
Prioritätsreihenfolge

Wenn Sie mehrere Hooks konfiguriert haben, bestimmt der PSB den zu verwendenden Hook anhand folgender Kriterien:

  1. PartyId-Level-Hooks haben Vorrang vor Environment-Level-Hooks
  2. Spezifische Topics haben Vorrang vor Wildcards
  3. Wenn mehrere Hooks mit Filtern auf dasselbe Topic zutreffen: Der längste Filter (nach Zeichenanzahl) gewinnt -- ein Filter mit einer zusätzlichen &&-Klausel gewinnt beispielsweise gegen einen kürzeren Filter ohne diese Klausel. So wird eine doppelte Zustellung vermieden, ohne dass Filter sich gegenseitig ausschliessen müssen.
  4. Bei gleicher Priorität: Hook-ID als Tiebreaker
Wildcard-Topics

Neben spezifischen Topics können Sie auch Wildcard-Patterns verwenden, um mehrere Event-Typen mit einem Hook abzufangen.

PatternTrifft zu aufSend*Alle Topics mit Präfix Send*sent / *SentAlle Topics, die auf Sent enden: InvoiceSent, InvoiceResponseSent, OrderSent, MessageLevelStatusSent, HookSent*ReceivedAlle Empfangs-Events (InvoiceReceived, OrderReceived, InvoiceResponseReceived usw.)Invoice*Alle rechnungsbezogenen Events

Send* ist nicht dasselbe wie *sent. Send* trifft auf Topics zu, die mit Send beginnen; dieses Pattern kommt in den Standard-PSB-Topics nicht vor. Um alle "sent"-Events abzufangen (InvoiceSent, MessageLevelStatusSent, HookSent usw.), verwenden Sie *sent. InvoiceSentRetry und InvoiceSentError enden nicht auf Sent und fallen daher nicht unter das Suffix *sent.

Fehlerbehebung

Nachfolgend sind häufige Webhook-Probleme und deren Lösungen aufgeführt.

SymptomUrsacheLösungWebhooks kommen nicht anEndpunkt nicht erreichbar (Timeout 100 Sek.)HTTPS + gültiges SSL-Zertifikat erforderlich; CSRF-Schutz am Webhook-Endpunkt deaktivierenWebhook als unsicher abgelehntX-EConnect-Signature-Validierung schlägt fehlHMAC SHA256-Berechnung prüfen: Payload × Secret → Hex-String mit Präfix sha256=Relay-Angriff blockiertsentOn-Feld älter als 5 MinutenEndpunkt verarbeitet zu langsam oder Systemuhr falsch gestellt"No such host is known" (DNS-Fehler)Hostname des Webhook-Endpunkts nicht mehr auflösbar, z.B. nach Umbenennung der ERP-Umgebung oder abgelaufenem DNS-EintragDNS-Eintrag des Endpunkt-Domainnamens prüfen und wiederherstellen; anschließend fehlende Events über den Batch-Endpunkt abrufenHookSentError (endgültiger Fehler)PSB hat 5 Tage lang versucht, keine 2xx-Antwort erhaltenEndpunkt-Logs prüfen; HookSentError-Topic überwachen (siehe unten); fehlende Events über den Batch-Endpunkt abrufenEndpunkt offline / wiederholter HTTP 404 (Akzeptanz oder Produktion)Kunden-Endpunkt vorübergehend abgeschaltet (Entwicklung, Wartung) oder tatsächlich nicht erreichbarZunächst prüfen, ob die Ausfallzeit beabsichtigt und vorübergehend ist (siehe unten); dies ist keine eConnect-PlattformstörungAlte Rechnungen erneut zugestelltAPI gibt beim ersten Empfang kein 2xx zurückEndpunkt muss immer 2xx zurückgeben, auch bei asynchroner VerarbeitungDoppelte Verarbeitung bei RetryKeine Idempotenz-PrüfungX-EConnect-Delivery-Header (eindeutige UUID) für Deduplizierung verwendenRechnung empfangen, kommt aber nirgends an; keine Webhook-Fehler sichtbarDer PSB hat die Eingangsrechnung empfangen (Topic InvoiceReceived), aber es ist kein Hook für dieses Topic registriert (nie eingerichtet oder zwischenzeitlich entfernt)Zunächst die Hook-Konfiguration prüfen: steht InvoiceReceived in den Topics? Ohne Hook auf diesem Topic erscheint kein HookSentError — das Fehlen von Fehlermeldungen beweist also nicht, dass der Hook aktiv istViele MessageLevelStatusSent-E-Mails bei wenigen versendeten E-RechnungenMail-Hook (mailto:) oder HTTP-Webhook hört auf Wildcard *sent statt auf InvoiceSentTopic-Konfiguration auf InvoiceSent ändern (gleiche Anpassung am Mail-Hook wie am HTTP-Webhook); siehe Wildcard-Topics
Rechnung empfangen, aber nirgends zugestellt (kein InvoiceReceived-Hook)

Der PSB kann eine Eingangsrechnung empfangen, ohne sie an die empfangende Partei weiterzuleiten. Das Topic InvoiceReceived bedeutet, dass der PSB die Rechnung empfangen hat; ohne Hook auf diesem Topic geht nichts an einen Endpunkt.

  • Keine Webhook-Fehler ist kein Beweis, dass der Hook funktioniert. HookSentError existiert nur, wenn ein Hook konfiguriert ist, der nicht zustellt.
  • Ein Hook kann zwischenzeitlich entfernt worden sein. Eine frühere erfolgreiche Zustellung an dieselbe Partei/denselben Endpunkt beweist, dass der Hook existiert hat, nicht dass er jetzt noch vorhanden ist. Daher zunächst die aktuelle Hook-Konfiguration prüfen, statt dies als Ersteinrichtung zu behandeln.
  • Eine Empfangsbestätigung beim Absender ist nicht dasselbe wie die Zustellung an die empfangende Software.

Beheben Sie einen fehlenden Hook, indem Sie den bestehenden Hook aktualisieren, statt ihn zu löschen und neu zu erstellen.

HookSentError überwachen und beheben

Der PSB sendet Webhook-Events (z.B. InvoiceReceived bei einer eingegangenen E-Rechnung) an den konfigurierten Endpunkt. Ist dieser Endpunkt nicht erreichbar — durch ein Timeout, einen SSL-Fehler oder einen DNS-Fehler wie No such host is known — wiederholt der PSB mit exponentiellem Backoff für 5 Tage (Timeout 100 Sek. pro Versuch). Bei jedem Versuch wird ein HookSentRetry-Event gesendet; nach 5 Tagen ohne 2xx-Antwort folgt HookSentError als Abschlussstatus und der PSB stellt die Versuche ein.

Folge: Eine eingegangene E-Rechnung wird nicht an den Kunden weitergeleitet, solange der Endpunkt nicht erreichbar ist, ohne dass der Kunde dies direkt bemerkt. Empfohlene Maßnahmen:

  • Monitoring einrichten: Einen Hook (z.B. einen Mail-Hook) für das Topic HookSentError abonnieren, damit ein endgültiger Zustellungsfehler aktiv gemeldet wird statt unbemerkt zu bleiben. Optional auch HookSentRetry für frühzeitige Erkennung.
  • Grundursache beheben: Bei einem DNS-Fehler den DNS-Eintrag des Endpunkt-Domainnamens prüfen und wiederherstellen; bei Timeouts den Endpunkt schneller antworten lassen (2xx innerhalb von 100 Sek., aufwändige Verarbeitung asynchron).
  • Fehlende Events wiederherstellen: Events, die während der Auszeit fehlgeschlagen sind, können über den Batch-Endpunkt nachgeholt werden. Das 5-tägige Retry-Fenster bedeutet, dass rechtzeitige Behebung innerhalb dieses Zeitraums reguläre Zustellung noch ermöglicht.

Erste Linie: Ausfallzeit auf Kundenseite vs. technisches Problem (Akzeptanz und Produktion)

HookSentError, ein wiederholter HTTP 404 oder „Endpunkt ist offline"/„Akzeptanzumgebung ist aus" kann auch daran liegen, dass der Kunde den Akzeptanz- oder Produktionsendpunkt vorübergehend abschaltet (Entwicklung, Wartung). Das ist keine eConnect-Plattformstörung.

  1. Symptom bestätigen: HookSentError, Endpunkt offline oder HTTP 404 auf dem vom Kunden konfigurierten Webhook-Endpunkt. Oft sichtbar als der exakte Text Response status code does not indicate success: 404 (Not Found) (meist eine .NET-HttpRequestException bei der ausgehenden Hook-Anfrage). Dies ist ein 404 vom Endpunkt des Kunden selbst (offline oder falscher Pfad), nicht der Peppol-Fehler PartyId not found beim Senden (SMP-404) und keine REST-Ressourcen-404 aus der Fehlerbehandlung der API.
  2. Nachfragen, ob die Ausfallzeit beabsichtigt und vorübergehend ist (Entwickler/Kunde).
  3. Bestätigt vorübergehend → notieren, keine weitere Aktion auf eConnect-Seite, bis der Endpunkt wieder erreichbar ist. Sobald der Endpunkt wieder 2xx liefert, können verpasste Events über den Batch-Endpunkt abgerufen werden.
  4. Nicht beabsichtigt oder unbekannt → dem oben stehenden Standard-HookSentError-Runbook folgen (DNS/SSL/Timeout, Logs, Monitoring, Batch-Wiederherstellung).
Best Practices
  • Verwenden Sie immer HTTPS für Ihren Webhook-Endpoint
  • Implementieren Sie idempotente Verarbeitung: In seltenen Fällen kann der PSB ein Event mehrfach zustellen
  • Geben Sie schnell einen 2xx-Statuscode zurück: Der PSB betrachtet jede Nicht-2xx-Antwort als Fehler und versucht das Event erneut
  • Protokollieren Sie alle empfangenen Events für Debugging und Auditing
  • Verwenden Sie ein Queue-System auf Ihrer Seite, wenn die Verarbeitung Zeit benötigt; bestätigen Sie zuerst den Empfang und verarbeiten Sie danach
Häufig gestellte Fragen
Wie verifiziere ich einen eingehenden Webhook mit HMAC SHA256?

Nehmen Sie den rohen JSON-Body des Requests, berechnen Sie den HMAC SHA256-Hash mit dem Secret, das Sie beim Erstellen des Hooks angegeben haben, und vergleichen Sie ihn mit dem Wert im Header X-EConnect-Signature (nach dem Präfix sha256=). Stimmen sie überein, wissen Sie, dass der Request vom PSB stammt und unterwegs nicht verändert wurde.

Warum sollte ich das Feld sentOn in der Payload prüfen?

Prüfen Sie, ob sentOn nicht älter als 5 Minuten ist. Ist der Zeitstempel zu alt, weisen Sie den Request ab. So verhindern Sie Replay-Angriffe, bei denen ein zuvor abgefangener Request später erneut eingereicht wird, selbst wenn die Signatur technisch korrekt ist.

Wie vermeide ich Probleme bei idempotenter Verarbeitung und Retries?

Implementieren Sie eine idempotente Verarbeitung auf Ihrer Seite, da die PSB ein Event in seltenen Fällen mehrfach zustellen kann. Geben Sie außerdem schnell einen HTTP 2xx-Status zurück: Jede andere Antwort gilt als Fehler und löst einen Retry aus. Für aufwändige Verarbeitung können Sie zuerst den Empfang bestätigen und danach über eine Queue weiterverarbeiten.

Was bedeutet HookSentError oder ein Endpunkt, der auf Akzeptanz oder Produktion offline erscheint?

HookSentError folgt, nachdem der PSB 5 Tage lang ohne 2xx-Antwort versucht hat. Ein wiederholter HTTP 404 oder die Meldung, dass der Endpunkt offline ist, liegt oft daran, dass der Kunde den Akzeptanz- oder Produktionsendpunkt vorübergehend abschaltet (Entwicklung, Wartung) — das ist keine eConnect-Plattformstörung. Zunächst bestätigen, ob die Ausfallzeit beabsichtigt und vorübergehend ist; falls ja, ist bis zur Erreichbarkeit keine weitere Aktion nötig. Verpasste Events können innerhalb des 5-tägigen Retry-Fensters über den Batch-Endpunkt abgerufen werden.

Warum erhalte ich viele MessageLevelStatusSent-E-Mails, obwohl ich wenige Rechnungen versende?

Dies ist erwartetes Verhalten, wenn der Mail-Hook (mailto:) oder HTTP-Webhook auf der Wildcard *sent statt spezifisch auf InvoiceSent hört. MessageLevelStatusSent ist keine Bestätigung einer selbst versendeten Rechnung, sondern einer MLS, die der PSB als Reaktion auf ein empfangenes Dokument sendet, und fällt zusammen mit InvoiceSent, OrderSent und HookSent unter das *sent-Pattern. Wenn Sie nur Benachrichtigungen beim Versenden von Rechnungen wünschen, ändern Sie die Topic-Konfiguration auf InvoiceSent. InvoiceSentRetry und InvoiceSentError enden nicht auf Sent und fallen daher nicht unter *sent.


Möchten Sie Dokumente lieber in großen Mengen abrufen? Sehen Sie sich Batch Hooks an.

Webhook-Endpoints ansehen