Scheduling
Die Scheduling API ermöglicht patientenseitige Selbstbuchung für Videosprechstunden. Öffentliche Discovery-Endpunkte können mit einershop_uid aufgerufen werden. Buchungs- und Umbuchungsvorgänge nutzen entweder einen Organisations-API-Key oder einen kurzlebigen Patient Booking Token.
Authentifizierung
Die Scheduling API akzeptiert zwei Credentials. Die meisten Endpunkte akzeptieren beides; einige sind auf eines beschränkt.Patient Booking Tokens (empfohlen für Patientenflüsse)
Ein kurzlebiges JWT, das Ihr Partner-Backend für einen bestimmten Patienten ausstellt. Übergeben Sie es im HeaderX-RxScale-Booking-Token. Das Token wird gegen ein in RxScale hinterlegtes Organisations-Booking-Token-Secret verifiziert.
Algorithmus: HS256
JOSE-Header: muss kid enthalten — die key_id, die beim Provisionieren des Secrets zurückgegeben wurde.
Erforderliche Claims:
Booking-Token-Secrets werden in der RxScale-Datenbank verschlüsselt gespeichert. Nur Ihre
key_id liegt im Klartext für das Routing vor; der Secret-Wert wird sowohl bei der Token-Verifikation als auch beim Abruf durch einen Admin (Admin-Portal oder Secrets-API) im Speicher entschlüsselt. Rotieren Sie, indem Sie ein neues Secret provisionieren und das alte widerrufen, sobald Ihr Minter umgestellt ist.Organisations-API-Key
Senden SieX-API-Key: <key> statt des Booking Tokens für Server-zu-Server-Flüsse. Der Key benötigt die Berechtigung scheduling:write. Nutzen Sie das für Back-Office-Tools, skriptgesteuertes Umbuchen oder Operations-Skripte.
Terminarten auflisten
string
erforderlich
Shop-UID, mit der die Terminarten auf die richtige Organisation eingeschränkt werden.
hold_ttl_seconds, max_bookings_per_slot und keine weiteren
Terminierungs- oder Preisfelder der Terminart — dieser Endpunkt ist unauthentifiziert, und genau
diese Felder wären die Stellschrauben für eine Angreifer-Kampagne, die Slots blockiert. Falls Ihre
Integration diese Felder benötigt, verwenden Sie stattdessen GET /v1/management/scheduling/appointment-types mit einem Organisations-API-Key (siehe die
Management-API-Dokumentation).
Slots suchen
0 Minuten. Terminarten mit
selected_doctors_only liefern nur Ärzte mit aktiver arztspezifischer
Einstellung zurück.
string
erforderlich
string
erforderlich
int
erforderlich
Fensterstart (Unix-Sekunden).
int
erforderlich
Fensterende (Unix-Sekunden). Max. 31 Tage ab
from.string
Auf einen Arzt einschränken.
string
IANA-Zeitzone (z. B.
Europe/Berlin) zur Lokalisierung der Ausgabe. Standard ist Europe/Berlin. Jeder Slot enthält start_local/end_local in dieser Zone; start_date/end_date bleiben Unix-Sekunden.Booking Session erstellen
Verwenden Sie diesen Endpunkt beim Start der gehosteten UI oder des Widget-Skripts. Die Anfrage kann das signierte Patient Booking Token entweder inX-RxScale-Booking-Token oder im JSON-Body als booking_token enthalten.
string
erforderlich
booking für einen neuen Termin, rebooking für eine bestehende Buchung.string
Pflicht im
booking-Modus.int
Fensterstart (Unix-Sekunden). Pflicht im
booking-Modus.int
Fensterende (Unix-Sekunden). Pflicht im
booking-Modus.string
URL, zu der der Patient nach erfolgreicher Buchung weitergeleitet wird.
string
Patient Booking JWT, falls nicht im Header übergeben.
Booking Session abrufen
Die gehostete UI ruft diesen Endpunkt nur mit dem Launch-Code auf, um den Buchungskontext zu laden. Kein Auth-Header nötig — der Launch-Code selbst ist das Credential.patient_profile_uid und keine weiteren Patienten-Identifier, damit der Launch-Code gefahrlos durch die URL im Browser des Patienten geführt werden kann.
Abrechnung
billing ist immer vorhanden und beschreibt, was die Booking Session kostet.
lines— die berechneten Positionen in Anzeigereihenfolge.unit_amountist in der kleinsten Einheit der Währung angegeben (Cent),vat_rate_bpist ein Mehrwertsteuersatz in Basispunkten (1900= 19 %).nullbedeutet, dass keine Umsatzsteuer anfällt — das ist etwas anderes als ein echter Satz von 0 %.total— die Summe ausquantity × unit_amountüber alle Positionen, in derselben Einheit.currency— der ISO-4217-Code, in dem alle Positionen berechnet sind. Der Wert ist nur dannnull, wenn es überhaupt keine Währung zu melden gibt: bei einer Session ohne Positionen und ohne Terminart. Eine Session mit Positionen hat immer eine Währung — behandeln Sienullalso als „nichts zu berechnen“ und nicht als Standardwert.payment_required—false, wenn es keine Positionen gibt. Verzweigen Sie über dieses eine Flag: Eine Session mitpayment_required: falsewird genau wie bisher gebucht, ohne Zahlungsschritt. Sessions sind ohne Preis, sofern der Buchungslink nicht mit Preisen erzeugt wurde.test_mode—true, wenn die Zahlung dieser Buchung im Testmodus des Zahlungsanbieters läuft: Die Bezahlseite verhält sich wie im Echtbetrieb, der Patientin oder dem Patienten wird jedoch nichts berechnet und es erreicht kein Betrag die Organisation. Weisen Sie darauf hin — die gehostete Buchungs-UI von RxScale zeigt im Zahlungsschritt einen entsprechenden Hinweis. Der Wert ist immerfalse, wennpayment_requiredfalseist: Ein Link ohne Preis zieht überhaupt keine Zahlung ein und hat damit auch keinen Modus. Ältere Stände dieser API liefern das Feld gar nicht — behandeln Sie ein fehlendestest_modealsfalse. Der Wert wird bei jeder Anfrage neu aus der Terminart abgeleitet und beschreibt damit die Zahlung, die entstehen wird — sobald eine Zahlung existiert, lesen Sie stattdessentestmodean der Zahlung.
Holds erstellen und bestätigen
Authentifizierte Integrationen können Holds mit einem API-Key mitscheduling:write anlegen. Gehostete-UI-Integrationen nutzen die booking_launch_code-Routen.
string
erforderlich
string
erforderlich
int
erforderlich
Unix-Sekunden.
string
Optionaler Grund für den Termin, bis zu 2000 Zeichen. Leere Werte werden als
null gespeichert. Stammt die Sitzung aus einem öffentlichen Buchungslink — dem nicht authentifizierten, per Magic-Link verifizierten Buchungsablauf —, gilt stattdessen eine Grenze von 500 Zeichen; enthält der Wert eine URL — auch eine mit unsichtbaren oder Vollbreitenzeichen getarnte — oder Steuer-, Formatierungs- bzw. Schreibrichtungszeichen, wird die Anfrage mit 400 abgelehnt.string
Optional. Derselbe Key mit identischem Body liefert den bestehenden Hold zurück, statt einen neuen anzulegen.
string
Optionaler Grund für den Termin, bis zu 2000 Zeichen. Wird dieses Feld weggelassen, bleibt der beim Erstellen des Holds gesetzte Wert erhalten; ein leerer Wert löscht ihn. Dieselbe Grenze für öffentliche Buchungslinks gilt auch hier: 500 Zeichen; die Anfrage wird mit
400 abgelehnt, wenn der Wert eine URL — auch eine mit unsichtbaren oder Vollbreitenzeichen getarnte — oder Steuer-, Formatierungs- bzw. Schreibrichtungszeichen enthält.Wenn ein Hold abgelaufen ist, der Slot aber noch nicht durch einen anderen Termin belegt wurde, ist die Bestätigung weiterhin möglich und der Termin wechselt in den Status
confirmed.Wenn
visit_reason gesetzt ist, ist der Grund für Ärzte/Admins sichtbar und kann in Termin-Erinnerungen per E-Mail/SMS sowie in synchronisierten Kalendereinladungen erscheinen. Er kann beim Erstellen des Holds gesetzt und beim Bestätigen bearbeitet oder gelöscht werden — ein Request-Body ohne visit_reason lässt den vorhandenen Wert unverändert.Hold bezahlen
Kostenpflichtige Buchungslinks (billing.payment_required: true) erfordern eine Zahlung, bevor
der Termin bestätigt wird. Die Patientin oder der Patient wird auf eine gehostete
Mollie-Bezahlseite geleitet; RxScale bestätigt den Termin selbst, sobald das Geld tatsächlich
eingegangen ist. Auf diesem Weg gibt es keinen Bestätigungsaufruf — rufen Sie den
Confirm-Endpunkt für eine kostenpflichtige Session nicht auf.
Zahlungen werden über das eigene verbundene Mollie-Konto der Organisation eingezogen. Die
Organisation verbindet es einmalig im RxScale-Adminportal.
Testzahlungen. Ist
billing.test_mode true, wird die Zahlung im Testmodus des
Zahlungsanbieters erstellt: Die Bezahlseite sieht aus und verhält sich genau wie im Echtbetrieb,
es wird jedoch nichts berechnet, nichts an die Organisation ausgezahlt und es gibt nichts
abzustimmen. Alles Weitere auf dieser Seite — die Statuswerte, das Abfragen des Zahlungsstatus,
der Callback, das Erstattungsverhalten — funktioniert identisch; genau das macht einen Testlauf
aussagekräftig. Die RxScale-Plattformgebühr wird auf der Zahlung weiterhin ausgewiesen,
tatsächlich einbehalten wird sie aber nicht, weil kein Geld geflossen ist. Siehe Bezahlte Buchungen vor dem Go-live durchspielen.Zahlung starten
string
erforderlich
UID des für diese Session erstellten Holds.
checkout_url. amount ist in der kleinsten
Währungseinheit angegeben — 4900 sind 49,00 €.
testmode ist der Modus, in dem diese Zahlung erstellt wurde. Er steht mit dem Anlegen fest und
wird nie neu abgeleitet; lesen Sie deshalb auf jedem Bildschirm nach einer Zahlung diesen Wert und
nicht billing.test_mode — dieser meldet die aktuelle Einstellung der Terminart und kann sich
ändern, während die Patientin oder der Patient noch auf der Bezahlseite ist. API-Versionen vor
diesem Feld senden den Schlüssel gar nicht; behandeln Sie ein fehlendes testmode als „keine
Angabe“ und greifen Sie auf billing.test_mode zurück, niemals als false.
Das Starten einer Zahlung verlängert den Hold, damit er nicht ablaufen kann, während die
Bezahlseite geöffnet ist. Ein zweiter Aufruf für denselben Hold liefert dieselbe
checkout_url mit 200 statt 201, sodass ein Doppelklick oder der Zurück-Button des
Browsers keine zwei bezahlbaren Links für einen Termin erzeugen kann.
Zahlungsstatus abfragen
appointment_status aus. Er wird confirmed, sobald das Geld eingegangen ist und
der Slot noch verfügbar war.
appointment_start (Epoch-Sekunden) und doctor_display_name beschreiben den gebuchten Termin,
sodass Sie ohne zweite Anfrage anzeigen können, wofür gerade bezahlt wurde. Beide sind null,
solange appointment_status nicht confirmed ist — auch während die Zahlung noch open ist,
und im Fall refund_required, in dem kein Termin existiert, der beschrieben werden könnte.
doctor_display_name kann außerdem bei einem bestätigten Termin null sein, wenn die Ärztin
oder der Arzt die Praxis inzwischen verlassen hat; behandeln Sie den Wert als Best-Effort und
verwenden Sie ersatzweise eine allgemeine Bezeichnung.
refund_required ist selten, aber real. Behandeln Sie es als „Zahlung erfolgreich, Buchung
nicht“ und niemals als erfolgreiche Buchung.Callback des Zahlungsanbieters
webhook_token im Pfad — ein langer Zufallswert, der pro Zahlung erzeugt wird, von
keiner API-Antwort zurückgegeben wird und nur RxScale und dem Zahlungsanbieter bekannt ist. Der
Anfragetext dient ausschließlich dazu, die betroffene Zahlung zu identifizieren; das
tatsächliche Ergebnis wird immer über einen authentifizierten Aufruf beim Anbieter
zurückgelesen, sodass eine gefälschte Anfrage nichts als bezahlt markieren kann.
Termin stornieren
Storniert einen bestätigten oder gehaltenen Termin. Akzeptiert entweder ein Booking Token (patientenseitige Stornierung) oder einen Organisations-API-Key (Operations).string
Optionaler Freitext-Grund. Wird am Termin für Audit-Zwecke gespeichert.
cancellation_min_notice_minutes der Terminart. Eine Stornierung innerhalb der Frist gibt 400 mit dem betroffenen Feld zurück; buchen Sie den Patienten um oder rufen Sie den Endpunkt mit einem API-Key auf, wenn ein operativer Override nötig ist.
Termin umbuchen
Verschiebt einen bestehenden Termin auf einen neuen Slot. Der Rebook-Flow legt atomar einen neuen Termin an (mitprevious_meeting_uid auf den Originaltermin) und storniert den alten.
int
erforderlich
Unix-Sekunden für den neuen Slot.
string
Pflicht, wenn die Terminart
rebooking_mode: any_doctor setzt. Bei same_doctor_only wird der ursprüngliche Arzt übernommen.string
Optional. Standard ist die ursprüngliche Terminart.
string
Dringend empfohlen — schützt vor doppelten Umbuchungen bei Retries.
allow_patient_rebooking: false setzt, rebooking_min_notice_minutes nicht eingehalten ist oder der neue Slot bereits belegt ist.
Join-Token abrufen
Liefert ein kurzlebiges Jitsi-Waiting-Room-JWT und den Raumnamen. Wird von der Patient-UI verwendet, um den Videocall zu starten.Patienten-Meeting-Link zusammensetzen
Die Antwort enthält keinen fertigen Link. Ihre Integration muss ihn selbst zusammenbauen:return_url-Query-Parameter anhängen, um den Patienten nach dem
Gesprächsende zurück auf Ihre Plattform weiterzuleiten:
string
erforderlich
Der
token-Wert aus der Antwort dieses Endpunkts. Von RxScale signiert; nicht verändern.string
URL, zu der der Patient nach dem Gesprächsende weitergeleitet wird. Die Weiterleitung erfolgt
nur, wenn der Origin der URL (Schema + Host + Port) auf der admin-konfigurierten
Allowlist der Organisation steht. Ist der Origin nicht auf der Liste oder wird kein
return_url übergeben, kehrt der Patient einfach zur vorherigen Seite zurück. Konfigurieren
Sie die Allowlist im Admin-Portal unter Einstellungen → Rückleitungs-URLs.Dieses
return_url dient ausschließlich der Navigation nach dem Call auf der Meeting-Seite.
Es ist vom return_url im Booking-Session-Body zu unterscheiden, das den Patienten nach
einer erfolgreichen Buchung weiterleitet. Verwechseln Sie beide nicht.Join-Fenster
Der Endpunkt akzeptiert Join-Anfragen ab 10 Minuten vorstart_date des Termins bis 60 Minuten nach end_date. Anfragen außerhalb dieses Fensters liefern:
Gehostete UI
Leiten Sie den Patienten auf dielaunch_url aus der Booking-Session-Antwort weiter oder binden Sie das Widget-Skript ein:
Aktions-Links in Terminerinnerungen
Diese Endpunkte werden von der RxScale-gehosteten Meetings-UI aufgerufen, wenn ein Patient einen
Beitreten-, Umbuchen- oder Stornieren-Link aus einer Termin-Erinnerung per E-Mail
oder SMS öffnet. Partner rufen sie nicht direkt auf — sie sind hier der Vollständigkeit halber
dokumentiert.
code. Der Code selbst ist das Credential — weder ein API-Key
noch ein Patient Booking Token wird auf diesen Routen benötigt oder akzeptiert.
Aktions-Link-Kontext abrufen
Lädt den Anzeigekontext, den die gehostete UI benötigt, um die Landing-Page der Erinnerung zu rendern.404.
Beitreten
Liefert dieselbe Waiting-Room-Token-Struktur wie Join-Token abrufen. Wiederverwendbar, solange das Join-Fenster offen bleibt.400, wenn der Aufruf außerhalb des Join-Fensters erfolgt (10 Minuten vor
appointment_start bis 60 Minuten nach appointment_end).
Stornieren
string
Optionaler Freitext-Grund.
409 — ebenso,
wenn der Termin aus einem anderen Grund nicht mehr storniert werden kann (bereits
abgeschlossen oder außerhalb der Stornierungsfrist). Dies ist der einzige der vier Endpunkte,
der ein patient_doctor_meeting_updated-Event mit change: "cancelled" auslöst.
Umbuchungs-Session starten
Legt eine gehostete Booking-Session imrebook-Modus an, damit der Patient über denselben
gehosteten Buchungsflow einen neuen Slot wählen kann, der unter
Booking Session erstellen beschrieben ist.
booking_launch_code zurück, statt einen neuen zu erzeugen, und verbraucht dabei nicht den
Aktions-Link-Code der Erinnerung. Der ursprüngliche Termin bleibt aktiv, bis der Patient
tatsächlich einen neuen Slot bestätigt: erst dann wird er storniert und ersetzt, wobei ein
rebooked-Event ausgelöst wird.
Arztportal-Endpunkte
Diese Endpunkte sind auf den authentifizierten Arzt (Auth0-Token) eingeschränkt und werden vom RxScale-Arztportal genutzt. Partner müssen sie in der Regel nicht direkt aufrufen.Geplante Termine auflisten
status, from, to, patient_uid, page, limit.
Die Antwort enthält ausschließlich Termine des authentifizierten Arztes.
Verfügbarkeits-CRUD
weekday (0 = Montag … 6 = Sonntag), start_time und end_time in Minuten seit
Mitternacht, optional buffer_minutes zwischen Slots sowie optionale Gültigkeitsgrenzen
valid_from / valid_until (Unix-Sekunden). PATCH-Bodies sind partiell; mit
clear_valid_from: true oder clear_valid_until: true lassen sich gesetzte Grenzen entfernen.
DELETE ist ein Soft-Delete.
Admin-Endpunkte
Auf die authentifizierte Admin-Organisation (Auth0-Token) eingeschränkt.Termine auflisten
doctor_uid, patient_uid, status, from, to, page, limit. Standard:
aktive (gehalten + bestätigt) Termine ab jetzt; mit status=all und from=0 lässt sich die
Historie einsehen.
Termin stornieren
{"reason": "..."} erforderlich.
Terminart-Erinnerungen
recipient_role (patient / doctor / admin), minutes_before (positive
ganze Zahl bis 60 Tage), send_email, send_sms und active. Mehrere Erinnerungen pro
(appointment_type, recipient_role) sind erlaubt, solange sich der minutes_before-Offset
unterscheidet.
Ein Maintenance-Job läuft jede Minute, findet bestätigte Termine, deren Auslösefenster “jetzt”
umfasst, und publiziert pro auflösbarem Empfänger ein scheduling.appointment_reminder_due-Event.
Das Event feuert immer (Partner-Webhook-Subscriber erhalten es); der RxScale-eigene
Notification-Handler verschickt E-Mail/SMS nur, wenn die jeweiligen Flags send_email /
send_sms auf der Erinnerungszeile gesetzt sind.
Wenn der Termin einen visit_reason hat, enthalten das Reminder-Event und die RxScale-E-Mail/SMS-Inhalte diesen Grund.
Partner abonnieren das Event über den bestehenden Endpunkt für Organisations-
Benachrichtigungs-Abonnements mit notification_type=APPOINTMENT_REMINDER_DUE.
Verfügbarkeiten eines Arztes ansehen
404 zurück, wenn der
Arzt nicht in der Organisation des Admins ist.
Booking-Token-Secrets
POST legt ein neues Secret an und gibt {key_id, secret} zurück. GET liefert den Wert
entschlüsselt zurück — Secrets liegen verschlüsselt in der Datenbank, sind aber von Admins
jederzeit über die API und das Admin-Portal (Einstellungen → Buchungs-Secrets) wieder lesbar,
damit ein neuer Minter ohne Neu-Provisionierung konfiguriert werden kann. DELETE widerruft
das Secret.
Die legacy organisations-gebundenen Pfade
(/v1/admin/scheduling/organisations/{organisation_uid}/booking-token-secrets[/<key_id>])
werden weiterhin akzeptiert und gegen die authentifizierte Organisation validiert.