So arbeiten Sie mit dem als Webservice implementierten REST API zu Vertec
Vertec liefert mit Version 6.8.0.17 ein generisches REST API zu Vertec als Webservice aus.
Er heisst REST und ist im Ordner Einstellungen > Schnittstellen > Webservices zu finden:

Der REST Webservice wird inaktiv ausgeliefert. Um ihn aktivieren und verwenden zu können, müssen dieselben Bedingungen erfüllt sein wie bei allen Webservices (Berechtigungen und API Token vorhanden).
Der Aufruf erfolgt über <ServerURL>/api/webservice/REST.
Auf die Vertec Objekte kann man via /objects zugreifen. Objekte können abgefragt (GET), geändert (PUT), erzeugt (POST) oder gelöscht (DELETE) werden.
Den aktuell angemeldeten Benutzer liefert folgender Endpunkt: /functions/currentuser. Dazu können optional die Query Parameter functions, result_members und bi_measures mitgegeben werden (siehe die Abschnitte Funktionen, Rückgabewerte und BI Daten (Kennzahlen)).
/objects/1665/objects/Administrator/UserAdmin.Die Daten können auch global abgefragt werden. Direkt mit einer Member-Suche oder auch via OCL oder SQL.
Dafür wird eine Query abgesetzt direkt auf der Klasse, also z.B. auf /objects/Project. Die Query startet mit einem ?, gefolgt von den entsprechenden Query-Parametern. Mehrere Query-Parameter werden mit & angehängt.
query_member wird das Member angegeben, mit query_value der gesuchte Wert. Für jedes abgefragte Member wird die Kombination von query_member und query_value nummeriert: query_member0 und query_value0, query_member1 und query_value1 etc.
Unterstützte Operatoren (als Präfix im Wert): =, <, >, <=, >= für integer, date, datetime, currency.
/objects/Project?query_member0=code&query_value0=com% sucht nach Projekten, dessen Code mit com beginnt.query_value wird die Interne ID des gesuchten Objekts angegeben:/objects/Project?query_member0=type&query_value0=179.Via SQL: Für SQL wird mit dem Query-Parameter sql eine globale SQL Abfrage abgesetzt: /objects/Project?sql=bold_id IN (SELECT project FROM openservice).
ocl wird eine OCL Expression abgesetzt: /objects?ocl=user->select(active).
/objects/1665?ocl=openservices.Das Resultat enthält ein Objekt oder eine Liste von Objekten. Zurückgegeben werden standardmässig von jedem Resultatobjekt die Interne ID (objid), die Standardanzeige des Objekts (stringrepresentation), der Klassenname (classname) sowie, ob das Objekt gültig ist (isvalid) und der Grund (hintisvalid), wenn ein Objekt ungültig ist.
Um weitere Members auszugeben, kann mit dem Query-Parameter result_members eine kommagetrennte Liste der entsprechenden Members angegeben werden: /objects/1665?result_members=code,description,regarding. Die angegebenen Members werden für jedes Resultatobjekt ausgegeben.
Über den Parameter functions können Funktionen auf Objekten aufgerufen und kann für Projektbearbeiter, Projekte und Phasen verwendet werden. Der Parameter muss als Query-Parameter mitgegeben und kann kommagetrennt vergleichbar mit Query-Parameter result_members angegeben werden (siehe dazu letzten Abschnitt Rückgabewert).
Das Beispiel ruft die Sollzeit und die Arbeitszeit des angemeldeten Bearbeiters auf mit den Zeit- und Datumsangaben in Minuten sowie im Monat Januar 2026.
/objects?ocl=user&result_members=loginname,abbreviation&functions=getStdHours,getWorkingHours&date_from=2026-01-01&date_till=2026-01-31
Hier ein Beispiel für einen Request mit functions und result_members:
/objects?ocl=user&result_members=loginname,abbreviation&functions=getStdHours,getWorkingHours&date_from=2026-01-01&date_till=2026-01-31
Result:
[
{
"objid": 506,
"stringrepresentation": "Administrator",
"classname": "User",
"isvalid" true,
"hintisvalid": "",
"loginname": "Administrator",
"abbreviation": "",
"getStdHours": 11220,
"getWorkingHours": 60
},
… // weitere User
]
Nachfolgend sind noch alle Werte aufgelistet, die über functions aufgerufen werden können. Viele dieser Werte sind dieselben und funktionieren gleich wie die OCL Operatoren für Bearbeiter. Diese sind entsprechend verlinkt.
| Werte für Projektbearbeiter | Bedeutung |
|---|---|
getStdHours |
Sollzeit in Minuten |
getWorkingHours |
Arbeitszeit in Minuten |
getOvertimeCarryover |
Überzeitsaldo in Minuten per Datum bis gestern(-1), ausser auf Enddatum ist ein Vortrag erfasst, dann wird dieser Vortrag ausgegeben. |
getOvertimeCarryoverDate |
Datum des letzten Überzeitvortrags vor Enddatum |
getOvertimeBalance |
Überzeitsaldo in Minuten per Enddatum |
getVacationCredit |
Ferienguthaben in Minuten per Zeitangabe (von, bis) |
getVacationTaken |
Ferienbezug in Minuten per Zeitangabe (von, bis) |
getVacationCarryover |
Feriensaldo in Minuten per Datum bis gestern(-1), ausser auf Enddatum ist ein Vortrag erfasst, dann wird dieser Vortrag ausgegeben. |
getVacationCarryoverDate |
Letzter Ferienvortrag in Minuten vor Enddatum. |
getVacationStart |
Startdatum der Ferienperiode |
getVacationEnd |
Enddatum der Ferienperiode |
getVacationBalance |
Feriensaldo in Minuten per Enddatum |
getVacationBalanceAccrued |
Aufgelaufener Feriensaldo unter Berücksichtigung des Ferienguthabens in Minuten |
getSalary |
Lohn per Zeitangabe (von, bis) |
getOverheads |
Lohnkosten per Zeitangabe (von, bis) |
getAssignedStdHours |
Sollzeit in Minuten per Zeitangabe (von, bis) nur aufgrund der Vorgaben |
getAssignedStdHoursGroup |
Sollzeit in Minuten per Zeitangabe (von, bis) nur aufgrund der Benutzergruppen-Vorgaben |
getStdHoursOnlyGroupAbs |
Sollzeit in Minuten per Zeitangabe (von, bis) der Benutzergruppe einschliesslich Abwesenheiten |
getEmploymentLevel |
Beschäftigungsgrad des Bearbeiters per Enddatum |
getAbsenceTimeOff |
Abwesenheit mit Typangabe (Code) per Zeitangabe (von, bis) |
getStdHoursGroup |
Sollzeit in Minuten per Zeitangabe (von, bis) der Benutzergruppe in Minuten einschliesslich Gruppen-Abwesenheiten |
isBlockedDate |
Gibt True/False zurück, abhängig davon, ob Enddatum bei Leistung- und Spesenerfassung gesperrt ist. |
enteringprojects |
Liste der Projekte, für die der Benutzer Leistungen und Spesen erfassen darf |
currentAbsences |
Liste der Abwesenheiten per Enddatum |
getTrackingUsers |
Liste der Benutzer, die Leistungen, Spesen und Ausgaben erfassen dürfen. |
| Werte für Projekte | Bedeutung |
|---|---|
enteringphases |
Liste der Projektphasen, auf die der Benutzer Leistungen und Spesen erfassen darf. |
| Werte für Phasen | Bedeutung |
|---|---|
enteringservicetypes |
Liste der Tätigkeitstypen auf Leistungen für Phasen, die der Benutzer für Leistungserfassung verwenden darf. |
enteringexpensetypes |
Liste der Spesentypen für Phasen, die der Benutzer für Spesenerfassung verwenden darf. |
Die API kann direkt BI-Kennzahlen für ein Objekt liefern.
Die Parameter sind
bi_measures=MinutesExt,MinutesInt,... (interne BI-Namen) bi_date_from=2026-02-01bi_date_till=2026-02-28bi_currency=CHF (Währungscode)projection_dimension=Project (z.B. eine zweite Dimension wie Kunde & Phase)Mit einem PUT-Aufruf wird ein bestehendes Vertec Objekt angepasst. Die zu ändernden Felder werden im JSON-Body übergeben. Die Objekt-ID kommt aus der URL und der Body enthält die neuen Werte für die gewünschten Members.
/objects/Administrator/UserAdmin oder /objects/1665 {
"abbreviation": "AD",
"level": 500,
}
Für jedes Feld prüft die API, ob es ein gültiges, persistentes Feld der Klasse ist.
Datentypen werden validiert und konvertiert (z.B. Datum im ISO-Format, Booleans, Ganzzahlen, Währungen).
Bei Associations:
Im Erfolgsfall wird wie bei einer GET-Abfrage ein Resultat zurückgegeben, das das aktualisierte Objekt enthält.
Mit einem POST-Aufruf wird ein neues Vertec Objekt angelegt. Die Klasse des Objekts wird über die URL festgelegt und die Werte der Felder werden im JSON-Body übergeben. Im Unterschied zu PUT geht es hier nicht um das Aktualisieren eines bestehenden, sondern um das Erzeugen eines neuen Objektes.
/objects/Project erzeugt ein neues ProjektDer JSON Body sieht aus wie bei PUT und schreibt die entsprechenden Members auf dem neu erstellten Objekt. Tritt dabei ein Fehler auf (z.B. ungültiger Wert oder fehlendes Recht), wird das neu erzeugte Objekt wieder gelöscht und eine Fehlermeldung zurückgegeben.
Im Erfolgsfall entspricht die Antwort der Ausgabe eines GET-Aufrufs für das neu angelegte Objekt.
Über einen DELETE-Aufruf wird ein bestehendes Vertec Objekt endgültig gelöscht. Die zu löschende Instanz wird dabei über die objid oder die entryID in der URL identifiziert.
/objects/1665 oder /objects/Administrator/UserAdminEs wird das angegebene Objekt gesucht und anschließend gelöscht.
Bei fehlenden Rechten wird HTTP-Status 403 Forbidden zurückgegeben und bei anderen Fehlern der HTTP-Status 400 Bad Request.
Im Erfolgsfall wird kein Objekt als JSON-Antwort zurückgeliefert, sondern nur ein entsprechender HTTP-Status zurückgegeben.
Über die API können zu folgenden Vertec Objekten auch Dateien (z.B. PDFs oder Bilder) gespeichert werden. Die Binärdaten der Datei werden dabei Base64-kodiert im JSON-Body eines PUT- oder POST-Aufrufs übertragen.
- Aktivitäten
- Spesen
- Kreditoren
Im JSON-Body eines PUT- oder POST-Aufrufs wird das entsprechende Dokumentfeld mit einem Base64-kodierten String gefüllt. Die API dekodiert diesen Base64-String und speichert die Datei intern in einem eigenen Dokumentobjekt.
Spezialfall bei Aktivität: Bei Aktivitäten ist zusätzlich das Feld documentfullname erforderlich. Dieses Feld enthält den Dateinamen inklusive Dateiendung, damit Vertec den Namen des abgelegten Dokuments kennt.
Beispiel: Dokument an Aktivitätanhängen
/objects/Activity/12345 {
"document": BASE64DATEN
"documentfullname": "Besuchsbericht.pdf"
}
In diesem Beispiel wird bei der Aktivität mit der objid 12345 ein Dokument mit dem Dateinamen Besuchsbericht.pdf gespeichert. Die API ruft dazu intern die passende Dokument-Funktion der Klasse Aktivität auf und legt ein DocumentData-Objekt mit den übergebenen Binärdaten an.
Beispiel: Dokument an eine Rechnung anhängen
/objects/Expenses/9876 {
"document": BASE64DATEN
}
Hier wird für die Rechnung mit der internen ID 9876 ein Dokument gespeichert, indem das Feld document mit dem Base64-kodierten Inhalt gefüllt wird.
Die Webserviceklasse VertecREST verfügt über eine Methode onrequest(self), die bei jedem WebRequest aufgerufen wird. In der Basisimplementierung hat diese Methode keine Funktion. Sie können diese Methode in einer abgeleiteten Klasse überschreiben, um für jeden Request eine definierte Funktion, beispielweise Logging, auszuführen. Tauschen Sie dann die Klassenreferenz im Webservice (vtcrest.VertecREST) gegen Ihre neue Klassenreferenz aus. Nachfolgend ein Beispiel für onrequest(self) Implementierung:
Der Scripteintrag:
from vtcrest import VertecREST
class REST(VertecREST):
def onrequest(self):
method = self.http_method
path = "/".join(self.path_parameters)
query = self.querystring
self.log("Received request: {} {}?{}".format(method, path, query))
Der REST Webservice-Eintrag:

Die API antwortet üblicherweise mit den folgenden Fehlercodes:
400 Bad Request
Dieser Statuscode wird für alle fachlichen und technischen Fehler verwendet, die durch falsche Eingaben oder ungültige Anfragen entstehen. Typische Ursachen sind:
403 Forbidden
Dieser Statuscode signalisiert fehlende Berechtigungen für die angeforderte Operation. Häufige Ursachen sind:
Die Fehlermeldungen enthalten meist:
Bei korrekten Anfragen wird immer HTTP 200 OK zurückgegeben (auch bei DELETE).
Die für die Nutzung des REST APIs notwendigen Definitionen sind im Vertec Python Modul "vtcrest" implementiert.