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.

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.

Webhook-Payload

Der Payload enthält immer mindestens die folgenden Felder:

FeldBeschreibungtopicDer Event-Typ, zum Beispiel InvoiceReceived oder InvoiceSentErrordocumentIdServerseitige Kennung des Dokuments, für die Download-EndpunkterefToDocumentIdNur bei bestimmten Topics (u. a. MLS): ID des ursprünglichen Dokuments, auf das sich der Status bezieht. Bei MessageLevelStatusSent/MessageLevelStatusReceived ist documentId die MLS-Nachricht selbst und refToDocumentId die ursprüngliche Rechnung oder BestellungpartyIdKennung der beteiligten Partei (gleich der legalEntityId)createdByQuelle des Dokuments: peppol, email, network, manualUpload, ksef oder eine andere Kanalbezeichnung. Nutzen Sie dieses Feld, um die Weiterverarbeitung je Quelle zu routensentOnZeitpunkt des Events in UTC, ISO 8601

Neue oder unbekannte Top-Level-Felder und Erweiterungen in details können vorkommen (forward-compatible Payloads). Bauen Sie den Parser so, dass unbekannte Felder ignoriert werden, statt einen Fehler zu werfen.

Keine Rechnungsbeträge im Payload. Der Webhook-Payload enthält bewusst keine Beträge (Summe, MwSt., Positionsbeträge) und keine Rechnungspositionen. Beträge stehen im XML-Dokument selbst und sind über die Download-Endpunkte abrufbar. Das ist eine Privacy-by-Design-Entscheidung: Benachrichtigungsverkehr darf keinen finanziellen Inhalt enthalten.

Eingehende Dokumente deduplizieren Sie auf Invoice/ID + Absender-partyId + issueDate aus der abgerufenen XML-Datei. Das liegt in der Verantwortung der empfangenden Anwendung, nicht des PSB. Der PSB garantiert At-least-once-Zustellung der Benachrichtigung selbst, überwacht aber keine inhaltlichen Dubletten in einem anderen E-Rechnungs-Kanal.

Beispiel-Payloads je Topic

Jeder Payload besteht aus den allgemeinen Feldern oben plus einem topic-spezifischen details-Block. Die folgenden Beispiele stammen aus der PSB-DevOps-Dokumentation und dienen als Referenz beim Bau oder Test eines Webhook-Consumers.

InvoiceReceived
{
  "topic": "InvoiceReceived",
  "partyId": "NL:KVK:12345678",
  "hookId": "1",
  "documentId": "5618b40a-822d-4e74-8894-b489617dbaa4",
  "message": "Invoice successfully received.",
  "details": {
    "id": "invoiceId",
    "sender": "0106:87654321",
    "createdBy": "peppol",
    "documentTypeId": "urn:oasis:names:specification:ubl:schema:xsd:Invoice-2::Invoice##urn:cen.eu:en16931:2017#compliant#urn:fdc:peppol.eu:2017:poacc:billing:3.0::2.1"
  },
  "createdOn": "2026-04-30T09:00:00.0000000+00:00",
  "sentOn": "2026-04-30T09:00:00.5000000+00:00"
}
InvoiceSent
{
  "topic": "InvoiceSent",
  "partyId": "NL:KVK:12345678",
  "hookId": "1",
  "documentId": "5618b40a-822d-4e74-8894-b489617dbaa4",
  "message": "Invoice successfully sent.",
  "details": {
    "id": "invoiceId",
    "recipient": "0106:87654321",
    "endpoint": "https://accp-ap.econnect.eu/as4/v1",
    "protocol": "As4",
    "attempt": "1",
    "messageId": "3e3b336c-6563-431c-93bc-6b109dedfcc5@econnect.eu",
    "sourceDocumentTypeId": "urn:oasis:names:specification:ubl:schema:xsd:Invoice-2::Invoice##urn:cen.eu:en16931:2017#compliant#urn:fdc:peppol.eu:2017:poacc:billing:3.0::2.1",
    "targetDocumentTypeId": "urn:oasis:names:specification:ubl:schema:xsd:Invoice-2::Invoice##urn:cen.eu:en16931:2017#compliant#urn:fdc:peppol.eu:2017:poacc:billing:3.0::2.1"
  },
  "createdOn": "2026-04-30T09:31:57.7444125+00:00",
  "sentOn": "2026-04-30T09:31:57.8703556+00:00"
}

InvoiceSentRetry und InvoiceSentError folgen derselben Struktur. Bei Retry ist attempt erhöht; bei Error beschreibt das Feld message die endgültige Fehlerursache.

MessageLevelStatusReceived
{
  "topic": "MessageLevelStatusReceived",
  "partyId": "NL:KVK:12345678",
  "hookId": "mls",
  "documentId": "615a914f-4a4d-4b3a-a258-828efb2817a6",
  "refToDocumentId": "d5e3bc34-96c8-4daf-b260-b7b182fa4760",
  "message": "'MessageLevelStatus' received. Status: 'Accept' Description: 'Document is accepted'.",
  "details": {
    "statusCode": "AP",
    "status": "Accept",
    "description": "Document is accepted",
    "documentTypeId": "urn:oasis:names:specification:ubl:schema:xsd:ApplicationResponse-2::ApplicationResponse##urn:peppol:edec:mls:1.0::2.1",
    "profileId": "urn:peppol:edec:mls"
  },
  "createdOn": "2026-03-11T22:43:18.2766651+00:00",
  "sentOn": "2026-03-11T22:43:18.8225397+00:00"
}

Interpretieren Sie details.statusCode (AP accepted, RE rejected oder AB acknowledged), details.description (Erläuterung der empfangenden Partei) und refToDocumentId (Verweis auf das ursprüngliche Dokument).

MessageLevelStatusSent
{
  "topic": "MessageLevelStatusSent",
  "partyId": "NL:KVK:ECONNECTTS",
  "hookId": "mls",
  "documentId": "c4a31897-66ac-468c-a7e8-14a24f9af114",
  "refToDocumentId": "be7005ff-5555-41eb-afef-f5ffec2b29ed",
  "message": "'ApplicationResponse' successfully sent.",
  "details": {
    "statusCode": "AP",
    "status": "Accept",
    "description": "Document is accepted",
    "profileId": "urn:peppol:edec:mls",
    "sourceDocumentTypeId": "urn:oasis:names:specification:ubl:schema:xsd:ApplicationResponse-2::ApplicationResponse##urn:peppol:edec:mls:1.0::2.1",
    "attempt": "1",
    "protocol": "As4"
  },
  "createdOn": "2026-03-12T21:12:20.1621727+00:00",
  "sentOn": "2026-03-12T21:12:20.3726218+00:00"
}

Für OrderSent und die übrigen Order-Topics gelten vergleichbare Strukturen mit einem topic-spezifischen details-Block. Bauen Sie einen Parser, der unbekannte Felder ignoriert: das Element details ist dynamisch und kann künftig neue Felder enthalten.

Conditional output topics

Ein Hook kann in v1-beta ein output-Array mit Regeln enthalten, die festlegen, welches Topic anhand des Aktionsergebnisses veröffentlicht wird. Damit lässt sich dynamisches Routing aufsetzen, ohne dass der aufrufende Code die Fallback-Logik selbst kennen muss.

Jede Output-Regel besteht aus zwei Feldern:

FeldBeschreibungwhenBedingung, in der Regel ein HTTP-Statuscode wie 400, 404 oder 500topicTopic, das veröffentlicht wird, sobald die Bedingung zutrifft. Der Wildcard * (wie in Send*Fallback) wird zum ursprünglichen Topic expandiert

Das erste passende when bestimmt das resultierende Topic. Trifft keine Regel zu oder fehlt das Feld output, fällt der Hook auf die Standard-Topics zurück.

Ein häufiges Szenario ist Peppol mit E-Mail-Fallback: ein Peppol-Hook veröffentlicht bei Zustellfehlern (HTTP 400, 404 oder 500) ein Send*Fallback-Topic, auf das ein separater Mail-Hook hört und die Rechnung per E-Mail versendet.

{
  "id": "peppol",
  "action": "peppol",
  "name": "peppol hook",
  "topics": ["Send*"],
  "output": [
    { "when": "400", "topic": "Send*Fallback" },
    { "when": "404", "topic": "Send*Fallback" },
    { "when": "500", "topic": "Send*Fallback" }
  ],
  "isActive": true
}

Wenn derselbe Mail-Hook zusätzlich explizit auf Send* hört (neben Send*Fallback), erscheint er automatisch als Kanal peppol-fallback in der queryRecipientParty-Multi-Channel-Abfrage. Der aufrufende Code kann diesen Kanal dann explizit über ?channel=peppol-fallback an den Send-Endpunkten wählen.

Conditional output topics sind nicht auf E-Mail-Fallback beschränkt. Der Mechanismus funktioniert für jede Topic-Kombination und kann zum Beispiel auch bestimmte Fehlercodes an einen SFTP-Hook oder einen externen Webhook routen.

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-IPs. Abnahme: 51.144.92.226 und 13.81.124.198. Produktion: 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: alphanumerische Sortierung der Hook-ID (zuerst Integer-IDs, dann Text, zum Beispiel 1 < 02 < 10 < dico < peppol)
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.

Dead letter vs dropped letter (Event-Routing)

Statuslabels in zum Beispiel einem Daily Digest oder einer Event-Pipeline bedeuten etwas anderes als ein fehlgeschlagener Webhook-Retry (HookSentError):

LabelBedeutungDropped letterFür das Event ist ein Drop-Hook registriert. Die Dropped-Hook-Aktion ist ein noop. Zweck des Drop-Hooks: verhindern, dass das Event in der Dead Letter landet.Dead letterEs sind keine Hooks registriert, die das Event aufnehmen. Das Event endet deshalb als Dead Letter.

Kurz: Drop-Hook vorhanden, also dropped (bewusst ignoriert, keine Dead Letter); keine passenden Hooks, also Dead Letter.

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 12 Mal versucht (circa 6 Tage, circa 137 Stunden), keine 2xx-AntwortEndpunkt-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 bis zu 12 Mal, verteilt über circa 6 Tage (circa 137 Stunden, Timeout 100 Sek. pro Versuch). Bei jedem Versuch wird ein HookSentRetry-Event gesendet; nach diesen Versuchen 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 Retry-Fenster von circa 6 Tagen 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 → folgen Sie dem Standard-HookSentError-Runbook unten (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 12 Mal (circa 6 Tage, circa 137 Stunden) 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 Retry-Fensters von circa 6 Tagen ü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