Webhooks
Mit Webhooks erhalten Sie Echtzeit-HTTP-Benachrichtigungen, wenn Ereignisse in RxScale auftreten. Anstatt regelmäßig nach Änderungen abzufragen, registrieren Sie eine Webhook-URL, und RxScale sendet Ihnen bei jedem Ereignis eine POST-Anfrage.Funktionsweise von Webhooks
- Registrieren Sie ein Webhook-Abonnement mit Ihrer Ziel-URL und dem gewünschten Ereignistyp.
- Empfangen Sie POST-Anfragen an Ihre URL, wenn Ereignisse eintreten.
- Überprüfen Sie die Webhook-Signatur, um die Authentizität der Anfrage sicherzustellen.
- Antworten Sie mit einem
2xx-Statuscode, um den Empfang zu bestätigen.
Webhook-Payload-Format
Alle Webhook-Payloads folgen derselben Envelope-Struktur:Ereignisse idempotent verarbeiten
Bestell- und Bestandsereignisse (pharmacy_order_created, pharmacy_order_updated, pharmacy_sku_stock_updated) beschreiben keine Änderung. Jede Payload ist ein vollständiger Schnappschuss der Apothekenbestellung bzw. der Apotheken-SKU, erstellt in dem Moment, in dem die Zustellung versendet wird. Es gibt keine Ereignis-ID. Daraus folgt:
- Derselbe Stand kann Sie mehrfach erreichen — zum Beispiel, wenn eine Zustellung wiederholt wird oder mehrere Änderungen kurz nacheinander erfolgen.
pharmacy_order_updatedkann vor dempharmacy_order_createdderselben Bestellung eintreffen — zum Beispiel, wenn die erste Zustellung vonpharmacy_order_createdfehlgeschlagen ist und später wiederholt wird.pharmacy_order_updatedgibt nicht an, was sich geändert hat.
- Verwenden Sie
data.uidals Schlüssel und legen Sie den Datensatz an oder aktualisieren Sie ihn (Upsert) — unabhängig davon, welches Ereignis zuerst eintrifft. - Behandeln Sie jede Payload als aktuellen Gesamtstand und ersetzen Sie Ihre gespeicherte Kopie damit. Was sich geändert hat, ermitteln Sie durch Vergleich mit Ihrem gespeicherten Stand — zum Beispiel
statusodershipments. - Überspringen Sie eine Payload, deren
data.updated_atälter ist als der gespeicherte Wert. Es handelt sich um einen älteren Stand, der verspätet eingetroffen ist. - Stellen Sie sicher, dass die zweimalige Verarbeitung derselben Payload keinen Schaden anrichtet.
- Deduplizieren Sie nicht anhand von
timestamp. Der Wert wird pro Zustellversuch gesetzt: Eine Wiederholung trägt einen neuen Wert, während zwei verschiedene Aktualisierungen, die in derselben Sekunde versendet werden, denselben Wert haben.
appointment_reminder_due und patient_doctor_meeting_updated enthalten die Daten zum Zeitpunkt des Ereignisses, keinen beim Versand erstellten Schnappschuss. Für Besprechungsereignisse siehe Zustellung und Idempotenz.Webhooks registrieren
Sie können Webhooks über folgende Wege registrieren:- Apothekenportal — Navigieren Sie zum API-Zugang in der Seitenleiste. Wenn Sie mehrere Apothekengruppen verwalten, wählen Sie die Gruppe aus dem Dropdown oben auf der Seite.
- External Pharmacy API —
POST /v1/external_pharmacy_api/webhooks/ - Management API —
POST /v1/management/notification-subscriptions/
webhook_secret zurück, egal ob Sie über die External Pharmacy API, das Apothekenportal oder die Management API registrieren. Es wird nur einmal angezeigt; bewahren Sie es sicher auf, da Sie es zur Überprüfung der Payload-Signaturen benötigen (siehe Sicherheit).
Abonnements über die Management API können zusätzlich einen von Ihnen konfigurierten benutzerdefinierten Request-Header senden (header_key / header_value), zum Beispiel einen API-Schlüssel, den Ihr Endpoint bereits prüft.
Wiederholungsrichtlinie
Erfolgreiche und fehlgeschlagene Zustellungen
Eine Zustellung gilt als erfolgreich, sobald Ihr Endpoint mit einem beliebigen2xx-Statuscode antwortet — auch wenn Ihre eigene Verarbeitung der Payload danach fehlschlägt. Speichern Sie die Payload zuerst, antworten Sie und verarbeiten Sie aufwändige Arbeit anschließend asynchron.
Eine Zustellung gilt als fehlgeschlagen, wenn:
- Ihr Endpoint mit einem anderen Statuscode antwortet — auch mit
3xx(Weiterleitungen werden nicht verfolgt) und mit jedem4xx, etwa413 Payload Too Large; - Ihr Endpoint nicht innerhalb von 30 Sekunden antwortet;
- keine Verbindung aufgebaut werden kann oder der TLS-Handshake fehlschlägt (zum Beispiel wegen eines ungültigen Zertifikats).
Wiederholungen
Fehlgeschlagene Zustellungen werden mit exponentiellem Backoff wiederholt: Die erste Wiederholung erfolgt nach etwa 10 Sekunden, der Abstand wächst auf höchstens etwa 10 Minuten zwischen zwei Versuchen. Nach insgesamt 5 Versuchen wird die Zustellung verworfen. Es gibt keine Dead-Letter-Queue und keine Möglichkeit, eine verworfene Zustellung erneut auszulösen. Jeder Versuch erstellt die Payload neu, daher enthält eine Wiederholung den aktuellen Stand und einen neuentimestamp.
Wurden Zustellungen verworfen — zum Beispiel nach einem Ausfall Ihres Endpoints —, gleichen Sie Ihre Daten über die External Pharmacy API ab:
- Listen Sie Bestellungen mit
GET /v1/external_pharmacy_api/pharmacy_orders/auf. Die Filterstart_dateundend_datebeziehen sich auf den Erstellungszeitpunkt der Bestellung. - Rufen Sie den aktuellen Stand einer Bestellung mit
GET /v1/external_pharmacy_api/pharmacy_orders/{pharmacy_order_uid}ab. Die Antwort wird aus denselben Daten erstellt wie die Webhook-Payload. - Für Lagerbestände listen Sie Ihre SKUs mit
GET /v1/external_pharmacy_api/pharmacy_skus/auf.
Zustellprotokolle
Jeder Zustellversuch für die Abonnements Ihrer Apothekengruppe — erfolgreich oder fehlgeschlagen — wird im Apothekenportal unter API-Zugang → Webhook-Zustellprotokolle mit dem Statuscode der Antwort bzw. dem Fehler angezeigt. Eine verworfene Zustellung erscheint dort als endgültiger Fehlschlag.Payload-Größe
Es gibt keine feste Größenbeschränkung, und Payloads werden nie gekürzt. Bei Abonnements, die über die External Pharmacy API oder das Apothekenportal registriert wurden, enthalten Bestell-Payloads das signierte Rezept-PDF direkt, Base64-kodiert indata.prescription_file.content_base64 — nie als Link. Es ist ein PDF pro Bestellung, das in pharmacy_order_created und in jedem pharmacy_order_updated mitgesendet wird. Bei Bestellungen, die nur rezeptfreie Produkte enthalten, ist prescription_file null. Zustellungen auf Organisationsebene (Management API) enthalten prescription_file nicht.
Payloads sind typischerweise einige hundert Kilobyte groß, hochgeladene oder extern signierte Rezept-PDFs können aber deutlich größer sein. Konfigurieren Sie Ihren Endpoint — und vorgeschaltete Proxys oder Frameworks — so, dass er Anfragekörper von mindestens 10 MB annimmt. Eine 413-Antwort ist eine fehlgeschlagene Zustellung wie jede andere: Sie wird wiederholt und anschließend verworfen.