TheraPlanner API v1

Öffentliche API der Praxisverwaltung TheraPlanner.

Grundadresse: https://app.theraplanner.de/api/v1

Anmeldung: Bearer-Token im Kopfeintrag Authorization. Ein persönliches Zugangstoken. Es gehört zu genau einer Praxis; die Praxis wird daraus gelesen und steht nie in der URL.

Diese Seite wird bei jedem Aufruf aus der erzeugten Beschreibung gebaut und kann deshalb nicht veralten. Die Beschreibung selbst gibt es hier: openapi.json - daraus erzeugen die üblichen Werkzeuge Typen und Aufrufgerüste.

Patient:innen

GET /patients Akten auflisten

Umfang des Tokens: patients:read

Parameter

NameOrtTypBedeutung
status Abfrage string Aktenstatus, kommagetrennt. Ohne Angabe nur active und inactive.
birthDateFrom Abfrage string Geburtsdatum ab (JJJJ-MM-TT).
birthDateTo Abfrage string Geburtsdatum bis (JJJJ-MM-TT).
limit Abfrage integer Seitengröße. mindestens 1 · höchstens 100 · Voreinstellung: 25
cursor Abfrage string Unverändert aus links.next der vorherigen Antwort. Es gibt keinen Offset: er wäre bei nebenläufigen Änderungen falsch.
sort Abfrage string Sortierung, kommagetrennt, "-" für absteigend. Erlaubt: createdAt, updatedAt, birthDate, status. Nicht sortierbar, weil verschlüsselt gespeichert: lastName, firstName, email, phone, mobile, city, postalCode, street. Ein anderes Feld wird mit 422 ABGEWIESEN und nicht ignoriert.
include Abfrage string Verknüpfte Objekte, kommagetrennt: consents.

Antwort 200 (application/json)

data trägt eine Liste von Patient.

Fehler

400 Fehlender Pflicht-Kopfeintrag, etwa Idempotency-Key. 401 Kein gültiges Token. 403 Umfang des Tokens oder Berechtigung des Kontos reicht nicht. 404 Nicht vorhanden - auch dann, wenn die Kennung zu einer anderen Praxis gehört. 409 Fachlicher Konflikt (Terminkollision, ausgeschöpftes Kontingent, Idempotenzschlüssel). 412 If-Match passt nicht mehr: der Datensatz wurde zwischenzeitlich geändert. 422 Eingabe oder Abfrageparameter nicht annehmbar. 428 If-Match fehlt. 429 Ratenbegrenzung je Token oder je Praxis greift.
POST /patients Akte anlegen

Umfang des Tokens: patients:write

Parameter

NameOrtTypBedeutung
Idempotency-Key * Kopfeintrag string Pflicht. Eine Wiederholung mit demselben Schlüssel liefert die erste Antwort erneut, statt einen zweiten Datensatz anzulegen. höchstens 255 Zeichen

Rumpf (Pflicht, application/json)

FeldTypBedeutung
lastName* string höchstens 120 Zeichen
firstName* string höchstens 120 Zeichen
gender string, oder leer Auswahl: M, F, D
birthDate date-time, oder leer
status string, oder leer Auswahl: active, inactive, archived, merged
guardianFirstName string, oder leer höchstens 120 Zeichen
guardianLastName string, oder leer höchstens 120 Zeichen
guardianGender string, oder leer Auswahl: M, F, D
healthInsurance string, oder leer höchstens 190 Zeichen
insuranceType string, oder leer Auswahl: public, public_additional, private, private_assistance
phone string, oder leer höchstens 40 Zeichen
mobile string, oder leer höchstens 40 Zeichen
email email, oder leer höchstens 190 Zeichen
street string, oder leer höchstens 190 Zeichen
postalCode string, oder leer höchstens 16 Zeichen
city string, oder leer höchstens 120 Zeichen
doctor string, oder leer höchstens 190 Zeichen
diagnosis string, oder leer höchstens 2000 Zeichen
anamnesis string, oder leer höchstens 5000 Zeichen
notes string, oder leer höchstens 5000 Zeichen

* Pflichtfeld beziehungsweise immer vorhanden.

Antwort 201 (application/json)

data trägt Patient. Kopfeinträge: ETag.

Fehler

400 Fehlender Pflicht-Kopfeintrag, etwa Idempotency-Key. 401 Kein gültiges Token. 403 Umfang des Tokens oder Berechtigung des Kontos reicht nicht. 404 Nicht vorhanden - auch dann, wenn die Kennung zu einer anderen Praxis gehört. 409 Fachlicher Konflikt (Terminkollision, ausgeschöpftes Kontingent, Idempotenzschlüssel). 412 If-Match passt nicht mehr: der Datensatz wurde zwischenzeitlich geändert. 422 Eingabe oder Abfrageparameter nicht annehmbar. 428 If-Match fehlt. 429 Ratenbegrenzung je Token oder je Praxis greift.
GET /patients/{patient} Akte lesen

Umfang des Tokens: patients:read

Parameter

NameOrtTypBedeutung
patient * Pfad string Öffentliche Kennung (ULID).

Antwort 200 (application/json)

data trägt Patient. Kopfeinträge: ETag.

Fehler

400 Fehlender Pflicht-Kopfeintrag, etwa Idempotency-Key. 401 Kein gültiges Token. 403 Umfang des Tokens oder Berechtigung des Kontos reicht nicht. 404 Nicht vorhanden - auch dann, wenn die Kennung zu einer anderen Praxis gehört. 409 Fachlicher Konflikt (Terminkollision, ausgeschöpftes Kontingent, Idempotenzschlüssel). 412 If-Match passt nicht mehr: der Datensatz wurde zwischenzeitlich geändert. 422 Eingabe oder Abfrageparameter nicht annehmbar. 428 If-Match fehlt. 429 Ratenbegrenzung je Token oder je Praxis greift.
PATCH /patients/{patient} Akte ändern

Umfang des Tokens: patients:write

Parameter

NameOrtTypBedeutung
patient * Pfad string Öffentliche Kennung (ULID).
If-Match * Kopfeintrag string Pflicht. Das ETag aus dem letzten Lesen. Ohne den Kopfeintrag: 428, bei veraltetem Wert: 412.

Rumpf (Pflicht, application/json)

FeldTypBedeutung
lastName string höchstens 120 Zeichen
firstName string höchstens 120 Zeichen
gender string, oder leer Auswahl: M, F, D
birthDate date-time, oder leer
status string Auswahl: active, inactive, archived, merged
guardianFirstName string, oder leer höchstens 120 Zeichen
guardianLastName string, oder leer höchstens 120 Zeichen
guardianGender string, oder leer Auswahl: M, F, D
healthInsurance string, oder leer höchstens 190 Zeichen
insuranceType string, oder leer Auswahl: public, public_additional, private, private_assistance
phone string, oder leer höchstens 40 Zeichen
mobile string, oder leer höchstens 40 Zeichen
email email, oder leer höchstens 190 Zeichen
street string, oder leer höchstens 190 Zeichen
postalCode string, oder leer höchstens 16 Zeichen
city string, oder leer höchstens 120 Zeichen
doctor string, oder leer höchstens 190 Zeichen
diagnosis string, oder leer höchstens 2000 Zeichen
anamnesis string, oder leer höchstens 5000 Zeichen
notes string, oder leer höchstens 5000 Zeichen

* Pflichtfeld beziehungsweise immer vorhanden.

Antwort 200 (application/json)

data trägt Patient. Kopfeinträge: ETag.

Fehler

400 Fehlender Pflicht-Kopfeintrag, etwa Idempotency-Key. 401 Kein gültiges Token. 403 Umfang des Tokens oder Berechtigung des Kontos reicht nicht. 404 Nicht vorhanden - auch dann, wenn die Kennung zu einer anderen Praxis gehört. 409 Fachlicher Konflikt (Terminkollision, ausgeschöpftes Kontingent, Idempotenzschlüssel). 412 If-Match passt nicht mehr: der Datensatz wurde zwischenzeitlich geändert. 422 Eingabe oder Abfrageparameter nicht annehmbar. 428 If-Match fehlt. 429 Ratenbegrenzung je Token oder je Praxis greift.
GET /patients/{patient}/consents Einwilligungen auflisten

Umfang des Tokens: patients:read

Parameter

NameOrtTypBedeutung
patient * Pfad string Öffentliche Kennung (ULID).
limit Abfrage integer Seitengröße. mindestens 1 · höchstens 100 · Voreinstellung: 25
cursor Abfrage string Unverändert aus links.next der vorherigen Antwort. Es gibt keinen Offset: er wäre bei nebenläufigen Änderungen falsch.
sort Abfrage string Sortierung, kommagetrennt, "-" für absteigend. Erlaubt: createdAt, updatedAt, birthDate, status. Nicht sortierbar, weil verschlüsselt gespeichert: lastName, firstName, email, phone, mobile, city, postalCode, street. Ein anderes Feld wird mit 422 ABGEWIESEN und nicht ignoriert.
include Abfrage string Verknüpfte Objekte, kommagetrennt: consents.

Antwort 200 (application/json)

data trägt eine Liste von Consent.

Fehler

400 Fehlender Pflicht-Kopfeintrag, etwa Idempotency-Key. 401 Kein gültiges Token. 403 Umfang des Tokens oder Berechtigung des Kontos reicht nicht. 404 Nicht vorhanden - auch dann, wenn die Kennung zu einer anderen Praxis gehört. 409 Fachlicher Konflikt (Terminkollision, ausgeschöpftes Kontingent, Idempotenzschlüssel). 412 If-Match passt nicht mehr: der Datensatz wurde zwischenzeitlich geändert. 422 Eingabe oder Abfrageparameter nicht annehmbar. 428 If-Match fehlt. 429 Ratenbegrenzung je Token oder je Praxis greift.
POST /patients/{patient}/consents Einwilligung erteilen

Umfang des Tokens: patients:write

Parameter

NameOrtTypBedeutung
patient * Pfad string Öffentliche Kennung (ULID).
Idempotency-Key * Kopfeintrag string Pflicht. Eine Wiederholung mit demselben Schlüssel liefert die erste Antwort erneut, statt einen zweiten Datensatz anzulegen. höchstens 255 Zeichen

Rumpf (Pflicht, application/json)

FeldTypBedeutung
purpose* string Auswahl: appointment_reminder, invoice_delivery, document_delivery, practice_notice
channel* string Auswahl: sms, email, whatsapp
evidence string, oder leer höchstens 1000 Zeichen
note string, oder leer höchstens 1000 Zeichen

* Pflichtfeld beziehungsweise immer vorhanden.

Antwort 201 (application/json)

data trägt Consent. Kopfeinträge: ETag.

Fehler

400 Fehlender Pflicht-Kopfeintrag, etwa Idempotency-Key. 401 Kein gültiges Token. 403 Umfang des Tokens oder Berechtigung des Kontos reicht nicht. 404 Nicht vorhanden - auch dann, wenn die Kennung zu einer anderen Praxis gehört. 409 Fachlicher Konflikt (Terminkollision, ausgeschöpftes Kontingent, Idempotenzschlüssel). 412 If-Match passt nicht mehr: der Datensatz wurde zwischenzeitlich geändert. 422 Eingabe oder Abfrageparameter nicht annehmbar. 428 If-Match fehlt. 429 Ratenbegrenzung je Token oder je Praxis greift.
POST /patients/{patient}/consents/revoke Einwilligung widerrufen

Umfang des Tokens: patients:write

Parameter

NameOrtTypBedeutung
patient * Pfad string Öffentliche Kennung (ULID).
Idempotency-Key * Kopfeintrag string Pflicht. Eine Wiederholung mit demselben Schlüssel liefert die erste Antwort erneut, statt einen zweiten Datensatz anzulegen. höchstens 255 Zeichen

Rumpf (Pflicht, application/json)

FeldTypBedeutung
purpose* string Auswahl: appointment_reminder, invoice_delivery, document_delivery, practice_notice
channel* string Auswahl: sms, email, whatsapp
evidence string, oder leer höchstens 1000 Zeichen
note string, oder leer höchstens 1000 Zeichen

* Pflichtfeld beziehungsweise immer vorhanden.

Antwort 200 (application/json)

data trägt Consent. Kopfeinträge: ETag.

Fehler

400 Fehlender Pflicht-Kopfeintrag, etwa Idempotency-Key. 401 Kein gültiges Token. 403 Umfang des Tokens oder Berechtigung des Kontos reicht nicht. 404 Nicht vorhanden - auch dann, wenn die Kennung zu einer anderen Praxis gehört. 409 Fachlicher Konflikt (Terminkollision, ausgeschöpftes Kontingent, Idempotenzschlüssel). 412 If-Match passt nicht mehr: der Datensatz wurde zwischenzeitlich geändert. 422 Eingabe oder Abfrageparameter nicht annehmbar. 428 If-Match fehlt. 429 Ratenbegrenzung je Token oder je Praxis greift.

Dokumente

GET /patients/{patient}/documents Belege zu einer Akte

Umfang des Tokens: documents:read

Parameter

NameOrtTypBedeutung
patient * Pfad string Öffentliche Kennung (ULID).
limit Abfrage integer Seitengröße. mindestens 1 · höchstens 100 · Voreinstellung: 25
cursor Abfrage string Unverändert aus links.next der vorherigen Antwort. Es gibt keinen Offset: er wäre bei nebenläufigen Änderungen falsch.
sort Abfrage string Sortierung, kommagetrennt, "-" für absteigend. Erlaubt: createdAt, updatedAt, birthDate, status. Nicht sortierbar, weil verschlüsselt gespeichert: lastName, firstName, email, phone, mobile, city, postalCode, street. Ein anderes Feld wird mit 422 ABGEWIESEN und nicht ignoriert.
include Abfrage string Verknüpfte Objekte, kommagetrennt: consents.

Antwort 200 (application/json)

data trägt eine Liste von Document.

Fehler

400 Fehlender Pflicht-Kopfeintrag, etwa Idempotency-Key. 401 Kein gültiges Token. 403 Umfang des Tokens oder Berechtigung des Kontos reicht nicht. 404 Nicht vorhanden - auch dann, wenn die Kennung zu einer anderen Praxis gehört. 409 Fachlicher Konflikt (Terminkollision, ausgeschöpftes Kontingent, Idempotenzschlüssel). 412 If-Match passt nicht mehr: der Datensatz wurde zwischenzeitlich geändert. 422 Eingabe oder Abfrageparameter nicht annehmbar. 428 If-Match fehlt. 429 Ratenbegrenzung je Token oder je Praxis greift.
GET /patients/{patient}/files Abgelegte Dokumente einer Akte

Umfang des Tokens: documents:read

Parameter

NameOrtTypBedeutung
patient * Pfad string Öffentliche Kennung (ULID).

Antwort 200 (application/json)

data trägt eine Liste von PatientFile.

Fehler

400 Fehlender Pflicht-Kopfeintrag, etwa Idempotency-Key. 401 Kein gültiges Token. 403 Umfang des Tokens oder Berechtigung des Kontos reicht nicht. 404 Nicht vorhanden - auch dann, wenn die Kennung zu einer anderen Praxis gehört. 409 Fachlicher Konflikt (Terminkollision, ausgeschöpftes Kontingent, Idempotenzschlüssel). 412 If-Match passt nicht mehr: der Datensatz wurde zwischenzeitlich geändert. 422 Eingabe oder Abfrageparameter nicht annehmbar. 428 If-Match fehlt. 429 Ratenbegrenzung je Token oder je Praxis greift.
POST /patients/{patient}/files Direkt-Upload abschließen (Dokument ablegen)

Umfang des Tokens: documents:write

Parameter

NameOrtTypBedeutung
patient * Pfad string Öffentliche Kennung (ULID).
Idempotency-Key * Kopfeintrag string Pflicht. Eine Wiederholung mit demselben Schlüssel liefert die erste Antwort erneut, statt einen zweiten Datensatz anzulegen. höchstens 255 Zeichen

Rumpf (Pflicht, application/json)

FeldTypBedeutung
upload* string höchstens 4096 Zeichen
title* string höchstens 255 Zeichen
category* string Auswahl: doctor_letter, prescription, finding, certificate, consent, photo, correspondence, other
issuedOn date, oder leer
isClinical boolean, oder leer

* Pflichtfeld beziehungsweise immer vorhanden.

Antwort 201 (application/json)

data trägt PatientFile. Kopfeinträge: ETag.

Fehler

400 Fehlender Pflicht-Kopfeintrag, etwa Idempotency-Key. 401 Kein gültiges Token. 403 Umfang des Tokens oder Berechtigung des Kontos reicht nicht. 404 Nicht vorhanden - auch dann, wenn die Kennung zu einer anderen Praxis gehört. 409 Fachlicher Konflikt (Terminkollision, ausgeschöpftes Kontingent, Idempotenzschlüssel). 412 If-Match passt nicht mehr: der Datensatz wurde zwischenzeitlich geändert. 422 Eingabe oder Abfrageparameter nicht annehmbar. 428 If-Match fehlt. 429 Ratenbegrenzung je Token oder je Praxis greift.
POST /patients/{patient}/files/uploads Direkt-Upload vorbereiten (vorsignierte Adresse)

Umfang des Tokens: documents:write

Parameter

NameOrtTypBedeutung
patient * Pfad string Öffentliche Kennung (ULID).

Rumpf (Pflicht, application/json)

FeldTypBedeutung
name* string höchstens 255 Zeichen
size* integer mindestens 1 · höchstens 99614720
type string, oder leer höchstens 100 Zeichen

* Pflichtfeld beziehungsweise immer vorhanden.

Antwort 201 (application/json)

data trägt FileUpload. Kopfeinträge: ETag.

Fehler

400 Fehlender Pflicht-Kopfeintrag, etwa Idempotency-Key. 401 Kein gültiges Token. 403 Umfang des Tokens oder Berechtigung des Kontos reicht nicht. 404 Nicht vorhanden - auch dann, wenn die Kennung zu einer anderen Praxis gehört. 409 Fachlicher Konflikt (Terminkollision, ausgeschöpftes Kontingent, Idempotenzschlüssel). 412 If-Match passt nicht mehr: der Datensatz wurde zwischenzeitlich geändert. 422 Eingabe oder Abfrageparameter nicht annehmbar. 428 If-Match fehlt. 429 Ratenbegrenzung je Token oder je Praxis greift.

Termine

GET /appointments Termine auflisten

Umfang des Tokens: appointments:read

Parameter

NameOrtTypBedeutung
from Abfrage string Beginn des Zeitraums (ISO 8601), einschließlich.
until Abfrage string Ende des Zeitraums (ISO 8601), ausschließlich.
status Abfrage string Terminstatus, kommagetrennt.
patientId Abfrage string Auf eine Akte einschränken (ULID).
practitionerId Abfrage string Auf eine behandelnde Person einschränken (ULID).
roomId Abfrage string Auf einen Raum einschränken (ULID).
locationId Abfrage string Auf einen Standort einschränken (ULID). Über den Raum - Termine ohne Raum fallen heraus.
limit Abfrage integer Seitengröße. mindestens 1 · höchstens 100 · Voreinstellung: 25
cursor Abfrage string Unverändert aus links.next der vorherigen Antwort. Es gibt keinen Offset: er wäre bei nebenläufigen Änderungen falsch.
sort Abfrage string Sortierung, kommagetrennt, "-" für absteigend. Erlaubt: startsAt, endsAt, createdAt, updatedAt, status. Nicht sortierbar, weil verschlüsselt gespeichert: treatmentNote, internalNote, cancellationReason. Ein anderes Feld wird mit 422 ABGEWIESEN und nicht ignoriert.
include Abfrage string Verknüpfte Objekte, kommagetrennt: patient, type, practitioner, room.

Antwort 200 (application/json)

data trägt eine Liste von Appointment.

Fehler

400 Fehlender Pflicht-Kopfeintrag, etwa Idempotency-Key. 401 Kein gültiges Token. 403 Umfang des Tokens oder Berechtigung des Kontos reicht nicht. 404 Nicht vorhanden - auch dann, wenn die Kennung zu einer anderen Praxis gehört. 409 Fachlicher Konflikt (Terminkollision, ausgeschöpftes Kontingent, Idempotenzschlüssel). 412 If-Match passt nicht mehr: der Datensatz wurde zwischenzeitlich geändert. 422 Eingabe oder Abfrageparameter nicht annehmbar. 428 If-Match fehlt. 429 Ratenbegrenzung je Token oder je Praxis greift.
POST /appointments Termin anlegen

Umfang des Tokens: appointments:write

Parameter

NameOrtTypBedeutung
Idempotency-Key * Kopfeintrag string Pflicht. Eine Wiederholung mit demselben Schlüssel liefert die erste Antwort erneut, statt einen zweiten Datensatz anzulegen. höchstens 255 Zeichen

Rumpf (Pflicht, application/json)

FeldTypBedeutung
appointmentTypeId* ulid
practitionerId* ulid
startsAt* date-time
durationMinutes integer, oder leer mindestens 1 · höchstens 1440
patientId ulid, oder leer
roomId ulid, oder leer
title string, oder leer höchstens 190 Zeichen
treatmentNote string, oder leer höchstens 5000 Zeichen
internalNote string, oder leer höchstens 5000 Zeichen

* Pflichtfeld beziehungsweise immer vorhanden.

Antwort 201 (application/json)

data trägt Appointment. Kopfeinträge: ETag.

Fehler

400 Fehlender Pflicht-Kopfeintrag, etwa Idempotency-Key. 401 Kein gültiges Token. 403 Umfang des Tokens oder Berechtigung des Kontos reicht nicht. 404 Nicht vorhanden - auch dann, wenn die Kennung zu einer anderen Praxis gehört. 409 Fachlicher Konflikt (Terminkollision, ausgeschöpftes Kontingent, Idempotenzschlüssel). 412 If-Match passt nicht mehr: der Datensatz wurde zwischenzeitlich geändert. 422 Eingabe oder Abfrageparameter nicht annehmbar. 428 If-Match fehlt. 429 Ratenbegrenzung je Token oder je Praxis greift.
GET /appointments/free-slots Freie Zeitfenster berechnen

Umfang des Tokens: appointments:read

Parameter

NameOrtTypBedeutung
appointmentTypeId Abfrage string Terminart (ULID). Pflicht - sie bestimmt Dauer und Rüstzeiten.
practitionerId Abfrage string Behandelnde Person (ULID). Pflicht.
from Abfrage string Beginn des Zeitraums (ISO 8601). Pflicht.
until Abfrage string Ende des Zeitraums (ISO 8601). Pflicht, höchstens 92 Tage nach "from".
roomId Abfrage string Auf einen Raum einschränken (ULID).
durationMinutes Abfrage string Abweichende Dauer.
stepMinutes Abfrage string Schrittweite des Rasters.
limit Abfrage string Höchstzahl an Fenstern.
limit Abfrage integer Seitengröße. mindestens 1 · höchstens 100 · Voreinstellung: 25
cursor Abfrage string Unverändert aus links.next der vorherigen Antwort. Es gibt keinen Offset: er wäre bei nebenläufigen Änderungen falsch.
sort Abfrage string Sortierung, kommagetrennt, "-" für absteigend. Erlaubt: startsAt, endsAt, createdAt, updatedAt, status. Nicht sortierbar, weil verschlüsselt gespeichert: treatmentNote, internalNote, cancellationReason. Ein anderes Feld wird mit 422 ABGEWIESEN und nicht ignoriert.
include Abfrage string Verknüpfte Objekte, kommagetrennt: patient, type, practitioner, room.

Antwort 200 (application/json)

data trägt eine Liste von FreeSlot.

Fehler

400 Fehlender Pflicht-Kopfeintrag, etwa Idempotency-Key. 401 Kein gültiges Token. 403 Umfang des Tokens oder Berechtigung des Kontos reicht nicht. 404 Nicht vorhanden - auch dann, wenn die Kennung zu einer anderen Praxis gehört. 409 Fachlicher Konflikt (Terminkollision, ausgeschöpftes Kontingent, Idempotenzschlüssel). 412 If-Match passt nicht mehr: der Datensatz wurde zwischenzeitlich geändert. 422 Eingabe oder Abfrageparameter nicht annehmbar. 428 If-Match fehlt. 429 Ratenbegrenzung je Token oder je Praxis greift.
GET /appointments/{appointment} Termin lesen

Umfang des Tokens: appointments:read

Parameter

NameOrtTypBedeutung
appointment * Pfad string Öffentliche Kennung (ULID).

Antwort 200 (application/json)

data trägt Appointment. Kopfeinträge: ETag.

Fehler

400 Fehlender Pflicht-Kopfeintrag, etwa Idempotency-Key. 401 Kein gültiges Token. 403 Umfang des Tokens oder Berechtigung des Kontos reicht nicht. 404 Nicht vorhanden - auch dann, wenn die Kennung zu einer anderen Praxis gehört. 409 Fachlicher Konflikt (Terminkollision, ausgeschöpftes Kontingent, Idempotenzschlüssel). 412 If-Match passt nicht mehr: der Datensatz wurde zwischenzeitlich geändert. 422 Eingabe oder Abfrageparameter nicht annehmbar. 428 If-Match fehlt. 429 Ratenbegrenzung je Token oder je Praxis greift.
POST /appointments/{appointment}/cancel Termin absagen

Umfang des Tokens: appointments:write

Parameter

NameOrtTypBedeutung
appointment * Pfad string Öffentliche Kennung (ULID).
If-Match * Kopfeintrag string Pflicht. Das ETag aus dem letzten Lesen. Ohne den Kopfeintrag: 428, bei veraltetem Wert: 412.

Rumpf (Pflicht, application/json)

FeldTypBedeutung
reason* string höchstens 1000 Zeichen
reasonCode string, oder leer Auswahl: patient_cancelled, patient_sick, patient_no_show, rescheduled, practice_cancelled, practitioner_sick, prescription_expired, other
scope string, oder leer Auswahl: this_occurrence, this_and_following

* Pflichtfeld beziehungsweise immer vorhanden.

Antwort 200 (application/json)

data trägt Appointment. Kopfeinträge: ETag.

Fehler

400 Fehlender Pflicht-Kopfeintrag, etwa Idempotency-Key. 401 Kein gültiges Token. 403 Umfang des Tokens oder Berechtigung des Kontos reicht nicht. 404 Nicht vorhanden - auch dann, wenn die Kennung zu einer anderen Praxis gehört. 409 Fachlicher Konflikt (Terminkollision, ausgeschöpftes Kontingent, Idempotenzschlüssel). 412 If-Match passt nicht mehr: der Datensatz wurde zwischenzeitlich geändert. 422 Eingabe oder Abfrageparameter nicht annehmbar. 428 If-Match fehlt. 429 Ratenbegrenzung je Token oder je Praxis greift.
POST /appointments/{appointment}/reschedule Termin verschieben

Umfang des Tokens: appointments:write

Parameter

NameOrtTypBedeutung
appointment * Pfad string Öffentliche Kennung (ULID).
If-Match * Kopfeintrag string Pflicht. Das ETag aus dem letzten Lesen. Ohne den Kopfeintrag: 428, bei veraltetem Wert: 412.

Rumpf (Pflicht, application/json)

FeldTypBedeutung
startsAt* date-time
durationMinutes integer, oder leer mindestens 1 · höchstens 1440
roomId ulid, oder leer
detachRoom boolean, oder leer

* Pflichtfeld beziehungsweise immer vorhanden.

Antwort 200 (application/json)

data trägt Appointment. Kopfeinträge: ETag.

Fehler

400 Fehlender Pflicht-Kopfeintrag, etwa Idempotency-Key. 401 Kein gültiges Token. 403 Umfang des Tokens oder Berechtigung des Kontos reicht nicht. 404 Nicht vorhanden - auch dann, wenn die Kennung zu einer anderen Praxis gehört. 409 Fachlicher Konflikt (Terminkollision, ausgeschöpftes Kontingent, Idempotenzschlüssel). 412 If-Match passt nicht mehr: der Datensatz wurde zwischenzeitlich geändert. 422 Eingabe oder Abfrageparameter nicht annehmbar. 428 If-Match fehlt. 429 Ratenbegrenzung je Token oder je Praxis greift.
POST /appointments/{appointment}/status Terminstatus setzen

Umfang des Tokens: appointments:write

Parameter

NameOrtTypBedeutung
appointment * Pfad string Öffentliche Kennung (ULID).

Rumpf (Pflicht, application/json)

FeldTypBedeutung
status* string Auswahl: scheduled, confirmed, attended, no_show
reason string, oder leer höchstens 500 Zeichen

* Pflichtfeld beziehungsweise immer vorhanden.

Antwort 200 (application/json)

data trägt Appointment. Kopfeinträge: ETag.

Fehler

400 Fehlender Pflicht-Kopfeintrag, etwa Idempotency-Key. 401 Kein gültiges Token. 403 Umfang des Tokens oder Berechtigung des Kontos reicht nicht. 404 Nicht vorhanden - auch dann, wenn die Kennung zu einer anderen Praxis gehört. 409 Fachlicher Konflikt (Terminkollision, ausgeschöpftes Kontingent, Idempotenzschlüssel). 412 If-Match passt nicht mehr: der Datensatz wurde zwischenzeitlich geändert. 422 Eingabe oder Abfrageparameter nicht annehmbar. 428 If-Match fehlt. 429 Ratenbegrenzung je Token oder je Praxis greift.

Räume

GET /rooms/occupancy Raumbelegung abfragen

Umfang des Tokens: appointments:read

Antwort 200 (application/json)

data trägt RoomOccupancy. Kopfeinträge: ETag.

Fehler

400 Fehlender Pflicht-Kopfeintrag, etwa Idempotency-Key. 401 Kein gültiges Token. 403 Umfang des Tokens oder Berechtigung des Kontos reicht nicht. 404 Nicht vorhanden - auch dann, wenn die Kennung zu einer anderen Praxis gehört. 409 Fachlicher Konflikt (Terminkollision, ausgeschöpftes Kontingent, Idempotenzschlüssel). 412 If-Match passt nicht mehr: der Datensatz wurde zwischenzeitlich geändert. 422 Eingabe oder Abfrageparameter nicht annehmbar. 428 If-Match fehlt. 429 Ratenbegrenzung je Token oder je Praxis greift.

Verordnungen

GET /prescriptions Verordnungen auflisten

Umfang des Tokens: prescriptions:read

Parameter

NameOrtTypBedeutung
patientId Abfrage string Auf eine Akte einschränken (ULID).
ongoing Abfrage string true: noch nicht abgeschlossen. false: abgeschlossen.
reportDue Abfrage string true: ein Therapiebericht steht an.
limit Abfrage integer Seitengröße. mindestens 1 · höchstens 100 · Voreinstellung: 25
cursor Abfrage string Unverändert aus links.next der vorherigen Antwort. Es gibt keinen Offset: er wäre bei nebenläufigen Änderungen falsch.
sort Abfrage string Sortierung, kommagetrennt, "-" für absteigend. Erlaubt: issuedOn, createdAt, updatedAt, validUntil, unitCount. Ein anderes Feld wird mit 422 ABGEWIESEN und nicht ignoriert.
include Abfrage string Verknüpfte Objekte, kommagetrennt: remedies.

Antwort 200 (application/json)

data trägt eine Liste von Prescription.

Fehler

400 Fehlender Pflicht-Kopfeintrag, etwa Idempotency-Key. 401 Kein gültiges Token. 403 Umfang des Tokens oder Berechtigung des Kontos reicht nicht. 404 Nicht vorhanden - auch dann, wenn die Kennung zu einer anderen Praxis gehört. 409 Fachlicher Konflikt (Terminkollision, ausgeschöpftes Kontingent, Idempotenzschlüssel). 412 If-Match passt nicht mehr: der Datensatz wurde zwischenzeitlich geändert. 422 Eingabe oder Abfrageparameter nicht annehmbar. 428 If-Match fehlt. 429 Ratenbegrenzung je Token oder je Praxis greift.
GET /prescriptions/{prescription} Verordnung lesen

Umfang des Tokens: prescriptions:read

Parameter

NameOrtTypBedeutung
prescription * Pfad string Öffentliche Kennung (ULID).

Antwort 200 (application/json)

data trägt Prescription. Kopfeinträge: ETag.

Fehler

400 Fehlender Pflicht-Kopfeintrag, etwa Idempotency-Key. 401 Kein gültiges Token. 403 Umfang des Tokens oder Berechtigung des Kontos reicht nicht. 404 Nicht vorhanden - auch dann, wenn die Kennung zu einer anderen Praxis gehört. 409 Fachlicher Konflikt (Terminkollision, ausgeschöpftes Kontingent, Idempotenzschlüssel). 412 If-Match passt nicht mehr: der Datensatz wurde zwischenzeitlich geändert. 422 Eingabe oder Abfrageparameter nicht annehmbar. 428 If-Match fehlt. 429 Ratenbegrenzung je Token oder je Praxis greift.
GET /prescriptions/{prescription}/quota Restkontingent und Berichtsfälligkeit

Umfang des Tokens: prescriptions:read

Parameter

NameOrtTypBedeutung
prescription * Pfad string Öffentliche Kennung (ULID).

Antwort 200 (application/json)

data trägt PrescriptionQuota. Kopfeinträge: ETag.

Fehler

400 Fehlender Pflicht-Kopfeintrag, etwa Idempotency-Key. 401 Kein gültiges Token. 403 Umfang des Tokens oder Berechtigung des Kontos reicht nicht. 404 Nicht vorhanden - auch dann, wenn die Kennung zu einer anderen Praxis gehört. 409 Fachlicher Konflikt (Terminkollision, ausgeschöpftes Kontingent, Idempotenzschlüssel). 412 If-Match passt nicht mehr: der Datensatz wurde zwischenzeitlich geändert. 422 Eingabe oder Abfrageparameter nicht annehmbar. 428 If-Match fehlt. 429 Ratenbegrenzung je Token oder je Praxis greift.

Rechnungen

GET /invoices Rechnungen auflisten

Umfang des Tokens: invoices:read

Parameter

NameOrtTypBedeutung
patientId Abfrage string Auf eine Akte einschränken (ULID).
status Abfrage string Rechnungsstatus, kommagetrennt.
issuedFrom Abfrage string Ausgestellt ab (JJJJ-MM-TT).
issuedTo Abfrage string Ausgestellt bis (JJJJ-MM-TT).
limit Abfrage integer Seitengröße. mindestens 1 · höchstens 100 · Voreinstellung: 25
cursor Abfrage string Unverändert aus links.next der vorherigen Antwort. Es gibt keinen Offset: er wäre bei nebenläufigen Änderungen falsch.
sort Abfrage string Sortierung, kommagetrennt, "-" für absteigend. Erlaubt: issuedOn, dueOn, createdAt, updatedAt, status, totalGrossCents. Ein anderes Feld wird mit 422 ABGEWIESEN und nicht ignoriert.
include Abfrage string Verknüpfte Objekte, kommagetrennt: items.

Antwort 200 (application/json)

data trägt eine Liste von Invoice.

Fehler

400 Fehlender Pflicht-Kopfeintrag, etwa Idempotency-Key. 401 Kein gültiges Token. 403 Umfang des Tokens oder Berechtigung des Kontos reicht nicht. 404 Nicht vorhanden - auch dann, wenn die Kennung zu einer anderen Praxis gehört. 409 Fachlicher Konflikt (Terminkollision, ausgeschöpftes Kontingent, Idempotenzschlüssel). 412 If-Match passt nicht mehr: der Datensatz wurde zwischenzeitlich geändert. 422 Eingabe oder Abfrageparameter nicht annehmbar. 428 If-Match fehlt. 429 Ratenbegrenzung je Token oder je Praxis greift.
GET /invoices/{invoice} Rechnung lesen

Umfang des Tokens: invoices:read

Parameter

NameOrtTypBedeutung
invoice * Pfad string Öffentliche Kennung (ULID).

Antwort 200 (application/json)

data trägt Invoice. Kopfeinträge: ETag.

Fehler

400 Fehlender Pflicht-Kopfeintrag, etwa Idempotency-Key. 401 Kein gültiges Token. 403 Umfang des Tokens oder Berechtigung des Kontos reicht nicht. 404 Nicht vorhanden - auch dann, wenn die Kennung zu einer anderen Praxis gehört. 409 Fachlicher Konflikt (Terminkollision, ausgeschöpftes Kontingent, Idempotenzschlüssel). 412 If-Match passt nicht mehr: der Datensatz wurde zwischenzeitlich geändert. 422 Eingabe oder Abfrageparameter nicht annehmbar. 428 If-Match fehlt. 429 Ratenbegrenzung je Token oder je Praxis greift.
GET /invoices/{invoice}/document Rechnung als PDF

Umfang des Tokens: invoices:read

Parameter

NameOrtTypBedeutung
invoice * Pfad string Öffentliche Kennung (ULID).

Antwort 200 (application/pdf)

Ohne JSON-Objekt im Rumpf.

Fehler

400 Fehlender Pflicht-Kopfeintrag, etwa Idempotency-Key. 401 Kein gültiges Token. 403 Umfang des Tokens oder Berechtigung des Kontos reicht nicht. 404 Nicht vorhanden - auch dann, wenn die Kennung zu einer anderen Praxis gehört. 409 Fachlicher Konflikt (Terminkollision, ausgeschöpftes Kontingent, Idempotenzschlüssel). 412 If-Match passt nicht mehr: der Datensatz wurde zwischenzeitlich geändert. 422 Eingabe oder Abfrageparameter nicht annehmbar. 428 If-Match fehlt. 429 Ratenbegrenzung je Token oder je Praxis greift.
POST /invoices/{invoice}/payments Zahlungseingang erfassen

Umfang des Tokens: invoices:write

Parameter

NameOrtTypBedeutung
invoice * Pfad string Öffentliche Kennung (ULID).
Idempotency-Key * Kopfeintrag string Pflicht. Eine Wiederholung mit demselben Schlüssel liefert die erste Antwort erneut, statt einen zweiten Datensatz anzulegen. höchstens 255 Zeichen
If-Match * Kopfeintrag string Pflicht. Das ETag aus dem letzten Lesen. Ohne den Kopfeintrag: 428, bei veraltetem Wert: 412.

Rumpf (Pflicht, application/json)

FeldTypBedeutung
amountCents integer, oder leer mindestens 1
paidAt date-time, oder leer
method string, oder leer Auswahl: transfer, cash, card, direct_debit, unknown
reference string, oder leer höchstens 64 Zeichen

* Pflichtfeld beziehungsweise immer vorhanden.

Antwort 200 (application/json)

data trägt Invoice. Kopfeinträge: ETag.

Fehler

400 Fehlender Pflicht-Kopfeintrag, etwa Idempotency-Key. 401 Kein gültiges Token. 403 Umfang des Tokens oder Berechtigung des Kontos reicht nicht. 404 Nicht vorhanden - auch dann, wenn die Kennung zu einer anderen Praxis gehört. 409 Fachlicher Konflikt (Terminkollision, ausgeschöpftes Kontingent, Idempotenzschlüssel). 412 If-Match passt nicht mehr: der Datensatz wurde zwischenzeitlich geändert. 422 Eingabe oder Abfrageparameter nicht annehmbar. 428 If-Match fehlt. 429 Ratenbegrenzung je Token oder je Praxis greift.

Praxis

GET /practice Stammdaten der eigenen Praxis

Umfang des Tokens: practice:read

Antwort 200 (application/json)

data trägt Practice. Kopfeinträge: ETag.

Fehler

400 Fehlender Pflicht-Kopfeintrag, etwa Idempotency-Key. 401 Kein gültiges Token. 403 Umfang des Tokens oder Berechtigung des Kontos reicht nicht. 404 Nicht vorhanden - auch dann, wenn die Kennung zu einer anderen Praxis gehört. 409 Fachlicher Konflikt (Terminkollision, ausgeschöpftes Kontingent, Idempotenzschlüssel). 412 If-Match passt nicht mehr: der Datensatz wurde zwischenzeitlich geändert. 422 Eingabe oder Abfrageparameter nicht annehmbar. 428 If-Match fehlt. 429 Ratenbegrenzung je Token oder je Praxis greift.
GET /practice/appointment-types Terminarten der Praxis

Umfang des Tokens: practice:read

Parameter

NameOrtTypBedeutung
includeInactive Abfrage string Auch stillgelegte Terminarten liefern.

Antwort 200 (application/json)

data trägt eine Liste von AppointmentType.

Fehler

400 Fehlender Pflicht-Kopfeintrag, etwa Idempotency-Key. 401 Kein gültiges Token. 403 Umfang des Tokens oder Berechtigung des Kontos reicht nicht. 404 Nicht vorhanden - auch dann, wenn die Kennung zu einer anderen Praxis gehört. 409 Fachlicher Konflikt (Terminkollision, ausgeschöpftes Kontingent, Idempotenzschlüssel). 412 If-Match passt nicht mehr: der Datensatz wurde zwischenzeitlich geändert. 422 Eingabe oder Abfrageparameter nicht annehmbar. 428 If-Match fehlt. 429 Ratenbegrenzung je Token oder je Praxis greift.
GET /practice/members Mitglieder der Praxis

Umfang des Tokens: practice:read

Parameter

NameOrtTypBedeutung
status Abfrage string Mitgliedschaftsstatus, kommagetrennt.

Antwort 200 (application/json)

data trägt eine Liste von Member.

Fehler

400 Fehlender Pflicht-Kopfeintrag, etwa Idempotency-Key. 401 Kein gültiges Token. 403 Umfang des Tokens oder Berechtigung des Kontos reicht nicht. 404 Nicht vorhanden - auch dann, wenn die Kennung zu einer anderen Praxis gehört. 409 Fachlicher Konflikt (Terminkollision, ausgeschöpftes Kontingent, Idempotenzschlüssel). 412 If-Match passt nicht mehr: der Datensatz wurde zwischenzeitlich geändert. 422 Eingabe oder Abfrageparameter nicht annehmbar. 428 If-Match fehlt. 429 Ratenbegrenzung je Token oder je Praxis greift.
GET /practice/opening-hours Öffnungszeiten

Umfang des Tokens: practice:read

Antwort 200 (application/json)

data trägt eine Liste von OpeningHour.

Fehler

400 Fehlender Pflicht-Kopfeintrag, etwa Idempotency-Key. 401 Kein gültiges Token. 403 Umfang des Tokens oder Berechtigung des Kontos reicht nicht. 404 Nicht vorhanden - auch dann, wenn die Kennung zu einer anderen Praxis gehört. 409 Fachlicher Konflikt (Terminkollision, ausgeschöpftes Kontingent, Idempotenzschlüssel). 412 If-Match passt nicht mehr: der Datensatz wurde zwischenzeitlich geändert. 422 Eingabe oder Abfrageparameter nicht annehmbar. 428 If-Match fehlt. 429 Ratenbegrenzung je Token oder je Praxis greift.
GET /practice/services Leistungskatalog

Umfang des Tokens: practice:read

Parameter

NameOrtTypBedeutung
includeInactive Abfrage string Auch abgelöste Einträge liefern.
validOn Abfrage string Nur Einträge, die an diesem Tag gelten (JJJJ-MM-TT).
limit Abfrage integer Seitengröße. mindestens 1 · höchstens 100 · Voreinstellung: 25
cursor Abfrage string Unverändert aus links.next der vorherigen Antwort. Es gibt keinen Offset: er wäre bei nebenläufigen Änderungen falsch.
sort Abfrage string Sortierung, kommagetrennt, "-" für absteigend. Erlaubt: code, name, createdAt, priceCents. Ein anderes Feld wird mit 422 ABGEWIESEN und nicht ignoriert.

Antwort 200 (application/json)

data trägt eine Liste von Service.

Fehler

400 Fehlender Pflicht-Kopfeintrag, etwa Idempotency-Key. 401 Kein gültiges Token. 403 Umfang des Tokens oder Berechtigung des Kontos reicht nicht. 404 Nicht vorhanden - auch dann, wenn die Kennung zu einer anderen Praxis gehört. 409 Fachlicher Konflikt (Terminkollision, ausgeschöpftes Kontingent, Idempotenzschlüssel). 412 If-Match passt nicht mehr: der Datensatz wurde zwischenzeitlich geändert. 422 Eingabe oder Abfrageparameter nicht annehmbar. 428 If-Match fehlt. 429 Ratenbegrenzung je Token oder je Praxis greift.

Konto

GET /account Das eigene Konto

Umfang des Tokens: account:read

Antwort 200 (application/json)

data trägt Account. Kopfeinträge: ETag.

Fehler

400 Fehlender Pflicht-Kopfeintrag, etwa Idempotency-Key. 401 Kein gültiges Token. 403 Umfang des Tokens oder Berechtigung des Kontos reicht nicht. 404 Nicht vorhanden - auch dann, wenn die Kennung zu einer anderen Praxis gehört. 409 Fachlicher Konflikt (Terminkollision, ausgeschöpftes Kontingent, Idempotenzschlüssel). 412 If-Match passt nicht mehr: der Datensatz wurde zwischenzeitlich geändert. 422 Eingabe oder Abfrageparameter nicht annehmbar. 428 If-Match fehlt. 429 Ratenbegrenzung je Token oder je Praxis greift.
PUT /account/push-token Push-Token des Geräts setzen

Umfang des Tokens: account:write

Rumpf (Pflicht, application/json)

FeldTypBedeutung
token string, oder leer höchstens 255 Zeichen

* Pflichtfeld beziehungsweise immer vorhanden.

Fehler

400 Fehlender Pflicht-Kopfeintrag, etwa Idempotency-Key. 401 Kein gültiges Token. 403 Umfang des Tokens oder Berechtigung des Kontos reicht nicht. 404 Nicht vorhanden - auch dann, wenn die Kennung zu einer anderen Praxis gehört. 409 Fachlicher Konflikt (Terminkollision, ausgeschöpftes Kontingent, Idempotenzschlüssel). 412 If-Match passt nicht mehr: der Datensatz wurde zwischenzeitlich geändert. 422 Eingabe oder Abfrageparameter nicht annehmbar. 428 If-Match fehlt. 429 Ratenbegrenzung je Token oder je Praxis greift.
GET /account/sessions Sitzungen des eigenen Kontos

Umfang des Tokens: account:read

Parameter

NameOrtTypBedeutung
limit Abfrage integer Seitengröße. mindestens 1 · höchstens 100 · Voreinstellung: 25
cursor Abfrage string Unverändert aus links.next der vorherigen Antwort. Es gibt keinen Offset: er wäre bei nebenläufigen Änderungen falsch.
sort Abfrage string Sortierung, kommagetrennt, "-" für absteigend. Erlaubt: createdAt, updatedAt, birthDate, status. Nicht sortierbar, weil verschlüsselt gespeichert: lastName, firstName, email, phone, mobile, city, postalCode, street. Ein anderes Feld wird mit 422 ABGEWIESEN und nicht ignoriert.
include Abfrage string Verknüpfte Objekte, kommagetrennt: consents.

Antwort 200 (application/json)

data trägt eine Liste von Session.

Fehler

400 Fehlender Pflicht-Kopfeintrag, etwa Idempotency-Key. 401 Kein gültiges Token. 403 Umfang des Tokens oder Berechtigung des Kontos reicht nicht. 404 Nicht vorhanden - auch dann, wenn die Kennung zu einer anderen Praxis gehört. 409 Fachlicher Konflikt (Terminkollision, ausgeschöpftes Kontingent, Idempotenzschlüssel). 412 If-Match passt nicht mehr: der Datensatz wurde zwischenzeitlich geändert. 422 Eingabe oder Abfrageparameter nicht annehmbar. 428 If-Match fehlt. 429 Ratenbegrenzung je Token oder je Praxis greift.
DELETE /account/sessions/{session} Sitzung beenden

Umfang des Tokens: account:write

Parameter

NameOrtTypBedeutung
session * Pfad string Öffentliche Kennung (ULID).

Fehler

400 Fehlender Pflicht-Kopfeintrag, etwa Idempotency-Key. 401 Kein gültiges Token. 403 Umfang des Tokens oder Berechtigung des Kontos reicht nicht. 404 Nicht vorhanden - auch dann, wenn die Kennung zu einer anderen Praxis gehört. 409 Fachlicher Konflikt (Terminkollision, ausgeschöpftes Kontingent, Idempotenzschlüssel). 412 If-Match passt nicht mehr: der Datensatz wurde zwischenzeitlich geändert. 422 Eingabe oder Abfrageparameter nicht annehmbar. 428 If-Match fehlt. 429 Ratenbegrenzung je Token oder je Praxis greift.
GET /account/tokens Tokens des eigenen Kontos

Umfang des Tokens: account:read

Parameter

NameOrtTypBedeutung
includeRevoked Abfrage string Auch widerrufene Tokens liefern.
limit Abfrage integer Seitengröße. mindestens 1 · höchstens 100 · Voreinstellung: 25
cursor Abfrage string Unverändert aus links.next der vorherigen Antwort. Es gibt keinen Offset: er wäre bei nebenläufigen Änderungen falsch.
sort Abfrage string Sortierung, kommagetrennt, "-" für absteigend. Erlaubt: createdAt, updatedAt, birthDate, status. Nicht sortierbar, weil verschlüsselt gespeichert: lastName, firstName, email, phone, mobile, city, postalCode, street. Ein anderes Feld wird mit 422 ABGEWIESEN und nicht ignoriert.
include Abfrage string Verknüpfte Objekte, kommagetrennt: consents.

Antwort 200 (application/json)

data trägt eine Liste von ApiToken.

Fehler

400 Fehlender Pflicht-Kopfeintrag, etwa Idempotency-Key. 401 Kein gültiges Token. 403 Umfang des Tokens oder Berechtigung des Kontos reicht nicht. 404 Nicht vorhanden - auch dann, wenn die Kennung zu einer anderen Praxis gehört. 409 Fachlicher Konflikt (Terminkollision, ausgeschöpftes Kontingent, Idempotenzschlüssel). 412 If-Match passt nicht mehr: der Datensatz wurde zwischenzeitlich geändert. 422 Eingabe oder Abfrageparameter nicht annehmbar. 428 If-Match fehlt. 429 Ratenbegrenzung je Token oder je Praxis greift.
POST /account/tokens Token ausstellen

Umfang des Tokens: account:write

Rumpf (Pflicht, application/json)

FeldTypBedeutung
name* string höchstens 120 Zeichen
deviceName* string höchstens 120 Zeichen
abilities Liste von string, oder leer
expiresAt date-time, oder leer

* Pflichtfeld beziehungsweise immer vorhanden.

Antwort 201 (application/json)

data trägt ApiToken. Kopfeinträge: ETag.

Fehler

400 Fehlender Pflicht-Kopfeintrag, etwa Idempotency-Key. 401 Kein gültiges Token. 403 Umfang des Tokens oder Berechtigung des Kontos reicht nicht. 404 Nicht vorhanden - auch dann, wenn die Kennung zu einer anderen Praxis gehört. 409 Fachlicher Konflikt (Terminkollision, ausgeschöpftes Kontingent, Idempotenzschlüssel). 412 If-Match passt nicht mehr: der Datensatz wurde zwischenzeitlich geändert. 422 Eingabe oder Abfrageparameter nicht annehmbar. 428 If-Match fehlt. 429 Ratenbegrenzung je Token oder je Praxis greift.
DELETE /account/tokens/{token} Token widerrufen

Umfang des Tokens: account:write

Parameter

NameOrtTypBedeutung
token * Pfad string Öffentliche Kennung (ULID).

Fehler

400 Fehlender Pflicht-Kopfeintrag, etwa Idempotency-Key. 401 Kein gültiges Token. 403 Umfang des Tokens oder Berechtigung des Kontos reicht nicht. 404 Nicht vorhanden - auch dann, wenn die Kennung zu einer anderen Praxis gehört. 409 Fachlicher Konflikt (Terminkollision, ausgeschöpftes Kontingent, Idempotenzschlüssel). 412 If-Match passt nicht mehr: der Datensatz wurde zwischenzeitlich geändert. 422 Eingabe oder Abfrageparameter nicht annehmbar. 428 If-Match fehlt. 429 Ratenbegrenzung je Token oder je Praxis greift.

Mitteilungen

GET /notifications Mitteilungen des eigenen Kontos

Umfang des Tokens: account:read

Antwort 200 (application/json)

data trägt eine Liste von Notification.

Fehler

400 Fehlender Pflicht-Kopfeintrag, etwa Idempotency-Key. 401 Kein gültiges Token. 403 Umfang des Tokens oder Berechtigung des Kontos reicht nicht. 404 Nicht vorhanden - auch dann, wenn die Kennung zu einer anderen Praxis gehört. 409 Fachlicher Konflikt (Terminkollision, ausgeschöpftes Kontingent, Idempotenzschlüssel). 412 If-Match passt nicht mehr: der Datensatz wurde zwischenzeitlich geändert. 422 Eingabe oder Abfrageparameter nicht annehmbar. 428 If-Match fehlt. 429 Ratenbegrenzung je Token oder je Praxis greift.
POST /notifications/read Mitteilungen als gelesen markieren

Umfang des Tokens: account:write

Rumpf (Pflicht, application/json)

FeldTypBedeutung
ids Liste von string, oder leer
all boolean, oder leer

* Pflichtfeld beziehungsweise immer vorhanden.

Antwort 200 (application/json)

data trägt NotificationReadState. Kopfeinträge: ETag.

Fehler

400 Fehlender Pflicht-Kopfeintrag, etwa Idempotency-Key. 401 Kein gültiges Token. 403 Umfang des Tokens oder Berechtigung des Kontos reicht nicht. 404 Nicht vorhanden - auch dann, wenn die Kennung zu einer anderen Praxis gehört. 409 Fachlicher Konflikt (Terminkollision, ausgeschöpftes Kontingent, Idempotenzschlüssel). 412 If-Match passt nicht mehr: der Datensatz wurde zwischenzeitlich geändert. 422 Eingabe oder Abfrageparameter nicht annehmbar. 428 If-Match fehlt. 429 Ratenbegrenzung je Token oder je Praxis greift.

Aufgaben

GET /tasks Aufgaben auflisten

Umfang des Tokens: tasks:read

Parameter

NameOrtTypBedeutung
status Abfrage string Stand, kommagetrennt (open, in_progress, done, cancelled). Ohne Angabe nur open und in_progress.
assignee Abfrage string "me" (eigene), "none" (niemand zuständig) oder die Kennung eines Mitglieds (ULID).
dueBy Abfrage string Fällig bis einschließlich diesem Tag (JJJJ-MM-TT); Aufgaben ohne Fälligkeit fallen heraus.
patientId Abfrage string Auf eine Akte einschränken (ULID). Verlangt patients.view_master_data.
limit Abfrage integer Seitengröße. mindestens 1 · höchstens 100 · Voreinstellung: 25
cursor Abfrage string Unverändert aus links.next der vorherigen Antwort. Es gibt keinen Offset: er wäre bei nebenläufigen Änderungen falsch.
sort Abfrage string Sortierung, kommagetrennt, "-" für absteigend. Erlaubt: createdAt, updatedAt. Nicht sortierbar, weil verschlüsselt gespeichert: notes. Ein anderes Feld wird mit 422 ABGEWIESEN und nicht ignoriert.

Antwort 200 (application/json)

data trägt eine Liste von Task.

Fehler

400 Fehlender Pflicht-Kopfeintrag, etwa Idempotency-Key. 401 Kein gültiges Token. 403 Umfang des Tokens oder Berechtigung des Kontos reicht nicht. 404 Nicht vorhanden - auch dann, wenn die Kennung zu einer anderen Praxis gehört. 409 Fachlicher Konflikt (Terminkollision, ausgeschöpftes Kontingent, Idempotenzschlüssel). 412 If-Match passt nicht mehr: der Datensatz wurde zwischenzeitlich geändert. 422 Eingabe oder Abfrageparameter nicht annehmbar. 428 If-Match fehlt. 429 Ratenbegrenzung je Token oder je Praxis greift.
POST /tasks Aufgabe anlegen

Umfang des Tokens: tasks:write

Parameter

NameOrtTypBedeutung
Idempotency-Key * Kopfeintrag string Pflicht. Eine Wiederholung mit demselben Schlüssel liefert die erste Antwort erneut, statt einen zweiten Datensatz anzulegen. höchstens 255 Zeichen

Rumpf (Pflicht, application/json)

FeldTypBedeutung
title* string höchstens 120 Zeichen
notes string, oder leer höchstens 5000 Zeichen
priority string, oder leer Auswahl: low, normal, high
dueOn date, oder leer
patientId ulid, oder leer
assigneeIds Liste von ulid, oder leer

* Pflichtfeld beziehungsweise immer vorhanden.

Antwort 201 (application/json)

data trägt Task. Kopfeinträge: ETag.

Fehler

400 Fehlender Pflicht-Kopfeintrag, etwa Idempotency-Key. 401 Kein gültiges Token. 403 Umfang des Tokens oder Berechtigung des Kontos reicht nicht. 404 Nicht vorhanden - auch dann, wenn die Kennung zu einer anderen Praxis gehört. 409 Fachlicher Konflikt (Terminkollision, ausgeschöpftes Kontingent, Idempotenzschlüssel). 412 If-Match passt nicht mehr: der Datensatz wurde zwischenzeitlich geändert. 422 Eingabe oder Abfrageparameter nicht annehmbar. 428 If-Match fehlt. 429 Ratenbegrenzung je Token oder je Praxis greift.
GET /tasks/{task} Aufgabe lesen

Umfang des Tokens: tasks:read

Parameter

NameOrtTypBedeutung
task * Pfad string Öffentliche Kennung (ULID).

Antwort 200 (application/json)

data trägt Task. Kopfeinträge: ETag.

Fehler

400 Fehlender Pflicht-Kopfeintrag, etwa Idempotency-Key. 401 Kein gültiges Token. 403 Umfang des Tokens oder Berechtigung des Kontos reicht nicht. 404 Nicht vorhanden - auch dann, wenn die Kennung zu einer anderen Praxis gehört. 409 Fachlicher Konflikt (Terminkollision, ausgeschöpftes Kontingent, Idempotenzschlüssel). 412 If-Match passt nicht mehr: der Datensatz wurde zwischenzeitlich geändert. 422 Eingabe oder Abfrageparameter nicht annehmbar. 428 If-Match fehlt. 429 Ratenbegrenzung je Token oder je Praxis greift.
PATCH /tasks/{task} Aufgabe ändern

Umfang des Tokens: tasks:write

Parameter

NameOrtTypBedeutung
task * Pfad string Öffentliche Kennung (ULID).
If-Match * Kopfeintrag string Pflicht. Das ETag aus dem letzten Lesen. Ohne den Kopfeintrag: 428, bei veraltetem Wert: 412.

Rumpf (Pflicht, application/json)

FeldTypBedeutung
title string höchstens 120 Zeichen
notes string, oder leer höchstens 5000 Zeichen
priority string Auswahl: low, normal, high
status string Auswahl: open, in_progress, done, cancelled
dueOn date, oder leer
patientId ulid, oder leer

* Pflichtfeld beziehungsweise immer vorhanden.

Antwort 200 (application/json)

data trägt Task. Kopfeinträge: ETag.

Fehler

400 Fehlender Pflicht-Kopfeintrag, etwa Idempotency-Key. 401 Kein gültiges Token. 403 Umfang des Tokens oder Berechtigung des Kontos reicht nicht. 404 Nicht vorhanden - auch dann, wenn die Kennung zu einer anderen Praxis gehört. 409 Fachlicher Konflikt (Terminkollision, ausgeschöpftes Kontingent, Idempotenzschlüssel). 412 If-Match passt nicht mehr: der Datensatz wurde zwischenzeitlich geändert. 422 Eingabe oder Abfrageparameter nicht annehmbar. 428 If-Match fehlt. 429 Ratenbegrenzung je Token oder je Praxis greift.
DELETE /tasks/{task} Aufgabe löschen

Umfang des Tokens: tasks:write

Parameter

NameOrtTypBedeutung
task * Pfad string Öffentliche Kennung (ULID).

Fehler

400 Fehlender Pflicht-Kopfeintrag, etwa Idempotency-Key. 401 Kein gültiges Token. 403 Umfang des Tokens oder Berechtigung des Kontos reicht nicht. 404 Nicht vorhanden - auch dann, wenn die Kennung zu einer anderen Praxis gehört. 409 Fachlicher Konflikt (Terminkollision, ausgeschöpftes Kontingent, Idempotenzschlüssel). 412 If-Match passt nicht mehr: der Datensatz wurde zwischenzeitlich geändert. 422 Eingabe oder Abfrageparameter nicht annehmbar. 428 If-Match fehlt. 429 Ratenbegrenzung je Token oder je Praxis greift.
PUT /tasks/{task}/assignees Zuständige setzen

Umfang des Tokens: tasks:write

Parameter

NameOrtTypBedeutung
task * Pfad string Öffentliche Kennung (ULID).

Rumpf (Pflicht, application/json)

FeldTypBedeutung
assigneeIds Liste von ulid

* Pflichtfeld beziehungsweise immer vorhanden.

Antwort 200 (application/json)

data trägt Task. Kopfeinträge: ETag.

Fehler

400 Fehlender Pflicht-Kopfeintrag, etwa Idempotency-Key. 401 Kein gültiges Token. 403 Umfang des Tokens oder Berechtigung des Kontos reicht nicht. 404 Nicht vorhanden - auch dann, wenn die Kennung zu einer anderen Praxis gehört. 409 Fachlicher Konflikt (Terminkollision, ausgeschöpftes Kontingent, Idempotenzschlüssel). 412 If-Match passt nicht mehr: der Datensatz wurde zwischenzeitlich geändert. 422 Eingabe oder Abfrageparameter nicht annehmbar. 428 If-Match fehlt. 429 Ratenbegrenzung je Token oder je Praxis greift.
POST /tasks/{task}/complete Aufgabe abhaken

Umfang des Tokens: tasks:write

Parameter

NameOrtTypBedeutung
task * Pfad string Öffentliche Kennung (ULID).

Antwort 200 (application/json)

data trägt Task. Kopfeinträge: ETag.

Fehler

400 Fehlender Pflicht-Kopfeintrag, etwa Idempotency-Key. 401 Kein gültiges Token. 403 Umfang des Tokens oder Berechtigung des Kontos reicht nicht. 404 Nicht vorhanden - auch dann, wenn die Kennung zu einer anderen Praxis gehört. 409 Fachlicher Konflikt (Terminkollision, ausgeschöpftes Kontingent, Idempotenzschlüssel). 412 If-Match passt nicht mehr: der Datensatz wurde zwischenzeitlich geändert. 422 Eingabe oder Abfrageparameter nicht annehmbar. 428 If-Match fehlt. 429 Ratenbegrenzung je Token oder je Praxis greift.
POST /tasks/{task}/reopen Aufgabe wieder öffnen

Umfang des Tokens: tasks:write

Parameter

NameOrtTypBedeutung
task * Pfad string Öffentliche Kennung (ULID).

Antwort 200 (application/json)

data trägt Task. Kopfeinträge: ETag.

Fehler

400 Fehlender Pflicht-Kopfeintrag, etwa Idempotency-Key. 401 Kein gültiges Token. 403 Umfang des Tokens oder Berechtigung des Kontos reicht nicht. 404 Nicht vorhanden - auch dann, wenn die Kennung zu einer anderen Praxis gehört. 409 Fachlicher Konflikt (Terminkollision, ausgeschöpftes Kontingent, Idempotenzschlüssel). 412 If-Match passt nicht mehr: der Datensatz wurde zwischenzeitlich geändert. 422 Eingabe oder Abfrageparameter nicht annehmbar. 428 If-Match fehlt. 429 Ratenbegrenzung je Token oder je Praxis greift.

Anmeldung

POST /auth/login Anmelden (Praxis-App)

Ohne besonderen Umfang - jedes gültige Token, dessen Konto die Berechtigung hat.

Rumpf (Pflicht, application/json)

FeldTypBedeutung
email* email höchstens 255 Zeichen
password* string höchstens 1024 Zeichen
deviceName* string höchstens 120 Zeichen
practiceId string, oder leer höchstens 26 Zeichen

* Pflichtfeld beziehungsweise immer vorhanden.

Antwort 200 (application/json)

data trägt LoginStep. Kopfeinträge: ETag.

Fehler

400 Fehlender Pflicht-Kopfeintrag, etwa Idempotency-Key. 401 Kein gültiges Token. 403 Umfang des Tokens oder Berechtigung des Kontos reicht nicht. 404 Nicht vorhanden - auch dann, wenn die Kennung zu einer anderen Praxis gehört. 409 Fachlicher Konflikt (Terminkollision, ausgeschöpftes Kontingent, Idempotenzschlüssel). 412 If-Match passt nicht mehr: der Datensatz wurde zwischenzeitlich geändert. 422 Eingabe oder Abfrageparameter nicht annehmbar. 428 If-Match fehlt. 429 Ratenbegrenzung je Token oder je Praxis greift.
POST /auth/two-factor Anmeldung fortsetzen: zweiter Faktor, Praxiswahl

Ohne besonderen Umfang - jedes gültige Token, dessen Konto die Berechtigung hat.

Rumpf (Pflicht, application/json)

FeldTypBedeutung
challenge* string höchstens 4096 Zeichen
code string, oder leer höchstens 64 Zeichen
practiceId string, oder leer höchstens 26 Zeichen

* Pflichtfeld beziehungsweise immer vorhanden.

Antwort 200 (application/json)

data trägt LoginStep. Kopfeinträge: ETag.

Fehler

400 Fehlender Pflicht-Kopfeintrag, etwa Idempotency-Key. 401 Kein gültiges Token. 403 Umfang des Tokens oder Berechtigung des Kontos reicht nicht. 404 Nicht vorhanden - auch dann, wenn die Kennung zu einer anderen Praxis gehört. 409 Fachlicher Konflikt (Terminkollision, ausgeschöpftes Kontingent, Idempotenzschlüssel). 412 If-Match passt nicht mehr: der Datensatz wurde zwischenzeitlich geändert. 422 Eingabe oder Abfrageparameter nicht annehmbar. 428 If-Match fehlt. 429 Ratenbegrenzung je Token oder je Praxis greift.

Zutritt

POST /access/log Zutrittsentscheidung melden

Umfang des Tokens: access:write

Rumpf (Pflicht, application/json)

FeldTypBedeutung
occurredAt* date-time
result* string Auswahl: granted, denied
personId string, oder leer höchstens 64 Zeichen
credentialType string, oder leer Auswahl: pin, nfc
area string, oder leer höchstens 32 Zeichen
reason string, oder leer höchstens 64 Zeichen

* Pflichtfeld beziehungsweise immer vorhanden.

Antwort 201 (application/json)

data trägt AccessLogEntry. Kopfeinträge: ETag.

Fehler

400 Fehlender Pflicht-Kopfeintrag, etwa Idempotency-Key. 401 Kein gültiges Token. 403 Umfang des Tokens oder Berechtigung des Kontos reicht nicht. 404 Nicht vorhanden - auch dann, wenn die Kennung zu einer anderen Praxis gehört. 409 Fachlicher Konflikt (Terminkollision, ausgeschöpftes Kontingent, Idempotenzschlüssel). 412 If-Match passt nicht mehr: der Datensatz wurde zwischenzeitlich geändert. 422 Eingabe oder Abfrageparameter nicht annehmbar. 428 If-Match fehlt. 429 Ratenbegrenzung je Token oder je Praxis greift.
GET /access/snapshot Vollständiger Zutrittsstand

Umfang des Tokens: access:read

Antwort 200 (application/json)

data trägt AccessSnapshot. Kopfeinträge: ETag.

Fehler

400 Fehlender Pflicht-Kopfeintrag, etwa Idempotency-Key. 401 Kein gültiges Token. 403 Umfang des Tokens oder Berechtigung des Kontos reicht nicht. 404 Nicht vorhanden - auch dann, wenn die Kennung zu einer anderen Praxis gehört. 409 Fachlicher Konflikt (Terminkollision, ausgeschöpftes Kontingent, Idempotenzschlüssel). 412 If-Match passt nicht mehr: der Datensatz wurde zwischenzeitlich geändert. 422 Eingabe oder Abfrageparameter nicht annehmbar. 428 If-Match fehlt. 429 Ratenbegrenzung je Token oder je Praxis greift.

Objekte

AccessLogEntry

FeldTypBedeutung
occurredAt* date-time Zeitpunkt an der Tür.
recordedAt* date-time Zeitpunkt des Eingangs hier. Nach einer Netzstörung liegt er deutlich später.
personId* string, oder leer Öffentliche Kennung der Person, sofern die Steuerung eine erkannt hat.
credentialType* string, oder leer Auswahl: pin, nfc
area* string, oder leer Schlüssel des Bereichs, wie im Schnappschuss.
result* string Auswahl: granted, denied
reason* string, oder leer

* Pflichtfeld beziehungsweise immer vorhanden.

AccessSnapshot

FeldTypBedeutung
version* integer Fassung des Formats. Steigt, wenn sich die Bedeutung eines Feldes ändert - nicht, wenn eines dazukommt.
generatedAt* date-time Zeitpunkt des Abrufs.
areas* Liste von Objekten Die Bereiche der Praxis. Kennt die Steuerung einen Schlüssel nicht, öffnet er dort nichts.
areas[].key* string Der Schlüssel, der an den Personen steht. Er ändert sich nie; die Bezeichnung schon.
areas[].label* string
areas[].pinRule* string Welches Tastenfeld an diesem Bereich hängt: "nuki" nimmt nur sechs Ziffern ohne Null an, die nicht mit 12 beginnen. Auswahl: standard, nuki
persons* Liste von Objekten
persons[].id* string Öffentliche Kennung der Person. Dieselbe Kennung meldet die Gebäudesteuerung im Protokoll zurück.
persons[].name* string
persons[].active* boolean Ausgeschaltete Personen stehen weiterhin im Stand - mit false und ohne Zugangsmittel. Weggelassen wären sie nicht unterscheidbar von "gelöscht".
persons[].validFrom* date, oder leer Leer heisst "ohne Grenze".
persons[].validUntil* date, oder leer Leer heisst "ohne Grenze".
persons[].weekdays* Liste von string Leere Liste heisst "an jedem Tag".
persons[].timeFrom* string, oder leer HH:MM. Leer heisst "ohne Grenze".
persons[].timeUntil* string, oder leer HH:MM. Leer heisst "ohne Grenze".
persons[].areas* Liste von string Whitelist aus Schlüsseln der Bereiche (siehe "areas" oben). Eine leere Liste heisst "kein Bereich" und nicht "alle".
persons[].credentials* Liste von Objekten Auch mehrere derselben Art - jedes öffnet. Bei einer ausgeschalteten Person leer: Die Codes bleiben gespeichert, werden aber nicht ausgeliefert.
persons[].credentials[].type* string Auswahl: pin, nfc
persons[].credentials[].value* string Der Code im Klartext.
persons[].credentials[].label* string, oder leer

* Pflichtfeld beziehungsweise immer vorhanden.

Account

FeldTypBedeutung
id* ulid Öffentliche Kennung (ULID). Fortlaufende Zahlen gibt es nach außen nicht: sie verrieten die Größe des Datenbestands und luden zum Durchprobieren ein.
firstName* string
lastName* string
email* string
emailVerified* boolean
practice* object Die Praxis, an die das verwendete Token gebunden ist.
practice.id* ulid Öffentliche Kennung (ULID). Fortlaufende Zahlen gibt es nach außen nicht: sie verrieten die Größe des Datenbestands und luden zum Durchprobieren ein.
practice.name* string
practice.accentColor* string, oder leer Akzentfarbe der Praxis (#rrggbb) oder null für die Vorgabe. Der Client wählt Schrift und Flächen daraus selbst kontrastsicher.
role* string, oder leer Auswahl: owner, management, therapist, reception, billing, assistant
roleLabel* string, oder leer
permissions* Liste von string Die Berechtigungen des Kontos in dieser Praxis.
tokenScopes* Liste von string Der Umfang des verwendeten Tokens. Er kann die Berechtigungen nur einschränken, nie erweitern.

* Pflichtfeld beziehungsweise immer vorhanden.

ApiToken

FeldTypBedeutung
id* string Kennung des Tokens.
name* string
deviceName* string, oder leer
abilities* Liste von string
lastUsedAt* date-time, oder leer
expiresAt* date-time, oder leer
createdAt* date-time, oder leer
current* boolean Das Token, mit dem diese Anfrage kam.
token string, oder leer Der Klartext - AUSSCHLIESSLICH in der Antwort auf das Anlegen. Danach ist er nicht mehr abrufbar, weil nur sein Hash gespeichert wird.

* Pflichtfeld beziehungsweise immer vorhanden.

Appointment

FeldTypBedeutung
id* ulid Öffentliche Kennung (ULID). Fortlaufende Zahlen gibt es nach außen nicht: sie verrieten die Größe des Datenbestands und luden zum Durchprobieren ein.
startsAt* date-time
endsAt* date-time
blockedFrom* date-time Beginn inklusive Vorbereitungszeit.
blockedUntil* date-time Ende inklusive Nachbereitungszeit.
durationMinutes* integer
preparationMinutes* integer
followUpMinutes* integer
status* string Auswahl: scheduled, confirmed, attended, no_show, cancelled
statusLabel* string
title* string, oder leer
isSeriesException* boolean
seriesId* ulid, oder leer Öffentliche Kennung (ULID). Fortlaufende Zahlen gibt es nach außen nicht: sie verrieten die Größe des Datenbestands und luden zum Durchprobieren ein.
seriesSequence* integer, oder leer
cancelledAt* date-time, oder leer
patient object Fehlt bei Terminen ohne Patientenbezug (Besprechung, Sperrzeit).
patient.id* ulid Öffentliche Kennung (ULID). Fortlaufende Zahlen gibt es nach außen nicht: sie verrieten die Größe des Datenbestands und luden zum Durchprobieren ein.
patient.lastName* string
patient.firstName* string
type object
type.id* ulid Öffentliche Kennung (ULID). Fortlaufende Zahlen gibt es nach außen nicht: sie verrieten die Größe des Datenbestands und luden zum Durchprobieren ein.
type.name* string
type.color* string, oder leer
practitioner object
practitioner.id* ulid Öffentliche Kennung (ULID). Fortlaufende Zahlen gibt es nach außen nicht: sie verrieten die Größe des Datenbestands und luden zum Durchprobieren ein.
practitioner.name* string
room object
room.id* ulid Öffentliche Kennung (ULID). Fortlaufende Zahlen gibt es nach außen nicht: sie verrieten die Größe des Datenbestands und luden zum Durchprobieren ein.
room.name* string
clinical object Nur mit Zugriff auf die Behandlungsdaten dieses Termins: clinical.view, oder clinical.view_own_only an einem Termin, den das Konto selbst hält.
clinical.treatmentNote* string, oder leer
clinical.internalNote* string, oder leer
clinical.cancellationReason* string, oder leer
clinical.cancellationReasonCode* string, oder leer Der eingeordnete Absagegrund - das Feld, worüber sich Absagen auswerten lassen. null bei jedem Termin ohne Absage und bei älteren Absagen, die nur den Freitext tragen. Auswahl: patient_cancelled, patient_sick, patient_no_show, rescheduled, practice_cancelled, practitioner_sick, prescription_expired, other
createdAt* date-time, oder leer
updatedAt* date-time, oder leer

* Pflichtfeld beziehungsweise immer vorhanden.

AppointmentType

FeldTypBedeutung
id* ulid Öffentliche Kennung (ULID). Fortlaufende Zahlen gibt es nach außen nicht: sie verrieten die Größe des Datenbestands und luden zum Durchprobieren ein.
name* string
description* string, oder leer
color* string Farbe im Kalender, als #rrggbb.
durationMinutes* integer Vorgabedauer. Ein einzelner Termin darf davon abweichen.
preparationMinutes* integer Rüstzeit VOR dem Termin. Belegt Raum und Behandler mit, steht aber nicht in starts_at - deshalb ist die Sperre im Kalender länger als die Behandlung.
followUpMinutes* integer Rüstzeit NACH dem Termin.
requiresPatient* boolean Ohne Akte lässt sich ein Termin dieser Art nicht anlegen.
requiresRoom* boolean
onlineBookable* boolean Ob die Praxis diese Art zur Selbstbuchung freigegeben hat. Eine Buchungsoberfläche für Patient:innen zeigt nur, was hier true ist.
absenceKind* string, oder leer Gesetzt heisst: Sperre im Kalender (Pause, Besprechung, Urlaub) und keine buchbare Leistung. Leer heisst: gewöhnliche Terminart. Nicht am Namen erkennen - der ist frei änderbar.
active* boolean Stillgelegte Arten stehen nur mit ?includeInactive=true in der Liste. Bestehende Termine tragen sie weiterhin.

* Pflichtfeld beziehungsweise immer vorhanden.

Document

FeldTypBedeutung
id* ulid Kennung des erzeugenden Datensatzes.
kind* string Woher der Beleg stammt. Auswahl: invoice, dunningNotice, prescription
kindLabel* string
title* string
issuedOn* date
mediaType* string
sha256* string, oder leer Fingerabdruck der abgelegten Datei.
downloadPath* string, oder leer Pfad zum Abruf, sofern die Schnittstelle den Beleg ausliefert.

* Pflichtfeld beziehungsweise immer vorhanden.

FileUpload

FeldTypBedeutung
url* string Vorsignierte Adresse im Objektspeicher.
method* string Auswahl: PUT
headers* object Genau so mitschicken - Typ und Länge stehen in der Unterschrift.
headers.Content-Type* string
upload* string Versiegelter Beleg für den Abschluss (POST patients/{id}/files).
expiresAt* date-time

* Pflichtfeld beziehungsweise immer vorhanden.

FreeSlot

FeldTypBedeutung
startsAt* date-time
endsAt* date-time
blockedFrom* date-time
blockedUntil* date-time
durationMinutes* integer
practitionerId* ulid Öffentliche Kennung (ULID). Fortlaufende Zahlen gibt es nach außen nicht: sie verrieten die Größe des Datenbestands und luden zum Durchprobieren ein.
roomId* ulid, oder leer Öffentliche Kennung (ULID). Fortlaufende Zahlen gibt es nach außen nicht: sie verrieten die Größe des Datenbestands und luden zum Durchprobieren ein.

* Pflichtfeld beziehungsweise immer vorhanden.

Invoice

FeldTypBedeutung
id* ulid Öffentliche Kennung (ULID). Fortlaufende Zahlen gibt es nach außen nicht: sie verrieten die Größe des Datenbestands und luden zum Durchprobieren ein.
number* string Die Rechnungsnummer, oder "(Entwurf)".
type* string Auswahl: private_patient, statutory_clearing
typeLabel* string
status* string Auswahl: draft, open, paid, dunned, cancelled
statusLabel* string
patientId* ulid, oder leer Öffentliche Kennung (ULID). Fortlaufende Zahlen gibt es nach außen nicht: sie verrieten die Größe des Datenbestands und luden zum Durchprobieren ein.
issuedOn* date
dueOn* date
daysOverdue* integer
totalNetCents* integer Betrag in Cent.
totalTaxCents* integer Betrag in Cent.
totalGrossCents* integer Betrag in Cent.
dunningFeesCents* integer Betrag in Cent.
paidAmountCents* integer, oder leer Betrag in Cent.
outstandingCents* integer Betrag in Cent.
paidAt* date-time, oder leer
cancelledAt* date-time, oder leer
dunningLevel* string, oder leer Auswahl: reminder, first, second
hasDocument* boolean
items Liste von Objekten Nur mit include=items.
items[].id* ulid Öffentliche Kennung (ULID). Fortlaufende Zahlen gibt es nach außen nicht: sie verrieten die Größe des Datenbestands und luden zum Durchprobieren ein.
items[].kind* string Auswahl: service, remedy, copayment, missed_appointment
items[].kindLabel* string
items[].code* string, oder leer
items[].name* string
items[].unit* string, oder leer
items[].performedOn* date
items[].quantity* integer
items[].unitPriceCents* integer Betrag in Cent.
items[].taxRate* integer Basispunkte, 1900 = 19,00 %.
items[].netCents* integer Betrag in Cent.
items[].taxCents* integer Betrag in Cent.
items[].grossCents* integer Betrag in Cent.
createdAt* date-time, oder leer
updatedAt* date-time, oder leer

* Pflichtfeld beziehungsweise immer vorhanden.

LoginStep

FeldTypBedeutung
status* string authenticated: token steht bereit. twoFactorRequired: Code an auth/two-factor schicken. practiceRequired: eine der practices wählen und mit challenge an auth/two-factor schicken. Auswahl: authenticated, twoFactorRequired, practiceRequired
challenge string Versiegelte Zwischenstufe, wenige Minuten gültig.
expiresAt date-time Ablauf der Zwischenstufe.
practices Liste von Objekten
practices[].id* ulid Öffentliche Kennung (ULID). Fortlaufende Zahlen gibt es nach außen nicht: sie verrieten die Größe des Datenbestands und luden zum Durchprobieren ein.
practices[].name* string
token string Nur einmal zu sehen. Gehört ins sichere Speicherfach des Geräts.
tokenId string Kennung zum Widerruf (DELETE account/tokens/{token}).
practice object
practice.id* ulid Öffentliche Kennung (ULID). Fortlaufende Zahlen gibt es nach außen nicht: sie verrieten die Größe des Datenbestands und luden zum Durchprobieren ein.
practice.name* string

* Pflichtfeld beziehungsweise immer vorhanden.

Member

FeldTypBedeutung
id* ulid Kennung des Kontos.
firstName* string
lastName* string
email* string
role* string Auswahl: owner, management, therapist, reception, billing, assistant
roleLabel* string
status* string Auswahl: invited, active, suspended, left
statusLabel* string
treatsPatients* boolean
joinedAt* date-time, oder leer

* Pflichtfeld beziehungsweise immer vorhanden.

Notification

FeldTypBedeutung
id* string
kind* string, oder leer Auswahl: task, time_tracking, employment, message, mention, appointment, bounce, consent, whatsapp, import, support, prices, sms_quota, storage_quota, auto_top_up, call, malware, data_request
kindLabel* string, oder leer
title* string
body* string, oder leer Reiner Text, ohne Auszeichnung.
readAt* date-time, oder leer
createdAt* date-time, oder leer

* Pflichtfeld beziehungsweise immer vorhanden.

NotificationReadState

FeldTypBedeutung
marked* integer
unread* integer

* Pflichtfeld beziehungsweise immer vorhanden.

OpeningHour

FeldTypBedeutung
locationId* ulid, oder leer Öffentliche Kennung (ULID). Fortlaufende Zahlen gibt es nach außen nicht: sie verrieten die Größe des Datenbestands und luden zum Durchprobieren ein.
weekday* integer ISO-8601: 1 = Montag ... 7 = Sonntag.
weekdayLabel* string
opensAt* string
closesAt* string
breakStartsAt* string, oder leer
breakEndsAt* string, oder leer
note* string, oder leer
slots* Liste von Objekten Der Tag ohne Pause, fertig zerlegt.
slots[].from* string
slots[].to* string

* Pflichtfeld beziehungsweise immer vorhanden.

Patient

FeldTypBedeutung
id* ulid Öffentliche Kennung (ULID). Fortlaufende Zahlen gibt es nach außen nicht: sie verrieten die Größe des Datenbestands und luden zum Durchprobieren ein.
lastName* string
firstName* string
gender* string, oder leer Auswahl: M, F, D
genderLabel* string, oder leer
birthDate* date, oder leer
age* integer, oder leer
status* string Auswahl: active, inactive, archived, merged
statusLabel* string
guardian* object
guardian.firstName* string, oder leer
guardian.lastName* string, oder leer
guardian.gender* string, oder leer
insurance* object
insurance.provider* string, oder leer
insurance.type* string, oder leer
insurance.typeLabel* string, oder leer
contact* object
contact.phone* string, oder leer
contact.mobile* string, oder leer
contact.email* string, oder leer
address* object
address.street* string, oder leer
address.postalCode* string, oder leer
address.city* string, oder leer
clinical object Nur mit Zugriff auf die Behandlungsdaten dieser Akte: clinical.view, oder clinical.view_own_only bei einer Patientin, die das Konto behandelt. Fehlt er, fehlt der ganze Block. Anamnese und Notizen kommen als reiner Text, auch wenn sie in der Praxis mit Formatierung geschrieben wurden.
clinical.doctor* string, oder leer
clinical.diagnosis* string, oder leer
clinical.anamnesis* string, oder leer
clinical.notes* string, oder leer
mergedIntoId* ulid, oder leer Öffentliche Kennung (ULID). Fortlaufende Zahlen gibt es nach außen nicht: sie verrieten die Größe des Datenbestands und luden zum Durchprobieren ein.
createdAt* date-time, oder leer
updatedAt* date-time, oder leer
consents Liste von Objekten Nur mit include=consents.
consents[].id* ulid Öffentliche Kennung (ULID). Fortlaufende Zahlen gibt es nach außen nicht: sie verrieten die Größe des Datenbestands und luden zum Durchprobieren ein.
consents[].purpose* string Auswahl: appointment_reminder, invoice_delivery, document_delivery, practice_notice
consents[].purposeLabel* string
consents[].channel* string Auswahl: sms, email, whatsapp
consents[].channelLabel* string
consents[].grantedAt* date-time, oder leer
consents[].revokedAt* date-time, oder leer
consents[].active* boolean
consents[].revocationNote* string, oder leer

* Pflichtfeld beziehungsweise immer vorhanden.

PatientFile

FeldTypBedeutung
id* ulid Öffentliche Kennung (ULID). Fortlaufende Zahlen gibt es nach außen nicht: sie verrieten die Größe des Datenbestands und luden zum Durchprobieren ein.
title* string
category* string Auswahl: doctor_letter, prescription, finding, certificate, consent, photo, correspondence, other
categoryLabel* string
issuedOn* date, oder leer
mediaType* string
sizeBytes* integer
scanStatus* string, oder leer Ergebnis der Virenprüfung. Nur "sauber" (oder null bei altem Bestand) ist abrufbar; "ausstehend" heißt "wird geprüft". Auswahl: ausstehend, sauber, quarantaene, abgelehnt, fehler, geloescht
scanStatusLabel* string, oder leer
available* boolean Darf die Datei ausgeliefert werden?
uploadedByPatient* boolean
createdAt* date-time, oder leer

* Pflichtfeld beziehungsweise immer vorhanden.

Practice

FeldTypBedeutung
id* ulid Öffentliche Kennung (ULID). Fortlaufende Zahlen gibt es nach außen nicht: sie verrieten die Größe des Datenbestands und luden zum Durchprobieren ein.
name* string
email* string, oder leer
phone* string, oder leer
address* object
address.street* string, oder leer
address.houseNumber* string, oder leer
address.postalCode* string, oder leer
address.city* string, oder leer
address.countryCode* string
locations* Liste von Objekten
locations[].id* ulid Öffentliche Kennung (ULID). Fortlaufende Zahlen gibt es nach außen nicht: sie verrieten die Größe des Datenbestands und luden zum Durchprobieren ein.
locations[].name* string
locations[].street* string, oder leer
locations[].houseNumber* string, oder leer
locations[].postalCode* string, oder leer
locations[].city* string, oder leer
locations[].phone* string, oder leer
locations[].email* string, oder leer
locations[].isPrimary* boolean
locations[].isActive* boolean
createdAt* date-time, oder leer

* Pflichtfeld beziehungsweise immer vorhanden.

Prescription

FeldTypBedeutung
id* ulid Öffentliche Kennung (ULID). Fortlaufende Zahlen gibt es nach außen nicht: sie verrieten die Größe des Datenbestands und luden zum Durchprobieren ein.
type* string Auswahl: statutory, private, accident, dental, aid, self_pay
typeLabel* string
patientId* ulid, oder leer Öffentliche Kennung (ULID). Fortlaufende Zahlen gibt es nach außen nicht: sie verrieten die Größe des Datenbestands und luden zum Durchprobieren ein.
doctor* string
doctorLanr* string, oder leer
payerName* string, oder leer
payerIk* string, oder leer
issuedOn* date
receivedOn* date, oder leer
diagnosisCode string, oder leer Fehlt ohne Zugriff auf die Behandlungsdaten dieser Verordnung.
diagnosisGroup string, oder leer Fehlt ohne Zugriff auf die Behandlungsdaten dieser Verordnung.
remedy* string, oder leer
frequency* string, oder leer
treatmentStartBy* date, oder leer
validUntil* date, oder leer
billingDeadlineOn* date, oder leer
billingDeadlinePassed* boolean
homeVisit* boolean
longTermNeed* boolean
completedAt* date-time, oder leer
quota* object
quota.prescribed* integer
quota.used* integer
quota.remaining* integer Nie negativ.
quota.exceeded* boolean Mehr behandelt als verordnet.
quota.exhausted* boolean
report* object
report.required* boolean
report.dueAfterUnits* integer
report.due* boolean
report.finalized* boolean
copayment* object
copayment.required* boolean
copayment.exempt* boolean
copayment.status* string Auswahl: not_required, exempt, open, partially_paid, paid
copayment.statusLabel* string
copayment.amountCents* integer, oder leer Betrag in Cent.
copayment.paidCents* integer Betrag in Cent.
copayment.outstandingCents* integer Betrag in Cent.
remedies Liste von Objekten Nur mit include=remedies.
remedies[].positionNumber* string, oder leer
remedies[].name* string
remedies[].kind* string Auswahl: primary, optional, supplementary, combination
remedies[].kindLabel* string
remedies[].quantity* integer
remedies[].frequency* string, oder leer
createdAt* date-time, oder leer
updatedAt* date-time, oder leer

* Pflichtfeld beziehungsweise immer vorhanden.

PrescriptionQuota

FeldTypBedeutung
prescriptionId* ulid Öffentliche Kennung (ULID). Fortlaufende Zahlen gibt es nach außen nicht: sie verrieten die Größe des Datenbestands und luden zum Durchprobieren ein.
prescribed* integer
used* integer
remaining* integer
exceeded* boolean
exhausted* boolean
reportRequired* boolean
reportDueAfterUnits* integer
reportDue* boolean
reportFinalized* boolean
completedAt* date-time, oder leer
billingDeadlineOn* date, oder leer
billingDeadlinePassed* boolean

* Pflichtfeld beziehungsweise immer vorhanden.

Problem

FeldTypBedeutung
type* uri
title* string
status* integer
detail string
instance string

* Pflichtfeld beziehungsweise immer vorhanden.

RoomOccupancy

FeldTypBedeutung
generatedAt* date-time Zeitpunkt der Erhebung. Alle Angaben beziehen sich auf ihn.
rooms* Liste von Objekten Alle AKTIVEN Räume der Praxis - auch die freien. Ein Raum, der stillschweigend fehlte, ließe sich von einem freien nicht unterscheiden.
rooms[].id* ulid Öffentliche Kennung (ULID). Fortlaufende Zahlen gibt es nach außen nicht: sie verrieten die Größe des Datenbestands und luden zum Durchprobieren ein.
rooms[].name* string Bezeichnung des Raums, wie die Praxis sie führt.
rooms[].occupied* boolean Läuft in diesem Raum gerade eine Belegung? Gezählt wird der Zeitraum einschließlich Vor- und Nachbereitung - also genau das, was auch die Konfliktprüfung als belegt ansieht. Abgesagte Termine zählen nicht.
rooms[].until* date-time, oder leer Ende der laufenden Belegung, null bei freiem Raum. Bei zwei sich überschneidenden Terminen das spätere Ende.
rooms[].nextStart* date-time, oder leer Beginn der nächsten Belegung an DIESEM Tag, null wenn heute keine mehr folgt. Bewusst auf den laufenden Tag begrenzt: ein Wert von übermorgen taugt für keine Vorheizregel.

* Pflichtfeld beziehungsweise immer vorhanden.

Service

FeldTypBedeutung
id* ulid Öffentliche Kennung (ULID). Fortlaufende Zahlen gibt es nach außen nicht: sie verrieten die Größe des Datenbestands und luden zum Durchprobieren ein.
code* string, oder leer
name* string
description* string, oder leer
unit* string, oder leer
unitPriceCents* integer Nettopreis in Cent.
taxRate* integer Basispunkte, 1900 = 19,00 %.
validFrom* date, oder leer
validUntil* date, oder leer
active* boolean

* Pflichtfeld beziehungsweise immer vorhanden.

Session

FeldTypBedeutung
id* string Vollständige Sitzungskennung - sie wird zum Beenden gebraucht.
ipAddress* string, oder leer
device* string
lastActiveAt* date-time
current* boolean

* Pflichtfeld beziehungsweise immer vorhanden.

Task

FeldTypBedeutung
id* ulid Öffentliche Kennung (ULID). Fortlaufende Zahlen gibt es nach außen nicht: sie verrieten die Größe des Datenbestands und luden zum Durchprobieren ein.
title* string
notes* string, oder leer
status* string Auswahl: open, in_progress, done, cancelled
statusLabel* string
priority* string Auswahl: low, normal, high
priorityLabel* string
dueOn* date, oder leer
overdue* boolean Offen und die Fälligkeit liegt vor heute.
recurring* boolean Vorkommen einer wiederkehrenden Aufgabe.
patientId* ulid, oder leer Öffentliche Kennung (ULID). Fortlaufende Zahlen gibt es nach außen nicht: sie verrieten die Größe des Datenbestands und luden zum Durchprobieren ein.
assignees* Liste von Objekten Leer heißt: niemand zuständig.
assignees[].id* ulid Kennung des Kontos.
assignees[].name* string
createdBy* object, oder leer
completedAt* date-time, oder leer
completedBy* object, oder leer
createdAt* date-time, oder leer
updatedAt* date-time, oder leer

* Pflichtfeld beziehungsweise immer vorhanden.