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.
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.
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:
InvoiceReceived)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.
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).
InvoiceReceivedInvoiceSentInvoiceSentErrorInvoiceSentRetryInvoiceResponseReceivedMessageLevelStatusReceivedMessageLevelStatusSentOrderReceivedMLS (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:
documentIdrefToDocumentIddetails.statusCodeAP (accepted), RE (rejected), AB (acknowledged)details.descriptionUm 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}/downloadabrufen, aber der Webhook-Payload enthält in der Regel ausreichend Informationen.
Der PSB sichert alle Webhook-Zustellungen mit HMAC SHA256-Signaturen. Bei jeder Anfrage sendet der PSB den Header:
X-EConnect-Signature: sha256={Signatur}
Um die Signatur zu verifizieren:
X-EConnect-Signature-Header.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.
Neben der HMAC-Verifizierung bietet der PSB zusätzliche Sicherheitsebenen:
104.40.188.59 und 104.47.148.207)Wenn Sie mehrere Hooks konfiguriert haben, bestimmt der PSB den zu verwendenden Hook anhand folgender Kriterien:
&&-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.Neben spezifischen Topics können Sie auch Wildcard-Patterns verwenden, um mehrere Event-Typen mit einem Hook abzufangen.
Send*Send*sent / *SentSent enden: InvoiceSent, InvoiceResponseSent, OrderSent, MessageLevelStatusSent, HookSent*ReceivedInvoiceReceived, OrderReceived, InvoiceResponseReceived usw.)Invoice*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.
Nachfolgend sind häufige Webhook-Probleme und deren Lösungen aufgeführt.
sha256=sentOn-Feld älter als 5 MinutenHookSentError-Topic überwachen (siehe unten); fehlende Events über den Batch-Endpunkt abrufenX-EConnect-Delivery-Header (eindeutige UUID) für Deduplizierung verwendenInvoiceReceived), aber es ist kein Hook für dieses Topic registriert (nie eingerichtet oder zwischenzeitlich entfernt)InvoiceReceived in den Topics? Ohne Hook auf diesem Topic erscheint kein HookSentError — das Fehlen von Fehlermeldungen beweist also nicht, dass der Hook aktiv istMessageLevelStatusSent-E-Mails bei wenigen versendeten E-Rechnungenmailto:) oder HTTP-Webhook hört auf Wildcard *sent statt auf InvoiceSentInvoiceSent ändern (gleiche Anpassung am Mail-Hook wie am HTTP-Webhook); siehe Wildcard-TopicsInvoiceReceived-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.
HookSentError existiert nur, wenn ein Hook konfiguriert ist, der nicht zustellt.Beheben Sie einen fehlenden Hook, indem Sie den bestehenden Hook aktualisieren, statt ihn zu löschen und neu zu erstellen.
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:
HookSentError abonnieren, damit ein endgültiger Zustellungsfehler aktiv gemeldet wird statt unbemerkt zu bleiben. Optional auch HookSentRetry für frühzeitige Erkennung.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.
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.HookSentError-Runbook folgen (DNS/SSL/Timeout, Logs, Monitoring, Batch-Wiederherstellung).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.
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.
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.
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.
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