Webhook-Ereignisse
RxScale sendet Webhooks für die folgenden Ereignistypen:| Ereignistyp | Beschreibung |
|---|---|
pharmacy_order_created | Eine neue Apothekenbestellung wurde erstellt und Ihrer Apotheke zugewiesen |
pharmacy_order_updated | Der Status einer bestehenden Apothekenbestellung hat sich geändert |
pharmacy_sku_stock_updated | Der Lagerbestand einer Apotheken-SKU hat sich geändert |
appointment_reminder_due | Eine geplante Terminerinnerung ist fällig geworden |
patient_doctor_meeting_updated | Eine Patient-Arzt-Besprechung hat ihren Lebenszyklus-Status geändert |
HTTP-Header
Jede Webhook-Anfrage enthält die folgenden HTTP-Header:| Header | Beschreibung |
|---|---|
Content-Type | Immer application/json |
X-Webhook-Event | Der Ereignistyp (z.B. pharmacy_order_created) |
X-Webhook-Signature | HMAC-SHA256-Signatur des Anfrageinhalts (siehe Sicherheit) |
pharmacy_order_created
Wird gesendet, wenn eine neue Apothekenbestellung erstellt und Ihrer Apotheke zugewiesen wird. Möglichestatus-Werte: init, waiting for pharmacy, pending review, in-progress, ready_for_pickup, completed
Payload-Beispiel
Feldreferenz
| Feld | Typ | Beschreibung |
|---|---|---|
data.uid | string | UID der Apothekenbestellung |
data.status | string | Aktueller Bestellstatus |
data.name | string oder null | Lesbarer Bestellname (z.B. #1001) |
data.data | object | Benutzerdefinierte Daten der Bestellung |
data.external_status | string | Externer Status-Bezeichner |
data.created_at | integer | Unix-Zeitstempel der Erstellung |
data.updated_at | integer | Unix-Zeitstempel der letzten Aktualisierung |
data.deleted_at | integer oder null | Unix-Zeitstempel der Löschung oder null |
data.pharmacy | object | Apothekenzusammenfassung mit uid und display_name |
data.order | object | Übergeordnete Bestellung mit uid, delivery_address und invoice_address |
data.order.shipping_costs_amount | integer oder null | Versandkosten in Cent. null, wenn keine Versandkosten verfügbar sind. |
data.order.shipping_costs_currency | string oder null | ISO-4217-Währungscode der Versandkosten, z.B. EUR. |
data.order.priority | integer | Prioritätshinweis für die bevorzugte Bearbeitung. Höher = dringender. 0 bedeutet keine besondere Priorität. |
data.delivery_type | object oder null | Versandart mit uid, display_name und identifier. Wird aus der Fulfillment-Methode des verbundenen Shops (pro Shop konfiguriert) ermittelt, andernfalls aus der Standard-Versandart der empfangenden Apotheke. null, wenn keines von beiden gesetzt ist — gehen Sie nicht davon aus, dass immer eine Versandart vorhanden ist. |
data.shop_shipping_methods | array | Versandmethoden des verbundenen Shop-Bestellauftrags. Leeres Array, wenn keine Shop-Versandmethoden vorliegen. |
data.shop_shipping_methods[].uid | string | UID der Shop-Versandmethode |
data.shop_shipping_methods[].display_name | string | Anzeigename der Versandmethode aus dem Shop |
data.shop_shipping_methods[].external_id | string oder null | Bezeichner der Versandmethode im verbundenen Shop (z.B. der Shopify-Shipping-Line-Code) |
data.shop_shipping_methods[].pharmacy_mapping | object oder null | Apothekenspezifisches Mapping aus den RxScale-Apothekeneinstellungen, oder null, wenn für die empfangende Apotheke noch kein Mapping konfiguriert wurde. Konfiguriert wird dies im Apotheken-Bildschirm Einstellungen → Versandarten-Zuordnung. |
data.shop_shipping_methods[].pharmacy_mapping.pharmacy_uid | string | UID der empfangenden Apotheke, für die dieses Mapping gilt |
data.shop_shipping_methods[].pharmacy_mapping.shipping_method_identifier_for_pharmacy | string | Apothekenspezifischer Bezeichner, den die empfangende Apotheke für diese Versandmethode erwartet (z.B. DHL_STANDARD). Verwenden Sie diesen Wert, wenn Sie die Bestellung an Ihr nachgelagertes Versand-/Label-System übergeben. |
data.order_items | array | Artikel der Bestellung |
data.order_items[].sku | object | SKU-Informationen inkl. pzn, product_uid, product_display_name, standard_selling_unit, unit und product_handle |
data.order_items[].sku.standard_selling_unit | number oder null | Standard-Verkaufseinheit der SKU |
data.order_items[].sku.unit | string oder null | Einheit der SKU, z.B. ml oder g |
data.order_items[].pharmacy_sku | object oder null | Apothekenspezifische SKU-Daten mit uid, external_id, price (Cent), stock |
data.order_items[].total_paid_amount | integer oder null | Vom Patienten gezahlter Betrag für diese Position in Cent (brutto). null, wenn keine Zahlungsinformationen verfügbar sind. |
data.payouts | array | Auszahlungskomponenten für diese Apothekenbestellung, bei denen die aktuelle Apotheke der Receiver ist. Bezahlte Bestellungen mit physischem Rezept enthalten projected-Vorschauen auf Basis aktueller Werte und Routing-Konfiguration. Abgeschlossene Bestellungen enthalten routed-Auszahlungen, sobald eine persistierte Split-Payment-Route existiert. |
data.payouts[].status | string | projected für eine unverbindliche Vorschau oder routed für eine persistierte Split-Payment-Route, die nach Abschluss der Apothekenbestellung erstellt wurde. |
data.payouts[].amount | integer | Auszahlungsbetrag in Cent. |
data.payouts[].currency | string | ISO-4217-Währungscode, z.B. EUR. |
data.payouts[].component_type | string | Auszahlungskomponente. Mögliche Werte sind item_rest, item_markup und shipping. |
data.payouts[].routing_description | string oder null | Lesbare Beschreibung der gerouteten oder projizierten Komponente. |
data.payouts[].provider_route_id | string oder null | Routenbezeichner des Zahlungsanbieters. Befüllt bei gerouteten Auszahlungen, wenn der Anbieter einen Bezeichner zurückgegeben hat, und null bei projected-Auszahlungen. |
data.payouts[].pharmacy_order_uid | string | UID der zugehörigen Apothekenbestellung. |
data.payouts[].pharmacy_order_name | string oder null | Lesbarer Name der Apothekenbestellung. |
data.payouts[].pharmacy_order_created_at | integer | Unix-Zeitstempel der Erstellung der Apothekenbestellung. |
data.payouts[].routing_created_at | integer oder null | Unix-Zeitstempel der Erstellung der Split-Payment-Route. Bei projected-Auszahlungen ist dieser Wert null. |
data.patient_data | object oder null | Patienteninformationen mit uid, display_name, email, date_of_birth, phone_number |
data.doctor_data | object oder null | Arzt, der das Rezept signiert hat, mit uid und display_name |
data.prescription_file | object oder null | Signiertes Rezept-PDF mit filename und content_base64 |
data.prepaid | integer | 1 wenn die Bestellung ein physisches (vorausbezahltes) Rezept hat, sonst 0 |
pharmacy_order_updated
Wird gesendet, wenn sich der Status einer bestehenden Apothekenbestellung ändert. Die Payload-Struktur ist identisch mitpharmacy_order_created. Das Feld status enthält den neuen Status.
Payload-Beispiel
Webhooks auf Organisationsebene
Wenn das Webhook-Abonnement über die Management API (auf Organisationsebene) erstellt wurde, enthalten Bestellereignisse zusätzliche Daten:- Die
sku-Objekte inorder_itemsundfulfillment.itemswerden um Shopify-Bezeichner (shop_variation_id,shop_product_external_id) erweitert. - Ein
fulfillment-Objekt mit Details zur Fulfillment-Bestellung wird hinzugefügt.
| Feld | Typ | Beschreibung |
|---|---|---|
data.order_items[].sku.shop_variation_id | string oder null | Shopify-Varianten-ID |
data.order_items[].sku.shop_product_external_id | string oder null | Shopify-Produkt-ID |
data.fulfillment.uid | string | UID der Fulfillment-Bestellung |
data.fulfillment.external_id | string oder null | Externer Bezeichner der Fulfillment-Bestellung |
data.fulfillment.items[].order_item.sku.shop_variation_id | string oder null | Shopify-Varianten-ID |
data.fulfillment.items[].order_item.sku.shop_product_external_id | string oder null | Shopify-Produkt-ID |
data.fulfillment.order.uid | string | UID der übergeordneten Bestellung |
data.fulfillment.order.shop_order.uid | string | UID der Shop-Bestellung |
data.fulfillment.order.shop_order.external_id | string oder null | Externer Bezeichner der Shop-Bestellung |
data.fulfillment.order.shop_order.shop_identifier | string | Shop-Bezeichner |
Das
fulfillment-Feld und die Shopify-Bezeichner (shop_variation_id, shop_product_external_id) in sku-Objekten sind nur in Webhook-Zustellungen auf Organisationsebene enthalten. Webhooks auf Apothekenebene enthalten diese Felder nicht.pharmacy_sku_stock_updated
Wird gesendet, wenn sich der Lagerbestand einer Apotheken-SKU ändert. Dies umfasst:- Direkte Bestandsaktualisierungen über die Pharmacy-API (
PATCH /v1/.../pharmacy_skus/{uid}/stockoder Inventar-Endpunkte). - Automatische Bestandsreduzierung bei Abschluss einer Apothekenbestellung. Dies wird sowohl beim manuellen Abschluss (über die Apotheken-Oberfläche / API) als auch beim automatischen Abschluss ausgelöst, wenn RxScale über die Statusabfrage-Integration mit dem Backend der Apotheke erkennt, dass die Bestellung versendet oder abgeschlossen wurde. Pro Apotheken-SKU der abgeschlossenen Bestellung wird ein Event emittiert.
Payload-Beispiel
Feldreferenz
| Feld | Typ | Beschreibung |
|---|---|---|
data.uid | string | UID der Apotheken-SKU |
data.pharmacy_uid | string | UID der Apotheke |
data.sku_uid | string | UID der SKU |
data.external_id | string oder null | Externer Bezeichner in Ihrem eigenen System |
data.price | integer | Preis in Cent |
data.stock | integer | Aktueller Lagerbestand |
data.reserved_amount | integer | Für diese SKU reservierte Einheiten — Summe der Bestellpositionsmengen aller in Bearbeitung befindlichen Apothekenbestellungen (also Bestellungen, die weder abgeschlossen noch storniert sind). Verfügbarer Bestand kann als stock - reserved_amount berechnet werden. |
data.markup | integer | Aufschlagswert |
data.priority | integer | Prioritätsstufe |
data.type | string | Typ der Apotheken-SKU |
data.created_at | integer | Unix-Zeitstempel der Erstellung |
data.updated_at | integer | Unix-Zeitstempel der letzten Aktualisierung |
data.deleted_at | integer oder null | Unix-Zeitstempel der Löschung oder null |
data.sku | object | Verschachtelte SKU- und Produktinformationen |
data.sku.uid | string | UID der SKU |
data.sku.display_name | string | Anzeigename der SKU |
data.sku.pzn | string | Pharmazentralnummer (PZN) |
data.sku.product_uid | string | UID des übergeordneten Produkts |
data.sku.product_display_name | string oder null | Anzeigename des übergeordneten Produkts |
data.sku.standard_selling_unit | number oder null | Standard-Verkaufseinheit der SKU |
data.sku.unit | string oder null | Einheit der SKU, z.B. ml oder g |
data.sku.product_handle | string oder null | URL-Handle/Slug des übergeordneten Produkts |
Webhooks auf Organisationsebene
Wenn das Webhook-Abonnement über die Management API (auf Organisationsebene) erstellt wurde, enthalten Lagerbestandsereignisse zusätzliche Daten:- Das
sku-Objekt wird um Shopify-Bezeichner (shop_variation_id,shop_product_external_id) erweitert. - Ein
shop_identifier-Feld wird auf derdata-Ebene hinzugefügt.
| Feld | Typ | Beschreibung |
|---|---|---|
data.shop_identifier | string oder null | Shop-Bezeichner |
data.sku.shop_variation_id | string oder null | Shopify-Varianten-ID |
data.sku.shop_product_external_id | string oder null | Shopify-Produkt-ID |
Das
shop_identifier-Feld und die Shopify-Bezeichner (shop_variation_id, shop_product_external_id) im sku-Objekt sind nur in Webhook-Zustellungen auf Organisationsebene enthalten. Webhooks auf Apothekenebene enthalten diese Felder nicht.appointment_reminder_due
Wird gesendet, wenn eine konfigurierte Terminerinnerung fällig wird. Dieses Ereignis wird ausschließlich an Webhook-Abonnements auf Organisationsebene geliefert.Payload-Beispiel
Feldreferenz
| Feld | Typ | Beschreibung |
|---|---|---|
data.appointment_uid | string | UID des geplanten Termins |
data.organisation_uid | string | UID der Organisation, zu der der Termin gehört |
data.shop_uid | string oder null | Shop-UID des Patienten, falls verfügbar |
data.appointment_type_reminder_uid | string | UID der Erinnerungsregel |
data.recipient_role | string | Empfängerrolle: patient, doctor oder admin |
data.recipient_email | string oder null | Aufgelöste Empfänger-E-Mail, falls verfügbar |
data.recipient_phone_number | string oder null | Aufgelöste Empfänger-Telefonnummer, falls verfügbar |
data.recipient_display_name | string oder null | Aufgelöster Anzeigename des Empfängers |
data.patient_uid | string | Patientenprofil-UID |
data.patient_display_name | string | Anzeigename des Patienten |
data.doctor_uid | string | Arzt-UID |
data.doctor_display_name | string | Anzeigename des Arztes |
data.appointment_type_uid | string oder null | UID des Termintyps |
data.appointment_type_name | string oder null | Name des Termintyps |
data.visit_reason | string oder null | Optionaler bei der Buchung angegebener Termingrund |
data.start_date | integer | Startzeit des Termins (Unix-Zeitstempel) |
data.end_date | integer oder null | Endzeit des Termins (Unix-Zeitstempel), falls bekannt |
data.minutes_before | integer | Erinnerungsvorlauf in Minuten vor dem Termin |
data.send_email | boolean | Ob der RxScale-Notification-Handler für diese Erinnerung eine E-Mail senden soll |
data.send_sms | boolean | Ob der RxScale-Notification-Handler für diese Erinnerung eine SMS senden soll |
patient_doctor_meeting_updated
Wird gesendet, wenn eine Patient-Arzt-Besprechung ihren Lebenszyklus-Status ändert. Dieses Ereignis wird ausschließlich an Webhook-Abonnements auf Organisationsebene geliefert (registriert über die Management API). Möglichechange-Werte:
| Wert | Wann ausgelöst |
|---|---|
held | Ein geplanter Termin wurde gehalten (das Besprechungsfenster öffnete sich) |
confirmed | Ein geplanter Termin wurde bestätigt |
expired | Ein geplanter Termin ist abgelaufen, ohne beigetreten zu sein |
cancelled | Eine Besprechung wurde storniert |
rebooked | Eine Besprechung wurde umgebucht (eine neue Besprechung hat diese ersetzt) |
completed | Eine Besprechung wurde abgeschlossen — eine On-Demand-Besprechung endete oder ein Arzt hat einen bestätigten Termin als abgeschlossen erfasst |
no_show | Ein Arzt hat einen bestätigten Termin als Nichterscheinen erfasst (der Patient ist nicht erschienen) |
Verwenden Sie
change als maßgeblichen Indikator für das eingetretene Ereignis. status spiegelt den aktuellen Datenbankstatus der Besprechung wider und ist bei On-Demand-Besprechungen null.Payload-Beispiel
Feldreferenz
| Feld | Typ | Beschreibung |
|---|---|---|
data.organisation_uid | string | UID der Organisation, zu der die Besprechung gehört |
data.meeting_uid | string | Eindeutiger Bezeichner der Besprechung |
data.change | string | Der Lebenszyklus-Übergang, der dieses Ereignis ausgelöst hat — siehe Tabelle oben |
data.status | string oder null | Aktueller Status der Besprechung. null bei On-Demand-Besprechungen; verwenden Sie stattdessen change für die Logik |
data.meeting_type | string | Art der Besprechung (z.B. consultation) |
data.meeting_format | string | Format der Besprechung (z.B. digital) |
data.start_date | integer oder null | Unix-Zeitstempel des geplanten Starts (nur bei geplanten Terminen) |
data.end_date | integer oder null | Unix-Zeitstempel des geplanten Endes bei geplanten Terminen. Dies ist der ursprünglich geplante Endzeitpunkt, nicht das tatsächliche Ende |
data.estimated_duration_minutes | integer oder null | Geschätzte Dauer in Minuten |
data.confirmed_at | integer oder null | Unix-Zeitstempel der Bestätigung oder null |
data.cancelled_at | integer oder null | Unix-Zeitstempel der Stornierung oder null |
data.cancellation_reason | string oder null | Grund für die Stornierung oder null |
data.visit_reason | string oder null | Optionaler bei der Buchung angegebener Termingrund. Kann auch in Erinnerungen und synchronisierten Kalendereinladungen erscheinen |
data.expires_at | integer oder null | Unix-Zeitstempel, nach dem der Besprechungslink abläuft, oder null |
data.previous_meeting_uid | string oder null | UID der Besprechung, aus der diese umgebucht wurde, oder null. Gesetzt wenn change den Wert rebooked hat |
data.appointment_type_uid | string oder null | UID des Termintyps (nur bei geplanten Terminen) |
data.doctor_uid | string oder null | UID des zugeordneten Arztes |
data.patient_profile_uid | string | UID des Patientenprofils. Dies ist der einzige Patientenbezeichner im Payload — es werden keine personenbezogenen Daten (Name, Geburtsdatum oder Kontaktdaten) übermittelt |
Abonnieren
Abonnieren Sie über die Management API, um dieses Ereignis zu empfangen:Zustellung und Idempotenz
Webhooks werden mindestens einmal zugestellt. Ihr Endpunkt sollte Zustellungen als idempotent behandeln und die Kombination ausdata.meeting_uid und data.change als eindeutigen Schlüssel verwenden — erneut zugestellte Events tragen dieselben Werte.