TERMINGO Kalender
Schnittstellendokumentation
Dieses Dokument beschreibt die Schnittstelle zum Zugriff auf Kalenderdaten der TERMINGO-Kalenderanwendung. Es enthält die folgenden Themen:
Allgemeines
Diese Dokumentation verwendet die folgenden grafischen Elemente zur Hervorhebung:
Dringende Information oder dringender Hinweis.
Wichtige Information oder wichtiger Hinweis.
Allgemeine Information oder allgemeiner Hinweis.
- Beispiel zum aktuellen Kontext dieser Dokumentation.
- Listet die verwendeten Routen auf.
- Die gekennzeichnete Eigenschaft wird nur mit dem passenden Expand-Parameter ermittelt.
- Links zu weiterführenden Informationen.
Interner Verweis Verweist auf einen Bestandteil dieser Dokumentation.
Externer Verweis Verweist auf eine Webseite außerhalb dieser Dokumentation.
Unveränderlichkeit Bestimmte Modelle und Datensätze können nicht verändert werden. Dies dient der Nachvollziehbarkeit und der Validität existierender Datensätze. Stattdessen wird bei Aktualisierungen ein neuer Datensatz generiert und der alte Datensatz gesperrt. Dies führt zu neuen internen IDs!
Externe Referenzen
Fast alle filialspezifischen Objekte stellen mit der Eigenschaft integrationId die Möglichkeit zum Speichern einer externen Referenz zur Verfügung. Diese Integrationsschlüssel sind als 10-stellige, vorzeichenlose Nummern (Wertebereich 0 .. 10 Milliarden - 1) pro Objekttyp und Filiale eindeutig zu belegen, da dieser Wert in der Kalenderanwendung indiziert wird. Die Verwendung längerer Integrationsschlüssel (mehr als 10 Ziffern) wird von der API nicht akzeptiert und mit einer Fehlermeldung quittiert.
Objekt-Adressierung über ID in der URL
Der Großteil der manipulativen Routen (POST, DELETE) erfordert die Angabe der ID des betroffenen Objekts als dynamischen Bestandteil der URL. Bei einigen GET-Routen ist diese Form der Einschränkung per ID optional möglich. In dieser Dokumentation werden diese ID-Bestandteile als Platzhalter in geschweiften Klammern dargestellt: {objectId}
Die Angabe verweist standardmäßig auf die interne, numerische ID des Objekts in der Kalenderanwendung. Bei Objekten welche über eine integrationId verfügen kann zudem mit Hilfe des Präfix ref: auch die externe ID für die Eingrenzung verwendet werden.
- Zugriff auf die Dienstleistung mit der internen ID
1234 - GET /management/service/1234
- Zugriff auf den Mitarbeiter mit der integrationId
87050021 - DELETE /management/employee/ref:87050021
Session-Handling mit JSON Web Token
Nach der erfolgreichen Authentifizierung erfolgt das Session Handling über einen JSON Web Token (JWT). Implementierungen in verschiedenen Programmiersprachen werden auf der JWT-Homepage aufgelistet.
Der Token hat folgenden Payload:
{
"iss": "termingo-planner-api",
"iat": 1516239022,
"exp": 1516259022,
"version": "1.2.345"
}
Die Eigenschaften im Payload haben folgende Bedeutung:
Der JSON Web Token, der in den HTTP Headers der Antwort der Authentifizierungsroute nach erfolgreicher Authentifizierung zurückgeliefert wird. Dieser Token muss bei jedem nachfolgenden API-Aufruf als HTTP-Header X-Auth-Token mitgesendet werden.
Wenn der übermittelte Token ungültig oder abgelaufen ist, reagieren die Routen mit dem HTTP Status Code 401. Durch erneuten Aufruf der Authentifizierungsroute kann dann ein neuer, gültiger Token ausgestellt werden.
Authentifizierung
Die Authentifizierung erfolgt über den Austausch eines Hashes eines Filial-spezifischen API-Keys.
API-Key
Der API-Key ist ein global eindeutiger Identifier (GUID, Global Unique ID). Jeder Store erhält für Zugriffe auf die Kalenderdaten einen eigenen API-Key.
Der API-Key wird während der Initialisierung des Kalenders automatisch generiert. Optional kann der Filiale durch ein Passwort den Zugriff zusätzlich schützen. Details dazu siehe auch Ersteinrichtung.
Steuerung der API-Aufrufe
Die API-Aufrufe können mit zusätzlichen Parametern als URL Query Part versehen werden. Die Angabe erfolgt im üblichen Format ?param1=value1¶m2=value2&...¶mN=valueN.
Es ist darauf zu achten, dass Sonderzeichen in ihren entsprechenden Entitäten übermittelt werden.
Allgemeine Parameter
Die folgenden allgemeinen Parameter können bei jedem Aufruf übergeben werden.
correlation string
Die zu verwendende Vorgangs-ID. Wird keine Vorgangs-ID angegeben, wird automatisch eine ID erzeugt.
Wichtig: Vorgangs-IDs sollten eindeutig sein und aus nicht mehr als 50 Zeichen bestehen. Die Verwendung nicht eindeutiger Vorgang-IDs kann zu unerwarteten Ergebnissen führen.
skip number
Die bei der Datenermittlung zu überspringenden Datensätze. Wird ignoriert, wenn der Aufruf keine Auflistung an Datensätzen ermittelt.
limit number
Die zu maximale Anzahl der zu ermittelnden Datensätze. Wird ignoriert, wenn der Aufruf keine Auflistung an Datensätzen ermittelt.
expand string
Die kommaseparierte Liste der zu erweiternden Eigenschaften bei der Datenermittlung. Welche Eigenschaften erweitert werden können ist bei den entsprechenden Routen vermerkt.
Ergebnis der API-Aufrufe
Jeder API-Aufruf wird mit einem entsprechenden HTTP-Statuscode und einem generischen Ergebnisobjekt quittiert. Das Ergebnisobjekt liefert im Fehlerfall zusätzlich zum HTTP-Statuscode einen
anwendungsbezogenen Fehlercode.
Allgemeine Response Status Codes
Die folgenden HTTP Status Codes werden allgemein verwendet. Wenn eine Route zusätzliche HTTP Status Codes verwendet, ist dies bei der jeweiligen Route angegeben.
200 Der Vorgang wurde erfolgreich bearbeitet.
201 Der Vorgang wurde erfolgreich bearbeitet und es wurde ein neues Element angelegt. Dies wird statt dem Status Code 200 für POST-Requests gesendet, bei denen ein Element in der Datenbank angelegt wurde.
204 Der Vorgang wurde erfolgreich bearbeitet und liefert keine Daten zurück.
304 Der Vorgang wurde erfolgreich abgebrochen, weil keine zu verarbeitenden Daten gefunden wurden. Dies wird in der Regel gesendet, wenn kein Update eines bestehenden Datensatzes möglich war bzw. bei Abfragen unter Verwendung der Änderungsverfolgung.
401 Nicht angemeldet. Bitte mit der entsprechenden Route anmelden.
403 Die mitgelieferten Anmeldedaten sind nicht korrekt, abgelaufen oder es fehlen Berechtigungen, um im aktuellen Kontext auf die Route zuzugreifen.
404 Das angegebene Objekt wurde nicht gefunden. Dies geschieht in der Regel bei Routen, die eine ID enthalten und diese ID nicht aufgelöst werden kann bzw. kein passender Datensatz existiert.
409 Der Vorgang wurde abgebrochen, da es Konflikte mit zwischenzeitlichen Änderungen gibt. Dies geschieht in der Regel bei Routen, die einen Datensatz aktualisieren sollen der zuvor anderweitig verändert wurde. Um das Problem zu beheben, bitte zunächst Datensatz abrufen.
412 Der Aktualisierungsvorgang wurde aufgrund eines Versionskonfliktes abgebrochen. Wird nur bei Verwendung des HTTP-Anfrageheaders If-Unmodified-Since und für Aktualisierungsrouten verwendet. Siehe auch Änderungsverfolgung.
415 Die übermittelten Daten haben das falsche oder ein unbekanntes Datenformat.
424 Der Vorgang wurde wegen einer fehlenden Vorraussetzung abgebrochen. Dies deutet normalerweise auf einen Validierungsfehler hin.
500 Bei der Verarbeitung des Requests ist ein Fehler aufgetreten.
501 Die aufgerufene Route existiert nicht.
503 Der Endpunkt steht im Moment aus technischen Gründen nicht zur Verfügung. Der Aufruf sollte zu einem späteren Zeitpunkt erneut übermittelt werden.
Sicherheitsmaßnahmen
Zur Sicherstellung der Betriebsfähigkeit und zur Vermeidung von Datenabzug ist die API durch verschiedene technische Maßnahmen abgesichert. Die genaue Konfiguration der Sicherheitsparameter kann beim Betreiber der API angefragt werden.
Anfragelimitierung Pro zugreifendem Endgerät wird nur eine bestimmte Anzahl an Requests in einem bestimmten Zeitfenster erlaubt. Wenn Sie dieses Limit überschreiten, wird Ihr Client blockiert und Sie erhalten eine entsprechende Fehlermeldung. Bitte passen Sie in einem solchen Fall Ihre Requests entsprechend an oder senden Sie Ihre Requests nicht direkt hintereinander.
Empfehlung Nutzen Sie, sofern vorhanden, bei verändernden Routen die Variante mit mehreren Eingabeobjekten um bei Massenimports und -updates nicht von der Anfragelimitierung geblockt zu werden.
Änderungsverfolgung
Einige Stammdatenobjekte sowie Termine enthalten Zeitstempel zur Nachverfolgung von Änderungen (siehe ITrackModification). Die internen Zeitstempel werden automatisch vom System bei Anlage (ITrackModification.internalCreatedAt) sowie bei jeder Änderung (ITrackModification.internalModifiedAt). Außerdem stehen mit ITrackModification.externalCreatedAt und ITrackModification.externalModifiedAt zwei Zeitstempel für die optionale Speicherung von externen Zeitstempeln zur Verfügung.
Für diese Objekte bieten die Routen Unterstützung für Änderungsverfolgung nach dem ETag-Standard (MDN). Der ETag repräsentiert den aktuellsten Zeitstempel des betroffenen Objekts / der betroffenen Objekte (internalModifiedAt oder internalCreatedAt) als UNIX-Zeitstempel (UTC).
Liefert eine Route mit Änderungsverfolgung ein oder mehrere Datenobjekte zurück, wird der aktuellste Zeitstempel im HTTP-Anwortheader ETag mitgeliefert und kann (alternativ) durch Auslesen oder Enumerieren über die Eigenschaften internalModifiedAt oder internalCreatedAt ermittelt werden.
Für die Abfrage von Objekten und (optional) beim Aktualisieren von Objekten kann der zuletzt bekannte Änderungszeitstempel bei der Anfrage mitgeschickt werden, um nur geänderte Objekte abzurufen oder um bei Änderungen Versionskonflikte zu erkennen. Dazu steht der optionale URL-Parameter etag (sowie der Alias since) zur Verfügung. Alternativ kann bei diesen Routen der HTTP-Anfrageheader If-Match (MDN) sowie If-Unmodified-Since (MDN, nur für Aktualisierungen) angegeben werden. Bei der Angabe dieser HTTP-Header werden etwaige URL-Parameter etag und since ignoriert.
Der ebenfalls im ETag-Standard definierte HTTP-Anfrageheader If-None-Match wird aktuell nicht unterstützt.
Die folgenden Beispiele zeigen die Verwendung der Änderungsverfolgung für verschiedene Arten von Routen:
- Abfrage von geänderten Objekten
GET /route?since=1653042896 Liefert alle nach dem 20. Mai 2022, 12:34:56 Uhr MESZ (10:34 UTC bzw. GMT) angelegten oder geänderten Objekte.
- oder alternativ mit HTTP-Anfrageheader
GET /route
If-Match: "1653042896"
- Aktualisierung eines Objekts
PUT /route/{itemId}?etag=1653042896 Aktualisiert das Objekt nur, wenn es sich nach dem 20. Mai 2022, 12:34:56 Uhr MESZ (10:34 UTC bzw. GMT) nicht geändert hat und liefert andernfalls den HTTP-Statuscode 412 Precondition Failed zurück.
- oder alternativ mit HTTP-Anfrageheader
PUT /route/{itemId}
If-Unmodified-Since: "1653042896" (statt If-Unmodified-Since kann auch If-Match gesendet werden)
Die Änderungsverfolgung ist hilfreich für eine bessere Integration, z.B. um zu übetragende Datenmengen zu reduzieren, um gecachte Objekte zu synchronisieren oder um Konflikte zwischen intern und extern modifizierten Objekten zu erkennen.
Routen
Im Folgenden werden die Routen der RESTful-Schnittstelle für den Zugriff auf die Kalenderdaten beschrieben.
Session-Handling
POST /session/login
Versucht die Anmeldung am Kalenderservice mit den übermittelten Informationen.
GET /session/logout
Beendet die aktuelle Sitzung und leert die Sitzungsdaten.
Management
Die folgenden Routen stehen für die Konfiguration des Filialkalenders zur Verfügung.
Filiale - Allgemein
GET /management/store
Liefert die Daten zur Filiale.
- URL-Parameter
- etag number Optional. Der UNIX-Zeitstempel (UTC) zum Einschränken der Ergebnismenge anhand der letzten Änderung. Siehe Änderungsverfolgung. Werden durch die Einschränkung keine Ergebnisobjekte gefunden, liefert die Route 304 Not Modified zur Unterstützung von Cache-Mechanismen.
- since number Optional. Alias für etag.
siehe auch Allgemeine Parameter
- Request Body
- Response Body
IApiResponseModel<IStoreModel>
POST /management/store
Initialisiert die Kalendereinstellungen. Dabei wird ein eindeutiger API-Key generiert. Dieser wird im Ergebnis zurück geliefert und dient zur Authentifizierung gegenüber der API.
PUT /management/store
Aktualisiert die Daten der Filiale. Nur die zu ändernden Eigenschaften müssen übergeben werden.
- URL-Parameter
- etag number Optional. Der UNIX-Zeitstempel (UTC) zum Einschränken der Ergebnismenge anhand der letzten Änderung. Siehe Änderungsverfolgung. Werden durch die Einschränkung keine Ergebnisobjekte gefunden, liefert die Route 304 Not Modified zur Unterstützung von Cache-Mechanismen.
- since number Optional. Alias für etag.
siehe auch Allgemeine Parameter
- Request Body
IStoreModel
- Response Body
IApiResponseModel<IStoreModel>
DELETE /management/store
Entfernt die Kassenintegration für die Filiale.
VORSICHT! Gelöschte Elemente können nur vom Administrator manuell wiederhergestellt werden!
- URL-Parameter
- disable void Optional. Wenn angegeben wird die Filiale komplett deaktiviert und für Kalendernutzung und Online-Buchung gesperrt.
siehe Allgemeine Parameter
- Request Body
- Response Body
IApiResponseModel<void>
POST /management/store/reset
Entfernt Bestandteile der Filialkonfiguration.
VORSICHT! Gelöschte Elemente können nur vom Administrator manuell wiederhergestellt werden!
GET /management/step-types
Liefert die im System verfügbaren Arten von Dienstleistungsschritten.
Die verfügbaren Arten sind statisch und für alle Filialen identisch.
Terminstati
GET /management/date-states
Liefert die verfügbaren Terminstati zur Filiale.
- URL-Parameter
- all boolean Optional. Wenn
true, werden alle Terminstati inklusive den inaktiven/gelöschten ermittelt. Der Standardwert ist false, d.h. es werden nur die aktiven Terminstati ermittelt.
siehe auch Allgemeine Parameter
- Request Body
- Response Body
IApiResponseModel<IDateStateModel[]>
GET /management/date-states/{dateStateId}
Liefert den Terminstatus mit der ID {dateStateId}.
- URL-Parameter
- dateStateId number Benötigt. Die interne oder externe ID des Terminstatus.
- all boolean Optional. Wenn
true, werden alle Terminstati inklusive den inaktiven/gelöschten ermittelt. Der Standardwert ist false, d.h. es werden nur die aktiven Terminstati ermittelt.
siehe auch Allgemeine Parameter
- Request Body
- Response Body
IApiResponseModel<IDateStateModel>
POST /management/date-states
Legt einen neuen Terminstatus an.
VORSICHT! Mit dem Hinzufügen des ersten Terminstatus werden alle Standard-Stati für die Filiale deaktiviert!
Anfragelimitierung Bei Masseninserts und -updates mehrere Objekte pro Request übergeben (empfohlen: 50), da sonst ggf. die
Sicherheitsmaßnahmen Ihren Client blockieren.
POST /management/date-states/reset
Setzt die verfügbaren Terminstati der Filiale auf den Standard zurück.
VORSICHT! Gelöschte Elemente können nur vom Administrator manuell wiederhergestellt werden!
PUT /management/store/{dateStateId}
Aktualisiert den Terminstatus mit der ID {dateStateId}. Nur die zu ändernden Eigenschaften müssen übergeben werden.
Unveränderlichkeit Bei Aktualisierung des Namens wird ein neuer Datensatz generiert und der bestehende Datensatz gesperrt. Dies führt zu einer neuen ID!
DELETE /management/date-states/{dateStateId}
Löscht bzw. deaktiviert den Terminstatus mit der ID {dateStateId}.
VORSICHT! Gelöschte Elemente können nur vom Administrator manuell wiederhergestellt werden!
Globale, filialunabhängige Terminstati können nicht gelöscht werden.
Nach dem Löschen des letzten Terminstatus einer Filiale werden die Standard-Stati wiederhergestellt.
Dienstleistungskategorien
GET /management/categories
Liefert eine Auflistung aller Dienstleistungskategorien.
- URL-Parameter
- all boolean Optional. Wenn
true, werden alle Kategorien inklusive den inaktiven/gelöschten ermittelt. Der Standardwert ist false, d.h. es werden nur die aktiven Kategorien ermittelt.
- etag number Optional. Der UNIX-Zeitstempel (UTC) zum Einschränken der Ergebnismenge anhand der letzten Änderung. Siehe Änderungsverfolgung. Werden durch die Einschränkung keine Ergebnisobjekte gefunden, liefert die Route 304 Not Modified zur Unterstützung von Cache-Mechanismen.
- since number Optional. Alias für etag.
siehe auch Allgemeine Parameter
- Request Body
- Response Body
IApiResponseModel<IServiceCategoryModel[]>
GET /management/categories/{categoryId}
Liefert die Dienstleistungskategorie mit der ID {categoryId}.
- URL-Parameter
- categoryId number Benötigt. Die interne oder externe ID der Dienstleistungskategorie.
- all boolean Optional. Wenn
true, werden alle Kategorien inklusive den inaktiven/gelöschten ermittelt. Der Standardwert ist false, d.h. es werden nur die aktiven Kategorien ermittelt.
- etag number Optional. Der UNIX-Zeitstempel (UTC) zum Einschränken der Ergebnismenge anhand der letzten Änderung. Siehe Änderungsverfolgung. Werden durch die Einschränkung keine Ergebnisobjekte gefunden, liefert die Route 304 Not Modified zur Unterstützung von Cache-Mechanismen.
- since number Optional. Alias für etag.
siehe auch Allgemeine Parameter
- Request Body
- Response Body
IApiResponseModel<IServiceCategoryModel>
POST /management/categories
Legt eine neue Dienstleistungskategorie an.
Anfragelimitierung Bei Masseninserts und -updates mehrere Objekte pro Request übergeben (empfohlen: 50), da sonst ggf. die
Sicherheitsmaßnahmen Ihren Client blockieren.
POST /management/categories/reset
Entfernt alle Dienstleistungskategorien der Filiale. Dadurch werden ebenfalls alle Dienstleistungen entfernt.
VORSICHT! Gelöschte Elemente können nur vom Administrator manuell wiederhergestellt werden!
PUT /management/categories/{categoryId}
Aktualisiert die Dienstleistungskategorie mit der ID {categoryId}. Nur die zu ändernden Eigenschaften müssen übergeben werden.
Diese Route kann sowohl zum Aktualisieren als auch zum Anlegen verwendet werden. Die ID aus der URL wird dabei nicht übernommen. Der Body darf in dieser Aufrufvariante nur ein Datenobjekt enthalten.
Unveränderlichkeit Bei Aktualisierung wird ein neuer Datensatz generiert und der bestehende Datensatz gesperrt. Dies führt zu einer neuen ID!
- URL-Parameter
- categoryId number Benötigt (wenn nicht in Request Body angegeben). Die interne oder externe ID der Dienstleistungskategorie.
- etag number Optional. Der UNIX-Zeitstempel (UTC) zum Einschränken der Ergebnismenge anhand der letzten Änderung. Siehe Änderungsverfolgung. Werden durch die Einschränkung keine Ergebnisobjekte gefunden, liefert die Route 304 Not Modified zur Unterstützung von Cache-Mechanismen.
- since number Optional. Alias für etag.
siehe auch Allgemeine Parameter
- Request Body
IServiceCategoryModel
- Response Body
IApiResponseModel<IServiceCategoryModel>
DELETE /management/categories/{categoryId}
Löscht bzw. deaktiviert die Dienstleistungskategorie mit der ID {categoryId}.
VORSICHT! Gelöschte Elemente können nur vom Administrator manuell wiederhergestellt werden!
Dienstleistungen
GET /management/services
Liefert eine Auflistung aller Dienstleistungen.
- URL-Parameter
- all boolean Optional. Wenn
true, werden alle Dienstleistungen inklusive den inaktiven/gelöschten ermittelt. Der Standardwert ist false, d.h. es werden nur die aktiven Dienstleistungen ermittelt.
- etag number Optional. Der UNIX-Zeitstempel (UTC) zum Einschränken der Ergebnismenge anhand der letzten Änderung. Siehe Änderungsverfolgung. Werden durch die Einschränkung keine Ergebnisobjekte gefunden, liefert die Route 304 Not Modified zur Unterstützung von Cache-Mechanismen.
- since number Optional. Alias für etag.
siehe auch Allgemeine Parameter
- Request Body
- Response Body
IApiResponseModel<IServiceModel[]>
GET /management/services/{serviceId}
Liefert die Dienstleistung mit der ID {serviceId}.
- URL-Parameter
- serviceId number Benötigt. Die interne oder externe ID der Dienstleistung.
- all boolean Optional. Wenn
true, werden alle Dienstleistungen inklusive den inaktiven/gelöschten ermittelt. Der Standardwert ist false, d.h. es werden nur die aktiven Dienstleistungen ermittelt.
- etag number Optional. Der UNIX-Zeitstempel (UTC) zum Einschränken der Ergebnismenge anhand der letzten Änderung. Siehe Änderungsverfolgung. Werden durch die Einschränkung keine Ergebnisobjekte gefunden, liefert die Route 304 Not Modified zur Unterstützung von Cache-Mechanismen.
- since number Optional. Alias für etag.
siehe auch Allgemeine Parameter
- Request Body
- Response Body
IApiResponseModel<IServiceModel>
GET /management/services/{serviceId}/relations
Liefert die Beziehungen zu Mitarbeitergruppen für die Dienstleistung mit der ID {serviceId}.
GET /management/services/{serviceId}/steps
Liefert die Dienstleistungsschritte der Dienstleistung mit der ID {serviceId}.
POST /management/services
Legt eine neue Dienstleistung an.
Anfragelimitierung Bei Masseninserts und -updates mehrere Objekte pro Request übergeben (empfohlen: 50), da sonst ggf. die
Sicherheitsmaßnahmen Ihren Client blockieren.
POST /management/services/reset
Entfernt alle Dienstleistungen der Filiale.
VORSICHT! Gelöschte Elemente können nur vom Administrator manuell wiederhergestellt werden!
POST /management/services/{serviceId}/relations
Legt eine neue Beziehung zu einer Mitarbeitergruppe für die Dienstleistung mit der ID {serviceId} an.
Anfragelimitierung Bei Masseninserts und -updates mehrere Objekte pro Request übergeben (empfohlen: 50), da sonst ggf. die
Sicherheitsmaßnahmen Ihren Client blockieren.
POST /management/services/{serviceId}/relations/reset
Entfernt alle Beziehungen zu Mitarbeitergruppen für die Dienstleistung mit der ID {serviceId}.
VORSICHT! Gelöschte Elemente können nicht wiederhergestellt werden!
POST /management/services/{serviceId}/steps
Legt einen neuen Dienstleistungsschritt für die Dienstleistung mit der ID {serviceId} an.
Anfragelimitierung Bei Masseninserts und -updates mehrere Objekte pro Request übergeben (empfohlen: 50), da sonst ggf. die
Sicherheitsmaßnahmen Ihren Client blockieren.
PUT /management/services/{serviceId}
Aktualisiert die Dienstleistung mit der ID {serviceId}. Nur die zu ändernden Eigenschaften müssen übergeben werden.
Diese Route kann sowohl zum Aktualisieren als auch zum Anlegen verwendet werden. Die ID aus der URL wird dabei nicht übernommen. Der Body darf in dieser Aufrufvariante nur ein Datenobjekt enthalten.
Unveränderlichkeit Bei Aktualisierung wird ein neuer Datensatz generiert und der bestehende Datensatz gesperrt. Dies führt zu einer neuen ID!
- URL-Parameter
- serviceId number Benötigt (wenn nicht in Request Body angegeben). Die interne oder externe ID der Dienstleistung.
- etag number Optional. Der UNIX-Zeitstempel (UTC) zum Einschränken der Ergebnismenge anhand der letzten Änderung. Siehe Änderungsverfolgung. Werden durch die Einschränkung keine Ergebnisobjekte gefunden, liefert die Route 304 Not Modified zur Unterstützung von Cache-Mechanismen.
- since number Optional. Alias für etag.
siehe auch Allgemeine Parameter
- Request Body
IServiceModel
- Response Body
IApiResponseModel<IServiceModel>
PUT /management/services/{serviceId}/relations
Aktualisiert die übergebene Beziehung zu einer Mitarbeitergruppe für die Dienstleistung mit der ID {serviceId} an.
PUT /management/services/{serviceId}/steps
Aktualisiert den übergebenen Dienstleistungsschritt für die Dienstleistung mit der ID {serviceId}.
DELETE /management/services/{serviceId}
Löscht bzw. deaktiviert die Dienstleistung mit der ID {serviceId}.
VORSICHT! Gelöschte Elemente können nur vom Administrator manuell wiederhergestellt werden!
Dienstleistungspakete
GET /management/packages
Liefert eine Auflistung aller Dienstleistungspakete.
- URL-Parameter
- all boolean Optional. Wenn
true, werden alle Dienstleistungspakete inklusive den inaktiven/gelöschten ermittelt. Der Standardwert ist false, d.h. es werden nur die aktiven Dienstleistungspakete ermittelt.
- etag number Optional. Der UNIX-Zeitstempel (UTC) zum Einschränken der Ergebnismenge anhand der letzten Änderung. Siehe Änderungsverfolgung. Werden durch die Einschränkung keine Ergebnisobjekte gefunden, liefert die Route 304 Not Modified zur Unterstützung von Cache-Mechanismen.
- since number Optional. Alias für etag.
siehe auch Allgemeine Parameter
- Request Body
- Response Body
IApiResponseModel<IPackageModel[]>
GET /management/packages/{packageId}
Liefert das Dienstleistungspaket mit der ID {packageId}.
- URL-Parameter
- packageId number Benötigt. Die interne oder externe ID des Dienstleistungspakets.
- all boolean Optional. Wenn
true, werden alle Dienstleistungspakete inklusive den inaktiven/gelöschten ermittelt. Der Standardwert ist false, d.h. es werden nur die aktiven Dienstleistungspakete ermittelt.
- etag number Optional. Der UNIX-Zeitstempel (UTC) zum Einschränken der Ergebnismenge anhand der letzten Änderung. Siehe Änderungsverfolgung. Werden durch die Einschränkung keine Ergebnisobjekte gefunden, liefert die Route 304 Not Modified zur Unterstützung von Cache-Mechanismen.
- since number Optional. Alias für etag.
siehe auch Allgemeine Parameter
- Request Body
- Response Body
IApiResponseModel<IPackageModel>
GET /management/packages/{packageId}/services
Liefert die Dienstleistungen des Dienstleistungspakets mit der ID {packageId}.
POST /management/packages
Legt ein neues Dienstleistungspaket an.
Anfragelimitierung Bei Masseninserts und -updates mehrere Objekte pro Request übergeben (empfohlen: 50), da sonst ggf. die
Sicherheitsmaßnahmen Ihren Client blockieren.
POST /management/packages/reset
Entfernt alle Dienstleistungspakete der Filiale.
VORSICHT! Gelöschte Elemente können nur vom Administrator manuell wiederhergestellt werden!
POST /management/packages/{packageId}/services
Legt eine neue Dienstleistung für das Dienstleistungspaket mit der ID {packageId} an.
Anfragelimitierung Bei Masseninserts und -updates mehrere Objekte pro Request übergeben (empfohlen: 50), da sonst ggf. die
Sicherheitsmaßnahmen Ihren Client blockieren.
PUT /management/packages/{packageId}
Aktualisiert das Dienstleistungspaket mit der ID {packageId}. Nur die zu ändernden Eigenschaften müssen übergeben werden.
Diese Route kann sowohl zum Aktualisieren als auch zum Anlegen verwendet werden. Die ID aus der URL wird dabei nicht übernommen. Der Body darf in dieser Aufrufvariante nur ein Datenobjekt enthalten.
Unveränderlichkeit Bei Aktualisierung wird ein neuer Datensatz generiert und der bestehende Datensatz gesperrt. Dies führt zu einer neuen ID!
- URL-Parameter
- packageId number Benötigt (wenn nicht in Request Body angegeben). Die interne oder externe ID des Dienstleistungspakets.
- etag number Optional. Der UNIX-Zeitstempel (UTC) zum Einschränken der Ergebnismenge anhand der letzten Änderung. Siehe Änderungsverfolgung. Werden durch die Einschränkung keine Ergebnisobjekte gefunden, liefert die Route 304 Not Modified zur Unterstützung von Cache-Mechanismen.
- since number Optional. Alias für etag.
siehe auch Allgemeine Parameter
- Request Body
IPackageModel
- Response Body
IApiResponseModel<IPackageModel>
PUT /management/packages/{packageId}/services
Aktualisiert die übergebenene Dienstleistungszuordnung für das Dienstleistungspaket mit der ID {packageId}.
DELETE /management/packages/{packageId}
Löscht bzw. deaktiviert das Dienstleistungspaket mit der ID {packageId}.
VORSICHT! Gelöschte Elemente können nur vom Administrator manuell wiederhergestellt werden!
Mitarbeitergruppen
GET /management/groups
Liefert eine Auflistung aller Mitarbeitergruppen.
- URL-Parameter
- all boolean Optional. Wenn
true, werden alle Mitarbeitergruppen inklusive den inaktiven/gelöschten ermittelt. Der Standardwert ist false, d.h. es werden nur die aktiven Mitarbeitergruppen ermittelt.
- etag number Optional. Der UNIX-Zeitstempel (UTC) zum Einschränken der Ergebnismenge anhand der letzten Änderung. Siehe Änderungsverfolgung. Werden durch die Einschränkung keine Ergebnisobjekte gefunden, liefert die Route 304 Not Modified zur Unterstützung von Cache-Mechanismen.
- since number Optional. Alias für etag.
siehe auch Allgemeine Parameter
- Request Body
- Response Body
IApiResponseModel<IEmployeeGroupModel[]>
GET /management/groups/{groupId}
Liefert die Mitarbeitergruppe mit der ID {groupId}.
- URL-Parameter
- groupId number Benötigt. Die interne oder externe ID der Mitarbeitergruppe.
- all boolean Optional. Wenn
true, werden alle Mitarbeitergruppen inklusive den inaktiven/gelöschten ermittelt. Der Standardwert ist false, d.h. es werden nur die aktiven Mitarbeitergruppen ermittelt.
- etag number Optional. Der UNIX-Zeitstempel (UTC) zum Einschränken der Ergebnismenge anhand der letzten Änderung. Siehe Änderungsverfolgung. Werden durch die Einschränkung keine Ergebnisobjekte gefunden, liefert die Route 304 Not Modified zur Unterstützung von Cache-Mechanismen.
- since number Optional. Alias für etag.
siehe auch Allgemeine Parameter
- Request Body
- Response Body
IApiResponseModel<IEmployeeGroupModel>
POST /management/groups
Legt eine neue Mitarbeitergruppe an.
Anfragelimitierung Bei Masseninserts und -updates mehrere Objekte pro Request übergeben (empfohlen: 50), da sonst ggf. die
Sicherheitsmaßnahmen Ihren Client blockieren.
POST /management/groups/reset
Entfernt alle Mitarbeitergruppen der Filiale.
VORSICHT! Gelöschte Elemente können nur vom Administrator manuell wiederhergestellt werden!
PUT /management/groups/{groupId}
Aktualisiert die Mitarbeitergruppe mit der ID {groupId}. Nur die zu ändernden Eigenschaften müssen übergeben werden.
Diese Route kann sowohl zum Aktualisieren als auch zum Anlegen verwendet werden. Die ID aus der URL wird dabei nicht übernommen. Der Body darf in dieser Aufrufvariante nur ein Datenobjekt enthalten.
Unveränderlichkeit Bei Aktualisierung wird ein neuer Datensatz generiert und der bestehende Datensatz gesperrt. Dies führt zu einer neuen ID!
- URL-Parameter
- groupId number Benötigt (wenn nicht in Request Body angegeben). Die interne oder externe ID der Mitarbeitergruppe.
- etag number Optional. Der UNIX-Zeitstempel (UTC) zum Einschränken der Ergebnismenge anhand der letzten Änderung. Siehe Änderungsverfolgung. Werden durch die Einschränkung keine Ergebnisobjekte gefunden, liefert die Route 304 Not Modified zur Unterstützung von Cache-Mechanismen.
- since number Optional. Alias für etag.
siehe auch Allgemeine Parameter
- Request Body
IEmployeeGroupModel;
- Response Body
IApiResponseModel<IEmployeeGroupModel>
DELETE /management/groups/{groupId}
Löscht bzw. deaktiviert die Mitarbeitergruppe mit der ID {groupId}.
VORSICHT! Gelöschte Elemente können nur vom Administrator manuell wiederhergestellt werden!
Mitarbeiter
GET /management/employees
Liefert eine Auflistung aller Mitarbeiter.
- URL-Parameter
- all boolean Optional. Wenn
true, werden alle Mitarbeiter inklusive den inaktiven/gelöschten ermittelt. Der Standardwert ist false, d.h. es werden nur die aktiven Mitarbeiter ermittelt.
- etag number Optional. Der UNIX-Zeitstempel (UTC) zum Einschränken der Ergebnismenge anhand der letzten Änderung. Siehe Änderungsverfolgung. Werden durch die Einschränkung keine Ergebnisobjekte gefunden, liefert die Route 304 Not Modified zur Unterstützung von Cache-Mechanismen.
- since number Optional. Alias für etag.
siehe auch Allgemeine Parameter
- Request Body
- Response Body
IApiResponseModel<IEmployeeModel[]>
GET /management/employees/{employeeId}
Liefert den Mitarbeiter mit der ID {employeeId}.
- URL-Parameter
- employeeId number Benötigt. Die interne oder externe ID des Mitarbeiters.
- all boolean Optional. Wenn
true, werden alle Mitarbeiter inklusive den inaktiven/gelöschten ermittelt. Der Standardwert ist false, d.h. es werden nur die aktiven Mitarbeiter ermittelt.
- etag number Optional. Der UNIX-Zeitstempel (UTC) zum Einschränken der Ergebnismenge anhand der letzten Änderung. Siehe Änderungsverfolgung. Werden durch die Einschränkung keine Ergebnisobjekte gefunden, liefert die Route 304 Not Modified zur Unterstützung von Cache-Mechanismen.
- since number Optional. Alias für etag.
siehe auch Allgemeine Parameter
- Request Body
- Response Body
IApiResponseModel<IEmployeeModel>
POST /management/employees
Legt einen neuen Mitarbeiter an.
Anfragelimitierung Bei Masseninserts und -updates mehrere Objekte pro Request übergeben (empfohlen: 50), da sonst ggf. die
Sicherheitsmaßnahmen Ihren Client blockieren.
POST /management/employees/reset
Entfernt alle Mitarbeiter der Filiale.
VORSICHT! Gelöschte Elemente können nur vom Administrator manuell wiederhergestellt werden!
PUT /management/employees/{employeeId}
Aktualisiert den Mitarbeiter mit der ID {employeeId}. Nur die zu ändernden Eigenschaften müssen übergeben werden.
Diese Route kann sowohl zum Aktualisieren als auch zum Anlegen verwendet werden. Die ID aus der URL wird dabei nicht übernommen. Der Body darf in dieser Aufrufvariante nur ein Datenobjekt enthalten.
Unveränderlichkeit Bei Aktualisierung wird ein neuer Datensatz generiert und der bestehende Datensatz gesperrt. Dies führt zu einer neuen ID!
- URL-Parameter
- employeeId number Benötigt (wenn nicht in Request Body angegeben). Die interne oder externe ID des Mitarbeiters.
- etag number Optional. Der UNIX-Zeitstempel (UTC) zum Einschränken der Ergebnismenge anhand der letzten Änderung. Siehe Änderungsverfolgung. Werden durch die Einschränkung keine Ergebnisobjekte gefunden, liefert die Route 304 Not Modified zur Unterstützung von Cache-Mechanismen.
- since number Optional. Alias für etag.
siehe auch Allgemeine Parameter
- Request Body
IEmployeeModel
- Response Body
IApiResponseModel<IEmployeeModel>
DELETE /management/employees/{employeeId}
Löscht bzw. deaktiviert den Mitarbeiter mit der ID {employeeId}.
VORSICHT! Gelöschte Elemente können nur vom Administrator manuell wiederhergestellt werden!
POST /management/employees/{employeeId}/photo
Lädt ein neues Foto für den Mitarbeiter mit der ID {employeeId} hoch.
- URL-Parameter
- employeeId number Benötigt. Die interne oder externe ID des Mitarbeiters.
siehe auch Allgemeine Parameter
- Request Body
- Die Binärdaten des Mitarbeiterbildes. Es wird erwartet, dass diese Route als Ziel für einen HTML-Dateiupload verwendet wird.
- Response Body
IApiResponseModel<IEmployeeModel>
DELETE /management/employees/{employeeId}/photo
Löscht das Mitarbeiterfoto des Mitarbeiter mit der ID {employeeId}.
VORSICHT! Diese Operation kann nicht rückgängig gemacht werden!
Kunden
Die folgenden Routen stehen für den Zugriff auf die Kundendaten zur Verfügung. Um Kundendaten zu ermitteln kann zusätzlich die Kundensuche genutzt werden.
Ein direkter Abruf aller Kundendaten über die API ist aus Datenschutzgründen nicht möglich.
POST /customers
Legt einen neuen Kunden an. Wenn der Datensatz bereits existiert, wird stattdessen ein Update durchgeführt.
Anfragelimitierung Bei Masseninserts und -updates mehrere Objekte pro Request übergeben (empfohlen: 50), da sonst ggf. die
Sicherheitsmaßnahmen Ihren Client blockieren.
GET /customers/{customerId}
Liefert den Datensatz des Kunden mit der ID {customerId}.
- URL-Parameter
- customerId number Benötigt (wenn nicht in Request Body angegeben). Die interne oder externe ID des Kunden.
- etag number Optional. Der UNIX-Zeitstempel (UTC) zum Einschränken der Ergebnismenge anhand der letzten Änderung. Siehe Änderungsverfolgung. Werden durch die Einschränkung keine Ergebnisobjekte gefunden, liefert die Route 304 Not Modified zur Unterstützung von Cache-Mechanismen.
- since number Optional. Alias für etag.
siehe auch Allgemeine Parameter
- Request Body
- Response Body
IApiResponseModel<ICustomerModel>
PUT /customers/{customerId}
Aktualisiert den Kunden mit der ID {customerId}. Nur die zu ändernden Eigenschaften müssen übergeben werden.
Diese Route kann sowohl zum Aktualisieren als auch zum Anlegen verwendet werden. Die ID aus der URL wird dabei nicht übernommen. Der Body darf in dieser Aufrufvariante nur ein Datenobjekt enthalten.
- URL-Parameter
- customerId number Benötigt (wenn nicht in Request Body angegeben). Die interne oder externe ID des Kunden.
- etag number Optional. Der UNIX-Zeitstempel (UTC) zum Einschränken der Ergebnismenge anhand der letzten Änderung. Siehe Änderungsverfolgung. Werden durch die Einschränkung keine Ergebnisobjekte gefunden, liefert die Route 304 Not Modified zur Unterstützung von Cache-Mechanismen.
- since number Optional. Alias für etag.
siehe auch Allgemeine Parameter
- Request Body
INewCustomerModel
- Response Body
IApiResponseModel<ICustomerModel>
DELETE /customers/{customerId}
Löscht bzw. deaktiviert den Kunden mit der ID {customerId}.
VORSICHT! Gelöschte Elemente können nur vom Administrator manuell wiederhergestellt werden!
GET /customers/{customerId}/history
Liefert die Terminhistorie des Kunden mit der ID {customerId}.
GET /customers/{customerId}/upcoming
Liefert die zukünftigen Termine des Kunden mit der ID {customerId}.
Termine
Die folgenden Routen stehen für den Zugriff auf die Termine zur Verfügung.
GET /dates
Liefert eine Auflistung der Termine mit den per Parameter übergebenen Argumenten.
- URL-Parameter
- mode string Optional. Der Modus für die Terminermittlung. Mögliche Werte sind in DateQueryMode definiert. Der Standardwert ist
day.
- day Date | number Optional. Das Datum für das Termine geliefert werden sollen, Angabe im JSON-ISO-Format (yyyy-mm-dd) oder als UNIX-Zeitstempel (Sekunden seit 01.01.1970). Der Standardwert ist das aktuelle Datum.
- type string Optional. Die Terminart, die ermittelt werden soll. Mögliche Werte sind in DateQueryType definiert. Der Standardwert ist
event.
- deleted boolean Optional. Wenn
true, werden nur gelöschte Termine ermittelt. Der Standardwert ist false, d.h. es werden nur die aktiven Termine ermittelt.
- etag number Optional. Der UNIX-Zeitstempel (UTC) zum Einschränken der Ergebnismenge anhand der letzten Änderung. Siehe Änderungsverfolgung. Werden durch die Einschränkung keine Ergebnisobjekte gefunden, liefert die Route 304 Not Modified zur Unterstützung von Cache-Mechanismen.
- since number Optional. Alias für etag.
siehe auch Allgemeine Parameter
- Request Body
- Response Body
POST /dates
Legt einen neuen Termin an.
Anfragelimitierung Bei Masseninserts und -updates mehrere Objekte pro Request übergeben (empfohlen: 50), da sonst ggf. die
Sicherheitsmaßnahmen Ihren Client blockieren.
GET /dates/{dateId}
Liefert den Datensatz des Termins mit der ID {dateId}.
- URL-Parameter
- dateId number Benötigt (wenn nicht in Request Body angegeben). Die interne oder externe ID des Termins.
- etag number Optional. Der UNIX-Zeitstempel (UTC) zum Einschränken der Ergebnismenge anhand der letzten Änderung. Siehe Änderungsverfolgung. Werden durch die Einschränkung keine Ergebnisobjekte gefunden, liefert die Route 304 Not Modified zur Unterstützung von Cache-Mechanismen.
- since number Optional. Alias für etag.
siehe auch Allgemeine Parameter
- Request Body
- Response Body
IApiResponseModel<IDateModel>
PUT /dates/{dateId}
Aktualisiert den Termin mit der ID {dateId}. Nur die zu ändernden Eigenschaften müssen übergeben werden.
- URL-Parameter
- dateId number Benötigt (wenn nicht in Request Body angegeben). Die interne oder externe ID des Termins.
- etag number Optional. Der UNIX-Zeitstempel (UTC) zum Einschränken der Ergebnismenge anhand der letzten Änderung. Siehe Änderungsverfolgung. Werden durch die Einschränkung keine Ergebnisobjekte gefunden, liefert die Route 304 Not Modified zur Unterstützung von Cache-Mechanismen.
- since number Optional. Alias für etag.
siehe auch Allgemeine Parameter
- Request Body
IDateModel \ IDateModel[]
- Response Body
IApiResponseModel<IDateModel \ IDateModel[]>
Anfragelimitierung Bei Masseninserts und -updates mehrere Objekte pro Request übergeben (empfohlen: 50), da sonst ggf. die
Sicherheitsmaßnahmen Ihren Client blockieren.
DELETE /dates/{dateId}
Löscht bzw. deaktiviert den Termin mit der ID {dateId}.
VORSICHT! Gelöschte Termine können nicht wiederhergestellt werden. Gelöschte Kundentermine werden mit den relevanten Daten separat gesichert!
- URL-Parameter
- dateId number Benötigt. Die interne oder externe ID des Termins.
- state string Optional. Die Kategorie des Terminstatus für den gelöschten Termin. Erlaubt sind nur Terminstati, die den (Termin abschließen).
- state_id number Optional, wird bei der Angabe von state ignoriert. Die interne ID des Terminstatus für den gelöschten Termin. Erlaubt sind nur Terminstati, die den (Termin abschließen).
- reason string Optional. Kurzbeschreibung des Löschgrundes (Freitext).
siehe auch Allgemeine Parameter
- Request Body
- Response Body
IApiResponseModel<boolean>
GET /dates/{dateId}/conflicts
Liefert Terminkonflikte den Termin mit der ID {dateId}.
- URL-Parameter
- dateId number Benötigt. Die interne oder externe ID des Termins.
siehe auch Allgemeine Parameter
- Request Body
- Response Body
IApiResponseModel<DatesDictionary>
Der Schlüssel des Dictionarys ist die ID des Dienstleistungsschritts des Termins, zu dem Konflikte vorliegen. Der Schlüssel hat das Format s{stepId}.
GET /conflicts
Liefert Terminkonflikte für übergebenen Termin.
- URL-Parameter
- dateId number Benötigt (wenn nicht in Request Body angegeben). Die interne oder externe ID des Termins.
siehe auch Allgemeine Parameter
- Request Body
IDateModel
- Response Body
IApiResponseModel<DatesDictionary>
Der Schlüssel des Dictionarys ist die ID des Dienstleistungsschritts des Termins, zu dem Konflikte vorliegen. Der Schlüssel hat das Format s{stepId}.
Suche
Die folgenden Routen stehen für die Suche nach verschiedenen Datenobjekten zur Verfügung.
GET /search/customer
Sucht nach einem Kunden.
- URL-Parameter
- query string Der Suchbegriff. Es wird eine Volltextsuche durchgeführt.
- {field} string|number Vergleicht das Feld mit den Namen
{field} mit dem übergebenen Wert.
Entweder der query oder ein field Parameter müssen verwendet werden. Mehrere Suchparameter werden mit AND kombiniert.
siehe auch Allgemeine Parameter
- Request Body
- Response Body
IApiResponseModel<ICustomerModel[]>
Sonstige Routen
GET /changes
Liefert alle Zeitstempel der letzten Änderungen für einzelne Objekttypen. Bestandteil der Änderungsverfolgung.
- Diese Route unterstützt beim Datenabruf die folgenden Werte für den Expand-Parameter:
- categories - Liefert die Auflistung modifiedCategories mit den neuen und geänderten Dienstleistungskategorien seit der letzten Abfrage
- services - Liefert die Auflistung modifiedServices mit den neuen und geänderten Dienstleistungen seit der letzten Abfrage
- packages - Liefert die Auflistung modifiedPackages mit den neuen und geänderten Dienstleistungspaketen seit der letzten Abfrage
- groups - Liefert die Auflistung modifiedGroups mit den neuen und geänderten Mitarbeitergruppen seit der letzten Abfrage
- employees - Liefert die Auflistung modifiedEmployees mit den neuen und geänderten Mitarbeitern seit der letzten Abfrage
- dates - Liefert die Auflistung modifiedDates mit den neuen und geänderten Terminen seit der letzten Abfrage
Die Angabe des Zeitpunkts der letzten Abfrage über das
ITrackModification-Interface ist bei Verwendung des Expand-Parameters erforderlich (entweder URL-Parameter oder HTTP-Header).
- URL-Parameter
- etag number Optional. Der UNIX-Zeitstempel (UTC) zum Einschränken der Ergebnismenge anhand der letzten Änderung. Siehe Änderungsverfolgung. Muss bei Verwendung des Expand-Parameter angeben werden.
- since number Optional. Alias für etag.
- days number Optional. Für die Kombination mit expand=dates. Schränkt die Liste der zurückgelieferten Termine in IAllModificationTimestamps.modifiedDates auf die angegebene Anzahl Tage ab heute ein (0 - nur heute, 1 - heute und morgen, usw.).
- Request Body
- Response Body
IApiResponseModel<IAllModificationTimestamps[]>
How-To
Hier finden Sie eine Sammlung beispielhafter Anleitungen.
Ersteinrichtung
Die Ersteinrichtung des Kalenders aus der Kasse heraus erfordert einige aufeinanderfolgende API-Aufrufe. Diese werden im Folgenden beschrieben.
- Registrieren der Filiale
POST /management/store
- Mitarbeitergruppen anlegen
POST /management/groups
(mindestens eine, mehrere durch wiederholte Aufrufe)
- Mitarbeiter anlegen
POST /management/employees
(mindestens einen, mehrere durch wiederholte Aufrufe)
- Dienstleistungskategorien anlegen
POST /management/categories
(mindestens eine, mehrere durch wiederholte Aufrufe)
- Dienstleistungen mit Schritten anlegen
POST /management/services
(mindestens eine, mehrere durch wiederholte Aufrufe)