WorkTimeEntry
Alle WorkTimeEntry abrufen
GET/api/time/workentries
Query-Parameter
searchStringstring | Text, nach dem in der Liste gesucht wird |
orderFieldNamestring | Name des Bestellfelds |
orderFieldSortstring | SortiermodusErlaubt: DESCASC |
pageinteger | Seite der Liste |
pageSizeinteger | Anzahl der Einträge je Seite |
withMaxPageNumberstring | gibt die Anzahl verfügbarer Seiten als Header zurück, wenn dies gesetzt ist |
Antworten
200Alle WorkTimeEntry abrufenarray<WorkTimeEntry>
Felder anzeigen (27)
idintegerPrimärschlüssel des Arbeitszeiteintrags. Interne ID.
userUser14Benutzer, der gearbeitet hat.
Felder anzeigen (10)
idintegerPrimärschlüssel des Benutzers. Interne ID des Anmeldebenutzers.
namestringAnzeigename des Benutzers. Wird in der Oberfläche und in Protokolleinträgen angezeigt.
usernamestringAnmeldename des Benutzers. Muss über alle Benutzer hinweg eindeutig sein.
emailstringE-Mail-Adresse des Benutzers. Wird für Anmeldebenachrichtigungen, Passwort-Zurücksetzen und als Anmeldealias verwendet.
positioningeneralstringFreitext zur Position oder Rolle des Benutzers.
crm_personCRMPerson10CRM-Person, die mit diesem Anmeldebenutzer verknüpft ist. Verbindet das Anmeldekonto mit dem Personendatensatz.
profile_picture_urlstringURL des Profilbilds des Benutzers.
archivedbooleanMarkiert den Benutzer als archiviert. Archivierte Benutzer bleiben zur Historie erhalten und sind nicht aktiv.
require2fabooleanFür diesen Benutzer ist die Zwei-Faktor-Authentifizierung Pflicht.
search_stringstringText, unter dem die Entität gesucht werden kann.
descriptionstringBeschreibung der Arbeit.
startstring (date-time)Beginn der Arbeitszeit.
start_datestringStartdatum der Arbeitszeit als Text.
start_monthintegerMonat des Beginns.
start_yearintegerJahr des Beginns.
endstring (date-time)Ende der Arbeitszeit.
break_startstring (date-time)Beginn der Pause.
break_endstring (date-time)Ende der Pause.
break_durationintegerPausendauer in Sekunden
manual_break_durationintegerZ17.2: Pausendauer in Sekunden ohne Lage, z. B. aus einer genehmigten Korrektur, die nur die Dauer der Pause ändert. Zählt wie eine erfasste Pause, solange keine Pause mit Beginn und Ende erfasst ist; null = keine.
auto_breakbooleanEine Pause wurde automatisch hinzugefügt.
force_no_breakbooleanFür diesen Eintrag wird keine Pause hinzugefügt.
durationintegerDauer in Sekunden
auto_closedbooleanDer Eintrag wurde automatisch abgeschlossen.
has_warningbooleanDer Eintrag hat eine Warnung, zum Beispiel ein fehlendes Ende.
has_scanner_startbooleanDer Beginn wurde mit dem Scanner erfasst.
has_scanner_endbooleanDas Ende wurde mit dem Scanner erfasst.
closed_editingbooleanDie Bearbeitung des Eintrags ist gesperrt.
closed_editing_hrbooleanDie Bearbeitung des Eintrags ist für HR gesperrt.
confirmedbooleanDer Eintrag ist bestätigt.
shift_plan_entryShiftPlanEntry3L38: die Schicht, für die dieser Eintrag eingestempelt wurde. Der Eintrag behält die realen Uhrzeiten; die Verknüpfung gibt nur an, zu welcher geplanten Schicht sie gehören.
Felder anzeigen (29)
opened_absence_typestringDie Abwesenheitsart als einfache Bezeichnung, damit die Planung „Krank“ anzeigen kann, ohne die ganze Anfrage in jede Schicht zu übernehmen.
idintegerPrimärschlüssel des Schichtplan-Eintrags. Interne ID.
userUser14Der Schicht zugewiesener Benutzer.
personCRMPerson10Person, die der Schicht zugewiesen ist.
contractEmploymentContract5Vertrag, auf dem die Schicht geplant ist.
employment_contract_groupEmploymentContractGroupPlanungscontainer - Pflichtangabe, auch wenn eine Person einer anderen Gruppe aushilft.
shift_typeShiftType5Ursprungstyp - Zeiten wurden kopiert, der Verweis dient nur der Information.
startstring (date-time)Beginn des Dienstes.
endstring (date-time)Ende der Schicht.
start_datestringStartdatum des Dienstes als Text.
start_monthintegerMonat der Schicht.
start_yearintegerJahr der Schicht.
break_duration_secondsintegerPausendauer der Schicht in Sekunden.
durationintegerZielsekunden: (Ende - Start) - Pause, wird von recalculate() gepflegt.
required_qualificationEmploymentQualification5Für die Schicht erforderliche Qualifikation.
qualification_match_modestringL18: EXACT verlangt die geforderte Qualifikation selbst; EQUIVALENT (Standard, bisheriges Verhalten) akzeptiert auch verknüpfte oder gleichgruppierte Qualifikationen mit ausreichendem Rang.
statusstringStatus des Dienstes, zum Beispiel geplant oder veröffentlicht.
published_atstring (date-time)Zeitpunkt, zu dem die Schicht veröffentlicht wurde.
descriptionstringBeschreibung der Schicht.
has_warningbooleanGespeichertes Konfliktkennzeichen für Listen-Badges - die konkreten Warnungen werden bei Bedarf berechnet (ShiftPlanHelper) und nur vorübergehend zurückgegeben.
availability_bookingBaseBooking13L35: die Verfügbarkeit, für die die veröffentlichte Schicht im Buchungsbereich steht (wird vom ShiftBookingSyncHelper synchron gehalten, solange die Synchronisation für den Vertrag aktiviert ist).
bookingBaseBooking13L35: der aus dieser Schicht erstellte Termin, falls vorhanden.
opened_reasonstringGrund, warum die Schicht für andere Mitarbeitende freigegeben wurde.
opened_atstring (date-time)Zeitpunkt, zu dem die Schicht geöffnet wurde.
opened_from_personCRMPerson10Wer die Schicht vor der Freigabe bearbeitet hat – die Zuweisung selbst ist entfallen, und die Planung muss wissen, wen sie fragen kann.
opened_absence_requestNonWorkTimeRequest5Die Abwesenheit, die ihn freigegeben hat, für OPENED_REASON_ABSENCE. Enthält Art und Tage, sodass die Planung „krank“ statt nur „jemand ist abwesend“ anzeigen kann.
lock_versionintegerOptimistische Sperre. Zwei Planer, die dieselbe Schicht bearbeiten, oder eine Wochenveröffentlichung, während jemand eine Schicht darin verschiebt, würden sonst stillschweigend einander überschreiben - der Unterlegene erhält jetzt einen 409. Nur lesend: Doctrine verwaltet den Wert, der Client sendet den zuletzt gesehenen Wert als Query-Parameter lock_version zurück.
createdstring (date-time)Zeitpunkt, zu dem der Datensatz angelegt wurde.
updatedstring (date-time)Zeitpunkt, zu dem der Datensatz zuletzt aktualisiert wurde.
shift_start_deviation_minutesintegerL38: Minuten, um die der reale Beginn vor (negativ) oder nach (positiv) dem geplanten Schichtbeginn liegt; null ohne Schicht.
shift_end_deviation_minutesintegerL38: Minuten, um die das reale Ende vor (negativ) oder nach (positiv) dem geplanten Schichtende liegt.
content_typestringArt der Tätigkeit, zum Beispiel Arbeit oder Training.
search_stringstringText, unter dem die Entität gesucht werden kann.
curl --request GET \
--url https://eure-instanz.iw-erp.de/api/time/workentries \
--header 'x-iw-jwt-token: <TOKEN>'const options = {method: 'GET', headers: {'x-iw-jwt-token': '<TOKEN>'}};
fetch('https://eure-instanz.iw-erp.de/api/time/workentries', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://eure-instanz.iw-erp.de/api/time/workentries"
headers = {"x-iw-jwt-token": "<TOKEN>"}
response = requests.get(url, headers=headers)
print(response.text)<?php
require_once('vendor/autoload.php');
$client = new \GuzzleHttp\Client();
$response = $client->request('GET', 'https://eure-instanz.iw-erp.de/api/time/workentries', [
'headers' => [
'x-iw-jwt-token' => '<TOKEN>',
],
]);
echo $response->getBody();using System.Net.Http.Headers;
var client = new HttpClient();
var request = new HttpRequestMessage
{
Method = HttpMethod.Get,
RequestUri = new Uri("https://eure-instanz.iw-erp.de/api/time/workentries"),
Headers =
{
{ "x-iw-jwt-token", "<TOKEN>" },
},
};
using (var response = await client.SendAsync(request))
{
response.EnsureSuccessStatusCode();
var body = await response.Content.ReadAsStringAsync();
Console.WriteLine(body);
}OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("https://eure-instanz.iw-erp.de/api/time/workentries")
.get()
.addHeader("x-iw-jwt-token", "<TOKEN>")
.build();
Response response = client.newCall(request).execute();package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://eure-instanz.iw-erp.de/api/time/workentries"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-iw-jwt-token", "<TOKEN>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}Dart mit dem Package iw_erp_api
import 'package:iw_erp_api/clients/time_tracking_work_time_entry_controller.dart';
import 'package:iw_erp_api/logic/iw_api_state.dart';
IwApiState().host = 'eure-instanz.iw-erp.de';
IwApiState().currentJwtApiToken = '<TOKEN>';
final result = await TimeTrackingWorkTimeEntryController.getAll();
if (result.success) {
print(result.data);
}[
{
"id": 42,
"description": "Text",
"user": {
"id": 42,
"name": "Beispiel",
"username": "lena.hartmann@example.org",
"email": "lena.hartmann@example.org",
"profile_picture_url": "https://vynst.de",
"positioningeneral": "string",
"archived": true,
"require2fa": true,
"search_string": "string"
},
"start": "2026-10-15T09:30:00+02:00",
"start_date": "2026-10-15T09:30:00+02:00",
"start_month": 1,
"start_year": 1,
"end": "2026-10-15T09:30:00+02:00",
"break_start": "2026-10-15T09:30:00+02:00",
"break_end": "2026-10-15T09:30:00+02:00"
}
]Einzelnen WorkTimeEntry anlegen
POST/api/time/workentries
Request-Body application/json
work_time_entryWorkTimeEntry2Felder anzeigen (9)
personCRMPerson36Person, die gearbeitet hat.
contractEmploymentContract7Vertrag, auf dem die Arbeitszeit gebucht wird.
descriptionstringBeschreibung der Arbeit.
startstring (date-time)Beginn der Arbeitszeit.
endstring (date-time)Ende der Arbeitszeit.
break_startstring (date-time)Beginn der Pause.
break_endstring (date-time)Ende der Pause.
force_no_breakbooleanFür diesen Eintrag wird keine Pause hinzugefügt.
content_typestringArt der Tätigkeit, zum Beispiel Arbeit oder Training.
Antworten
200Einzelnen WorkTimeEntry anlegenWorkTimeEntry
Felder anzeigen (27)
idintegerPrimärschlüssel des Arbeitszeiteintrags. Interne ID.
userUser14Benutzer, der gearbeitet hat.
Felder anzeigen (10)
idintegerPrimärschlüssel des Benutzers. Interne ID des Anmeldebenutzers.
namestringAnzeigename des Benutzers. Wird in der Oberfläche und in Protokolleinträgen angezeigt.
usernamestringAnmeldename des Benutzers. Muss über alle Benutzer hinweg eindeutig sein.
emailstringE-Mail-Adresse des Benutzers. Wird für Anmeldebenachrichtigungen, Passwort-Zurücksetzen und als Anmeldealias verwendet.
positioningeneralstringFreitext zur Position oder Rolle des Benutzers.
crm_personCRMPerson10CRM-Person, die mit diesem Anmeldebenutzer verknüpft ist. Verbindet das Anmeldekonto mit dem Personendatensatz.
profile_picture_urlstringURL des Profilbilds des Benutzers.
archivedbooleanMarkiert den Benutzer als archiviert. Archivierte Benutzer bleiben zur Historie erhalten und sind nicht aktiv.
require2fabooleanFür diesen Benutzer ist die Zwei-Faktor-Authentifizierung Pflicht.
search_stringstringText, unter dem die Entität gesucht werden kann.
descriptionstringBeschreibung der Arbeit.
startstring (date-time)Beginn der Arbeitszeit.
start_datestringStartdatum der Arbeitszeit als Text.
start_monthintegerMonat des Beginns.
start_yearintegerJahr des Beginns.
endstring (date-time)Ende der Arbeitszeit.
break_startstring (date-time)Beginn der Pause.
break_endstring (date-time)Ende der Pause.
break_durationintegerPausendauer in Sekunden
manual_break_durationintegerZ17.2: Pausendauer in Sekunden ohne Lage, z. B. aus einer genehmigten Korrektur, die nur die Dauer der Pause ändert. Zählt wie eine erfasste Pause, solange keine Pause mit Beginn und Ende erfasst ist; null = keine.
auto_breakbooleanEine Pause wurde automatisch hinzugefügt.
force_no_breakbooleanFür diesen Eintrag wird keine Pause hinzugefügt.
durationintegerDauer in Sekunden
auto_closedbooleanDer Eintrag wurde automatisch abgeschlossen.
has_warningbooleanDer Eintrag hat eine Warnung, zum Beispiel ein fehlendes Ende.
has_scanner_startbooleanDer Beginn wurde mit dem Scanner erfasst.
has_scanner_endbooleanDas Ende wurde mit dem Scanner erfasst.
closed_editingbooleanDie Bearbeitung des Eintrags ist gesperrt.
closed_editing_hrbooleanDie Bearbeitung des Eintrags ist für HR gesperrt.
confirmedbooleanDer Eintrag ist bestätigt.
shift_plan_entryShiftPlanEntry3L38: die Schicht, für die dieser Eintrag eingestempelt wurde. Der Eintrag behält die realen Uhrzeiten; die Verknüpfung gibt nur an, zu welcher geplanten Schicht sie gehören.
Felder anzeigen (29)
opened_absence_typestringDie Abwesenheitsart als einfache Bezeichnung, damit die Planung „Krank“ anzeigen kann, ohne die ganze Anfrage in jede Schicht zu übernehmen.
idintegerPrimärschlüssel des Schichtplan-Eintrags. Interne ID.
userUser14Der Schicht zugewiesener Benutzer.
personCRMPerson10Person, die der Schicht zugewiesen ist.
contractEmploymentContract5Vertrag, auf dem die Schicht geplant ist.
employment_contract_groupEmploymentContractGroupPlanungscontainer - Pflichtangabe, auch wenn eine Person einer anderen Gruppe aushilft.
shift_typeShiftType5Ursprungstyp - Zeiten wurden kopiert, der Verweis dient nur der Information.
startstring (date-time)Beginn des Dienstes.
endstring (date-time)Ende der Schicht.
start_datestringStartdatum des Dienstes als Text.
start_monthintegerMonat der Schicht.
start_yearintegerJahr der Schicht.
break_duration_secondsintegerPausendauer der Schicht in Sekunden.
durationintegerZielsekunden: (Ende - Start) - Pause, wird von recalculate() gepflegt.
required_qualificationEmploymentQualification5Für die Schicht erforderliche Qualifikation.
qualification_match_modestringL18: EXACT verlangt die geforderte Qualifikation selbst; EQUIVALENT (Standard, bisheriges Verhalten) akzeptiert auch verknüpfte oder gleichgruppierte Qualifikationen mit ausreichendem Rang.
statusstringStatus des Dienstes, zum Beispiel geplant oder veröffentlicht.
published_atstring (date-time)Zeitpunkt, zu dem die Schicht veröffentlicht wurde.
descriptionstringBeschreibung der Schicht.
has_warningbooleanGespeichertes Konfliktkennzeichen für Listen-Badges - die konkreten Warnungen werden bei Bedarf berechnet (ShiftPlanHelper) und nur vorübergehend zurückgegeben.
availability_bookingBaseBooking13L35: die Verfügbarkeit, für die die veröffentlichte Schicht im Buchungsbereich steht (wird vom ShiftBookingSyncHelper synchron gehalten, solange die Synchronisation für den Vertrag aktiviert ist).
bookingBaseBooking13L35: der aus dieser Schicht erstellte Termin, falls vorhanden.
opened_reasonstringGrund, warum die Schicht für andere Mitarbeitende freigegeben wurde.
opened_atstring (date-time)Zeitpunkt, zu dem die Schicht geöffnet wurde.
opened_from_personCRMPerson10Wer die Schicht vor der Freigabe bearbeitet hat – die Zuweisung selbst ist entfallen, und die Planung muss wissen, wen sie fragen kann.
opened_absence_requestNonWorkTimeRequest5Die Abwesenheit, die ihn freigegeben hat, für OPENED_REASON_ABSENCE. Enthält Art und Tage, sodass die Planung „krank“ statt nur „jemand ist abwesend“ anzeigen kann.
lock_versionintegerOptimistische Sperre. Zwei Planer, die dieselbe Schicht bearbeiten, oder eine Wochenveröffentlichung, während jemand eine Schicht darin verschiebt, würden sonst stillschweigend einander überschreiben - der Unterlegene erhält jetzt einen 409. Nur lesend: Doctrine verwaltet den Wert, der Client sendet den zuletzt gesehenen Wert als Query-Parameter lock_version zurück.
createdstring (date-time)Zeitpunkt, zu dem der Datensatz angelegt wurde.
updatedstring (date-time)Zeitpunkt, zu dem der Datensatz zuletzt aktualisiert wurde.
shift_start_deviation_minutesintegerL38: Minuten, um die der reale Beginn vor (negativ) oder nach (positiv) dem geplanten Schichtbeginn liegt; null ohne Schicht.
shift_end_deviation_minutesintegerL38: Minuten, um die das reale Ende vor (negativ) oder nach (positiv) dem geplanten Schichtende liegt.
content_typestringArt der Tätigkeit, zum Beispiel Arbeit oder Training.
search_stringstringText, unter dem die Entität gesucht werden kann.
curl --request POST \
--url https://eure-instanz.iw-erp.de/api/time/workentries \
--header 'content-type: application/json' \
--header 'x-iw-jwt-token: <TOKEN>' \
--data '
{
"work_time_entry": {
"description": "Text",
"start": "2026-10-15T09:30:00+02:00",
"end": "2026-10-15T09:30:00+02:00",
"break_start": "2026-10-15T09:30:00+02:00",
"break_end": "2026-10-15T09:30:00+02:00",
"force_no_break": true
}
}
'const options = {
method: 'POST',
headers: {'x-iw-jwt-token': '<TOKEN>', 'content-type': 'application/json'},
body: JSON.stringify({
work_time_entry: {
description: 'Text',
start: '2026-10-15T09:30:00+02:00',
end: '2026-10-15T09:30:00+02:00',
break_start: '2026-10-15T09:30:00+02:00',
break_end: '2026-10-15T09:30:00+02:00',
force_no_break: true
}
})
};
fetch('https://eure-instanz.iw-erp.de/api/time/workentries', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://eure-instanz.iw-erp.de/api/time/workentries"
payload = { "work_time_entry": {
"description": "Text",
"start": "2026-10-15T09:30:00+02:00",
"end": "2026-10-15T09:30:00+02:00",
"break_start": "2026-10-15T09:30:00+02:00",
"break_end": "2026-10-15T09:30:00+02:00",
"force_no_break": True
} }
headers = {
"x-iw-jwt-token": "<TOKEN>",
"content-type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)<?php
require_once('vendor/autoload.php');
$client = new \GuzzleHttp\Client();
$response = $client->request('POST', 'https://eure-instanz.iw-erp.de/api/time/workentries', [
'body' => '{"work_time_entry":{"description":"Text","start":"2026-10-15T09:30:00+02:00","end":"2026-10-15T09:30:00+02:00","break_start":"2026-10-15T09:30:00+02:00","break_end":"2026-10-15T09:30:00+02:00","force_no_break":true}}',
'headers' => [
'content-type' => 'application/json',
'x-iw-jwt-token' => '<TOKEN>',
],
]);
echo $response->getBody();using System.Net.Http.Headers;
var client = new HttpClient();
var request = new HttpRequestMessage
{
Method = HttpMethod.Post,
RequestUri = new Uri("https://eure-instanz.iw-erp.de/api/time/workentries"),
Headers =
{
{ "x-iw-jwt-token", "<TOKEN>" },
},
Content = new StringContent("{\"work_time_entry\":{\"description\":\"Text\",\"start\":\"2026-10-15T09:30:00+02:00\",\"end\":\"2026-10-15T09:30:00+02:00\",\"break_start\":\"2026-10-15T09:30:00+02:00\",\"break_end\":\"2026-10-15T09:30:00+02:00\",\"force_no_break\":true}}")
{
Headers =
{
ContentType = new MediaTypeHeaderValue("application/json")
}
}
};
using (var response = await client.SendAsync(request))
{
response.EnsureSuccessStatusCode();
var body = await response.Content.ReadAsStringAsync();
Console.WriteLine(body);
}OkHttpClient client = new OkHttpClient();
MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{\"work_time_entry\":{\"description\":\"Text\",\"start\":\"2026-10-15T09:30:00+02:00\",\"end\":\"2026-10-15T09:30:00+02:00\",\"break_start\":\"2026-10-15T09:30:00+02:00\",\"break_end\":\"2026-10-15T09:30:00+02:00\",\"force_no_break\":true}}");
Request request = new Request.Builder()
.url("https://eure-instanz.iw-erp.de/api/time/workentries")
.post(body)
.addHeader("x-iw-jwt-token", "<TOKEN>")
.addHeader("content-type", "application/json")
.build();
Response response = client.newCall(request).execute();package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://eure-instanz.iw-erp.de/api/time/workentries"
payload := strings.NewReader("{\"work_time_entry\":{\"description\":\"Text\",\"start\":\"2026-10-15T09:30:00+02:00\",\"end\":\"2026-10-15T09:30:00+02:00\",\"break_start\":\"2026-10-15T09:30:00+02:00\",\"break_end\":\"2026-10-15T09:30:00+02:00\",\"force_no_break\":true}}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-iw-jwt-token", "<TOKEN>")
req.Header.Add("content-type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}Dart mit dem Package iw_erp_api
import 'package:iw_erp_api/clients/time_tracking_work_time_entry_controller.dart';
import 'package:iw_erp_api/logic/iw_api_state.dart';
import 'package:iw_erp_api/model/time_tracking_work_time_entry.dart';
IwApiState().host = 'eure-instanz.iw-erp.de';
IwApiState().currentJwtApiToken = '<TOKEN>';
final result = await TimeTrackingWorkTimeEntryController.post(TimeTrackingWorkTimeEntry.fromJson({
"description": "Text",
"start": "2026-10-15T09:30:00+02:00",
"end": "2026-10-15T09:30:00+02:00",
"break_start": "2026-10-15T09:30:00+02:00",
"break_end": "2026-10-15T09:30:00+02:00",
"force_no_break": true
}));
if (result.success) {
print(result.data);
}{
"id": 42,
"description": "Text",
"user": {
"id": 42,
"name": "Beispiel",
"username": "lena.hartmann@example.org",
"email": "lena.hartmann@example.org",
"profile_picture_url": "https://vynst.de",
"positioningeneral": "string",
"crm_person": {
"id": 42,
"first_name": "Lena",
"last_name": "Hartmann",
"title": "Beispiel",
"language": "de",
"support_description": "Text",
"profile_picture_url": "https://vynst.de",
"address_street": "Jakobistr. 39",
"address_city": "Hannover",
"address_zip": "30163"
},
"archived": true,
"require2fa": true,
"search_string": "string"
},
"start": "2026-10-15T09:30:00+02:00",
"start_date": "2026-10-15T09:30:00+02:00",
"start_month": 1,
"start_year": 1,
"end": "2026-10-15T09:30:00+02:00",
"break_start": "2026-10-15T09:30:00+02:00",
"break_end": "2026-10-15T09:30:00+02:00"
}Einzelnen WorkTimeEntry abrufen
GET/api/time/workentries/{id}
Pfad-Parameter
idPflichtstring |
Antworten
200Einzelnen WorkTimeEntry abrufenWorkTimeEntry
Felder anzeigen (27)
idintegerPrimärschlüssel des Arbeitszeiteintrags. Interne ID.
userUser14Benutzer, der gearbeitet hat.
Felder anzeigen (10)
idintegerPrimärschlüssel des Benutzers. Interne ID des Anmeldebenutzers.
namestringAnzeigename des Benutzers. Wird in der Oberfläche und in Protokolleinträgen angezeigt.
usernamestringAnmeldename des Benutzers. Muss über alle Benutzer hinweg eindeutig sein.
emailstringE-Mail-Adresse des Benutzers. Wird für Anmeldebenachrichtigungen, Passwort-Zurücksetzen und als Anmeldealias verwendet.
positioningeneralstringFreitext zur Position oder Rolle des Benutzers.
crm_personCRMPerson10CRM-Person, die mit diesem Anmeldebenutzer verknüpft ist. Verbindet das Anmeldekonto mit dem Personendatensatz.
profile_picture_urlstringURL des Profilbilds des Benutzers.
archivedbooleanMarkiert den Benutzer als archiviert. Archivierte Benutzer bleiben zur Historie erhalten und sind nicht aktiv.
require2fabooleanFür diesen Benutzer ist die Zwei-Faktor-Authentifizierung Pflicht.
search_stringstringText, unter dem die Entität gesucht werden kann.
descriptionstringBeschreibung der Arbeit.
startstring (date-time)Beginn der Arbeitszeit.
start_datestringStartdatum der Arbeitszeit als Text.
start_monthintegerMonat des Beginns.
start_yearintegerJahr des Beginns.
endstring (date-time)Ende der Arbeitszeit.
break_startstring (date-time)Beginn der Pause.
break_endstring (date-time)Ende der Pause.
break_durationintegerPausendauer in Sekunden
manual_break_durationintegerZ17.2: Pausendauer in Sekunden ohne Lage, z. B. aus einer genehmigten Korrektur, die nur die Dauer der Pause ändert. Zählt wie eine erfasste Pause, solange keine Pause mit Beginn und Ende erfasst ist; null = keine.
auto_breakbooleanEine Pause wurde automatisch hinzugefügt.
force_no_breakbooleanFür diesen Eintrag wird keine Pause hinzugefügt.
durationintegerDauer in Sekunden
auto_closedbooleanDer Eintrag wurde automatisch abgeschlossen.
has_warningbooleanDer Eintrag hat eine Warnung, zum Beispiel ein fehlendes Ende.
has_scanner_startbooleanDer Beginn wurde mit dem Scanner erfasst.
has_scanner_endbooleanDas Ende wurde mit dem Scanner erfasst.
closed_editingbooleanDie Bearbeitung des Eintrags ist gesperrt.
closed_editing_hrbooleanDie Bearbeitung des Eintrags ist für HR gesperrt.
confirmedbooleanDer Eintrag ist bestätigt.
shift_plan_entryShiftPlanEntry3L38: die Schicht, für die dieser Eintrag eingestempelt wurde. Der Eintrag behält die realen Uhrzeiten; die Verknüpfung gibt nur an, zu welcher geplanten Schicht sie gehören.
Felder anzeigen (29)
opened_absence_typestringDie Abwesenheitsart als einfache Bezeichnung, damit die Planung „Krank“ anzeigen kann, ohne die ganze Anfrage in jede Schicht zu übernehmen.
idintegerPrimärschlüssel des Schichtplan-Eintrags. Interne ID.
userUser14Der Schicht zugewiesener Benutzer.
personCRMPerson10Person, die der Schicht zugewiesen ist.
contractEmploymentContract5Vertrag, auf dem die Schicht geplant ist.
employment_contract_groupEmploymentContractGroupPlanungscontainer - Pflichtangabe, auch wenn eine Person einer anderen Gruppe aushilft.
shift_typeShiftType5Ursprungstyp - Zeiten wurden kopiert, der Verweis dient nur der Information.
startstring (date-time)Beginn des Dienstes.
endstring (date-time)Ende der Schicht.
start_datestringStartdatum des Dienstes als Text.
start_monthintegerMonat der Schicht.
start_yearintegerJahr der Schicht.
break_duration_secondsintegerPausendauer der Schicht in Sekunden.
durationintegerZielsekunden: (Ende - Start) - Pause, wird von recalculate() gepflegt.
required_qualificationEmploymentQualification5Für die Schicht erforderliche Qualifikation.
qualification_match_modestringL18: EXACT verlangt die geforderte Qualifikation selbst; EQUIVALENT (Standard, bisheriges Verhalten) akzeptiert auch verknüpfte oder gleichgruppierte Qualifikationen mit ausreichendem Rang.
statusstringStatus des Dienstes, zum Beispiel geplant oder veröffentlicht.
published_atstring (date-time)Zeitpunkt, zu dem die Schicht veröffentlicht wurde.
descriptionstringBeschreibung der Schicht.
has_warningbooleanGespeichertes Konfliktkennzeichen für Listen-Badges - die konkreten Warnungen werden bei Bedarf berechnet (ShiftPlanHelper) und nur vorübergehend zurückgegeben.
availability_bookingBaseBooking13L35: die Verfügbarkeit, für die die veröffentlichte Schicht im Buchungsbereich steht (wird vom ShiftBookingSyncHelper synchron gehalten, solange die Synchronisation für den Vertrag aktiviert ist).
bookingBaseBooking13L35: der aus dieser Schicht erstellte Termin, falls vorhanden.
opened_reasonstringGrund, warum die Schicht für andere Mitarbeitende freigegeben wurde.
opened_atstring (date-time)Zeitpunkt, zu dem die Schicht geöffnet wurde.
opened_from_personCRMPerson10Wer die Schicht vor der Freigabe bearbeitet hat – die Zuweisung selbst ist entfallen, und die Planung muss wissen, wen sie fragen kann.
opened_absence_requestNonWorkTimeRequest5Die Abwesenheit, die ihn freigegeben hat, für OPENED_REASON_ABSENCE. Enthält Art und Tage, sodass die Planung „krank“ statt nur „jemand ist abwesend“ anzeigen kann.
lock_versionintegerOptimistische Sperre. Zwei Planer, die dieselbe Schicht bearbeiten, oder eine Wochenveröffentlichung, während jemand eine Schicht darin verschiebt, würden sonst stillschweigend einander überschreiben - der Unterlegene erhält jetzt einen 409. Nur lesend: Doctrine verwaltet den Wert, der Client sendet den zuletzt gesehenen Wert als Query-Parameter lock_version zurück.
createdstring (date-time)Zeitpunkt, zu dem der Datensatz angelegt wurde.
updatedstring (date-time)Zeitpunkt, zu dem der Datensatz zuletzt aktualisiert wurde.
shift_start_deviation_minutesintegerL38: Minuten, um die der reale Beginn vor (negativ) oder nach (positiv) dem geplanten Schichtbeginn liegt; null ohne Schicht.
shift_end_deviation_minutesintegerL38: Minuten, um die das reale Ende vor (negativ) oder nach (positiv) dem geplanten Schichtende liegt.
content_typestringArt der Tätigkeit, zum Beispiel Arbeit oder Training.
search_stringstringText, unter dem die Entität gesucht werden kann.
curl --request GET \
--url https://eure-instanz.iw-erp.de/api/time/workentries/42 \
--header 'x-iw-jwt-token: <TOKEN>'const options = {method: 'GET', headers: {'x-iw-jwt-token': '<TOKEN>'}};
fetch('https://eure-instanz.iw-erp.de/api/time/workentries/42', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://eure-instanz.iw-erp.de/api/time/workentries/42"
headers = {"x-iw-jwt-token": "<TOKEN>"}
response = requests.get(url, headers=headers)
print(response.text)<?php
require_once('vendor/autoload.php');
$client = new \GuzzleHttp\Client();
$response = $client->request('GET', 'https://eure-instanz.iw-erp.de/api/time/workentries/42', [
'headers' => [
'x-iw-jwt-token' => '<TOKEN>',
],
]);
echo $response->getBody();using System.Net.Http.Headers;
var client = new HttpClient();
var request = new HttpRequestMessage
{
Method = HttpMethod.Get,
RequestUri = new Uri("https://eure-instanz.iw-erp.de/api/time/workentries/42"),
Headers =
{
{ "x-iw-jwt-token", "<TOKEN>" },
},
};
using (var response = await client.SendAsync(request))
{
response.EnsureSuccessStatusCode();
var body = await response.Content.ReadAsStringAsync();
Console.WriteLine(body);
}OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("https://eure-instanz.iw-erp.de/api/time/workentries/42")
.get()
.addHeader("x-iw-jwt-token", "<TOKEN>")
.build();
Response response = client.newCall(request).execute();package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://eure-instanz.iw-erp.de/api/time/workentries/42"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-iw-jwt-token", "<TOKEN>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}Dart mit dem Package iw_erp_api
import 'package:iw_erp_api/clients/time_tracking_work_time_entry_controller.dart';
import 'package:iw_erp_api/logic/iw_api_state.dart';
IwApiState().host = 'eure-instanz.iw-erp.de';
IwApiState().currentJwtApiToken = '<TOKEN>';
final result = await TimeTrackingWorkTimeEntryController.get('42');
if (result.success) {
print(result.data);
}{
"id": 42,
"description": "Text",
"user": {
"id": 42,
"name": "Beispiel",
"username": "lena.hartmann@example.org",
"email": "lena.hartmann@example.org",
"profile_picture_url": "https://vynst.de",
"positioningeneral": "string",
"crm_person": {
"id": 42,
"first_name": "Lena",
"last_name": "Hartmann",
"title": "Beispiel",
"language": "de",
"support_description": "Text",
"profile_picture_url": "https://vynst.de",
"address_street": "Jakobistr. 39",
"address_city": "Hannover",
"address_zip": "30163"
},
"archived": true,
"require2fa": true,
"search_string": "string"
},
"start": "2026-10-15T09:30:00+02:00",
"start_date": "2026-10-15T09:30:00+02:00",
"start_month": 1,
"start_year": 1,
"end": "2026-10-15T09:30:00+02:00",
"break_start": "2026-10-15T09:30:00+02:00",
"break_end": "2026-10-15T09:30:00+02:00"
}WorkTimeEntry einzeln aktualisieren
PUT/api/time/workentries/{id}
Pfad-Parameter
idPflichtstring |
Request-Body application/json
work_time_entryWorkTimeEntry2Felder anzeigen (9)
personCRMPerson36Person, die gearbeitet hat.
contractEmploymentContract7Vertrag, auf dem die Arbeitszeit gebucht wird.
descriptionstringBeschreibung der Arbeit.
startstring (date-time)Beginn der Arbeitszeit.
endstring (date-time)Ende der Arbeitszeit.
break_startstring (date-time)Beginn der Pause.
break_endstring (date-time)Ende der Pause.
force_no_breakbooleanFür diesen Eintrag wird keine Pause hinzugefügt.
content_typestringArt der Tätigkeit, zum Beispiel Arbeit oder Training.
Antworten
200WorkTimeEntry einzeln aktualisierenWorkTimeEntry
Felder anzeigen (27)
idintegerPrimärschlüssel des Arbeitszeiteintrags. Interne ID.
userUser14Benutzer, der gearbeitet hat.
Felder anzeigen (10)
idintegerPrimärschlüssel des Benutzers. Interne ID des Anmeldebenutzers.
namestringAnzeigename des Benutzers. Wird in der Oberfläche und in Protokolleinträgen angezeigt.
usernamestringAnmeldename des Benutzers. Muss über alle Benutzer hinweg eindeutig sein.
emailstringE-Mail-Adresse des Benutzers. Wird für Anmeldebenachrichtigungen, Passwort-Zurücksetzen und als Anmeldealias verwendet.
positioningeneralstringFreitext zur Position oder Rolle des Benutzers.
crm_personCRMPerson10CRM-Person, die mit diesem Anmeldebenutzer verknüpft ist. Verbindet das Anmeldekonto mit dem Personendatensatz.
profile_picture_urlstringURL des Profilbilds des Benutzers.
archivedbooleanMarkiert den Benutzer als archiviert. Archivierte Benutzer bleiben zur Historie erhalten und sind nicht aktiv.
require2fabooleanFür diesen Benutzer ist die Zwei-Faktor-Authentifizierung Pflicht.
search_stringstringText, unter dem die Entität gesucht werden kann.
descriptionstringBeschreibung der Arbeit.
startstring (date-time)Beginn der Arbeitszeit.
start_datestringStartdatum der Arbeitszeit als Text.
start_monthintegerMonat des Beginns.
start_yearintegerJahr des Beginns.
endstring (date-time)Ende der Arbeitszeit.
break_startstring (date-time)Beginn der Pause.
break_endstring (date-time)Ende der Pause.
break_durationintegerPausendauer in Sekunden
manual_break_durationintegerZ17.2: Pausendauer in Sekunden ohne Lage, z. B. aus einer genehmigten Korrektur, die nur die Dauer der Pause ändert. Zählt wie eine erfasste Pause, solange keine Pause mit Beginn und Ende erfasst ist; null = keine.
auto_breakbooleanEine Pause wurde automatisch hinzugefügt.
force_no_breakbooleanFür diesen Eintrag wird keine Pause hinzugefügt.
durationintegerDauer in Sekunden
auto_closedbooleanDer Eintrag wurde automatisch abgeschlossen.
has_warningbooleanDer Eintrag hat eine Warnung, zum Beispiel ein fehlendes Ende.
has_scanner_startbooleanDer Beginn wurde mit dem Scanner erfasst.
has_scanner_endbooleanDas Ende wurde mit dem Scanner erfasst.
closed_editingbooleanDie Bearbeitung des Eintrags ist gesperrt.
closed_editing_hrbooleanDie Bearbeitung des Eintrags ist für HR gesperrt.
confirmedbooleanDer Eintrag ist bestätigt.
shift_plan_entryShiftPlanEntry3L38: die Schicht, für die dieser Eintrag eingestempelt wurde. Der Eintrag behält die realen Uhrzeiten; die Verknüpfung gibt nur an, zu welcher geplanten Schicht sie gehören.
Felder anzeigen (29)
opened_absence_typestringDie Abwesenheitsart als einfache Bezeichnung, damit die Planung „Krank“ anzeigen kann, ohne die ganze Anfrage in jede Schicht zu übernehmen.
idintegerPrimärschlüssel des Schichtplan-Eintrags. Interne ID.
userUser14Der Schicht zugewiesener Benutzer.
personCRMPerson10Person, die der Schicht zugewiesen ist.
contractEmploymentContract5Vertrag, auf dem die Schicht geplant ist.
employment_contract_groupEmploymentContractGroupPlanungscontainer - Pflichtangabe, auch wenn eine Person einer anderen Gruppe aushilft.
shift_typeShiftType5Ursprungstyp - Zeiten wurden kopiert, der Verweis dient nur der Information.
startstring (date-time)Beginn des Dienstes.
endstring (date-time)Ende der Schicht.
start_datestringStartdatum des Dienstes als Text.
start_monthintegerMonat der Schicht.
start_yearintegerJahr der Schicht.
break_duration_secondsintegerPausendauer der Schicht in Sekunden.
durationintegerZielsekunden: (Ende - Start) - Pause, wird von recalculate() gepflegt.
required_qualificationEmploymentQualification5Für die Schicht erforderliche Qualifikation.
qualification_match_modestringL18: EXACT verlangt die geforderte Qualifikation selbst; EQUIVALENT (Standard, bisheriges Verhalten) akzeptiert auch verknüpfte oder gleichgruppierte Qualifikationen mit ausreichendem Rang.
statusstringStatus des Dienstes, zum Beispiel geplant oder veröffentlicht.
published_atstring (date-time)Zeitpunkt, zu dem die Schicht veröffentlicht wurde.
descriptionstringBeschreibung der Schicht.
has_warningbooleanGespeichertes Konfliktkennzeichen für Listen-Badges - die konkreten Warnungen werden bei Bedarf berechnet (ShiftPlanHelper) und nur vorübergehend zurückgegeben.
availability_bookingBaseBooking13L35: die Verfügbarkeit, für die die veröffentlichte Schicht im Buchungsbereich steht (wird vom ShiftBookingSyncHelper synchron gehalten, solange die Synchronisation für den Vertrag aktiviert ist).
bookingBaseBooking13L35: der aus dieser Schicht erstellte Termin, falls vorhanden.
opened_reasonstringGrund, warum die Schicht für andere Mitarbeitende freigegeben wurde.
opened_atstring (date-time)Zeitpunkt, zu dem die Schicht geöffnet wurde.
opened_from_personCRMPerson10Wer die Schicht vor der Freigabe bearbeitet hat – die Zuweisung selbst ist entfallen, und die Planung muss wissen, wen sie fragen kann.
opened_absence_requestNonWorkTimeRequest5Die Abwesenheit, die ihn freigegeben hat, für OPENED_REASON_ABSENCE. Enthält Art und Tage, sodass die Planung „krank“ statt nur „jemand ist abwesend“ anzeigen kann.
lock_versionintegerOptimistische Sperre. Zwei Planer, die dieselbe Schicht bearbeiten, oder eine Wochenveröffentlichung, während jemand eine Schicht darin verschiebt, würden sonst stillschweigend einander überschreiben - der Unterlegene erhält jetzt einen 409. Nur lesend: Doctrine verwaltet den Wert, der Client sendet den zuletzt gesehenen Wert als Query-Parameter lock_version zurück.
createdstring (date-time)Zeitpunkt, zu dem der Datensatz angelegt wurde.
updatedstring (date-time)Zeitpunkt, zu dem der Datensatz zuletzt aktualisiert wurde.
shift_start_deviation_minutesintegerL38: Minuten, um die der reale Beginn vor (negativ) oder nach (positiv) dem geplanten Schichtbeginn liegt; null ohne Schicht.
shift_end_deviation_minutesintegerL38: Minuten, um die das reale Ende vor (negativ) oder nach (positiv) dem geplanten Schichtende liegt.
content_typestringArt der Tätigkeit, zum Beispiel Arbeit oder Training.
search_stringstringText, unter dem die Entität gesucht werden kann.
curl --request PUT \
--url https://eure-instanz.iw-erp.de/api/time/workentries/42 \
--header 'content-type: application/json' \
--header 'x-iw-jwt-token: <TOKEN>' \
--data '
{
"work_time_entry": {
"description": "Text",
"start": "2026-10-15T09:30:00+02:00",
"end": "2026-10-15T09:30:00+02:00",
"break_start": "2026-10-15T09:30:00+02:00",
"break_end": "2026-10-15T09:30:00+02:00",
"force_no_break": true
}
}
'const options = {
method: 'PUT',
headers: {'x-iw-jwt-token': '<TOKEN>', 'content-type': 'application/json'},
body: JSON.stringify({
work_time_entry: {
description: 'Text',
start: '2026-10-15T09:30:00+02:00',
end: '2026-10-15T09:30:00+02:00',
break_start: '2026-10-15T09:30:00+02:00',
break_end: '2026-10-15T09:30:00+02:00',
force_no_break: true
}
})
};
fetch('https://eure-instanz.iw-erp.de/api/time/workentries/42', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://eure-instanz.iw-erp.de/api/time/workentries/42"
payload = { "work_time_entry": {
"description": "Text",
"start": "2026-10-15T09:30:00+02:00",
"end": "2026-10-15T09:30:00+02:00",
"break_start": "2026-10-15T09:30:00+02:00",
"break_end": "2026-10-15T09:30:00+02:00",
"force_no_break": True
} }
headers = {
"x-iw-jwt-token": "<TOKEN>",
"content-type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)<?php
require_once('vendor/autoload.php');
$client = new \GuzzleHttp\Client();
$response = $client->request('PUT', 'https://eure-instanz.iw-erp.de/api/time/workentries/42', [
'body' => '{"work_time_entry":{"description":"Text","start":"2026-10-15T09:30:00+02:00","end":"2026-10-15T09:30:00+02:00","break_start":"2026-10-15T09:30:00+02:00","break_end":"2026-10-15T09:30:00+02:00","force_no_break":true}}',
'headers' => [
'content-type' => 'application/json',
'x-iw-jwt-token' => '<TOKEN>',
],
]);
echo $response->getBody();using System.Net.Http.Headers;
var client = new HttpClient();
var request = new HttpRequestMessage
{
Method = HttpMethod.Put,
RequestUri = new Uri("https://eure-instanz.iw-erp.de/api/time/workentries/42"),
Headers =
{
{ "x-iw-jwt-token", "<TOKEN>" },
},
Content = new StringContent("{\"work_time_entry\":{\"description\":\"Text\",\"start\":\"2026-10-15T09:30:00+02:00\",\"end\":\"2026-10-15T09:30:00+02:00\",\"break_start\":\"2026-10-15T09:30:00+02:00\",\"break_end\":\"2026-10-15T09:30:00+02:00\",\"force_no_break\":true}}")
{
Headers =
{
ContentType = new MediaTypeHeaderValue("application/json")
}
}
};
using (var response = await client.SendAsync(request))
{
response.EnsureSuccessStatusCode();
var body = await response.Content.ReadAsStringAsync();
Console.WriteLine(body);
}OkHttpClient client = new OkHttpClient();
MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{\"work_time_entry\":{\"description\":\"Text\",\"start\":\"2026-10-15T09:30:00+02:00\",\"end\":\"2026-10-15T09:30:00+02:00\",\"break_start\":\"2026-10-15T09:30:00+02:00\",\"break_end\":\"2026-10-15T09:30:00+02:00\",\"force_no_break\":true}}");
Request request = new Request.Builder()
.url("https://eure-instanz.iw-erp.de/api/time/workentries/42")
.put(body)
.addHeader("x-iw-jwt-token", "<TOKEN>")
.addHeader("content-type", "application/json")
.build();
Response response = client.newCall(request).execute();package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://eure-instanz.iw-erp.de/api/time/workentries/42"
payload := strings.NewReader("{\"work_time_entry\":{\"description\":\"Text\",\"start\":\"2026-10-15T09:30:00+02:00\",\"end\":\"2026-10-15T09:30:00+02:00\",\"break_start\":\"2026-10-15T09:30:00+02:00\",\"break_end\":\"2026-10-15T09:30:00+02:00\",\"force_no_break\":true}}")
req, _ := http.NewRequest("PUT", url, payload)
req.Header.Add("x-iw-jwt-token", "<TOKEN>")
req.Header.Add("content-type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}Dart mit dem Package iw_erp_api
import 'package:iw_erp_api/clients/time_tracking_work_time_entry_controller.dart';
import 'package:iw_erp_api/logic/iw_api_state.dart';
import 'package:iw_erp_api/model/time_tracking_work_time_entry.dart';
IwApiState().host = 'eure-instanz.iw-erp.de';
IwApiState().currentJwtApiToken = '<TOKEN>';
final result = await TimeTrackingWorkTimeEntryController.put(TimeTrackingWorkTimeEntry.fromJson({
"description": "Text",
"start": "2026-10-15T09:30:00+02:00",
"end": "2026-10-15T09:30:00+02:00",
"break_start": "2026-10-15T09:30:00+02:00",
"break_end": "2026-10-15T09:30:00+02:00",
"force_no_break": true
}));
if (result.success) {
print(result.data);
}{
"id": 42,
"description": "Text",
"user": {
"id": 42,
"name": "Beispiel",
"username": "lena.hartmann@example.org",
"email": "lena.hartmann@example.org",
"profile_picture_url": "https://vynst.de",
"positioningeneral": "string",
"crm_person": {
"id": 42,
"first_name": "Lena",
"last_name": "Hartmann",
"title": "Beispiel",
"language": "de",
"support_description": "Text",
"profile_picture_url": "https://vynst.de",
"address_street": "Jakobistr. 39",
"address_city": "Hannover",
"address_zip": "30163"
},
"archived": true,
"require2fa": true,
"search_string": "string"
},
"start": "2026-10-15T09:30:00+02:00",
"start_date": "2026-10-15T09:30:00+02:00",
"start_month": 1,
"start_year": 1,
"end": "2026-10-15T09:30:00+02:00",
"break_start": "2026-10-15T09:30:00+02:00",
"break_end": "2026-10-15T09:30:00+02:00"
}WorkTimeEntry einzeln aktualisieren
PATCH/api/time/workentries/{id}
Pfad-Parameter
idPflichtstring |
Request-Body application/json
work_time_entryWorkTimeEntry2Felder anzeigen (9)
personCRMPerson36Person, die gearbeitet hat.
contractEmploymentContract7Vertrag, auf dem die Arbeitszeit gebucht wird.
descriptionstringBeschreibung der Arbeit.
startstring (date-time)Beginn der Arbeitszeit.
endstring (date-time)Ende der Arbeitszeit.
break_startstring (date-time)Beginn der Pause.
break_endstring (date-time)Ende der Pause.
force_no_breakbooleanFür diesen Eintrag wird keine Pause hinzugefügt.
content_typestringArt der Tätigkeit, zum Beispiel Arbeit oder Training.
Antworten
200WorkTimeEntry einzeln aktualisierenWorkTimeEntry
Felder anzeigen (27)
idintegerPrimärschlüssel des Arbeitszeiteintrags. Interne ID.
userUser14Benutzer, der gearbeitet hat.
Felder anzeigen (10)
idintegerPrimärschlüssel des Benutzers. Interne ID des Anmeldebenutzers.
namestringAnzeigename des Benutzers. Wird in der Oberfläche und in Protokolleinträgen angezeigt.
usernamestringAnmeldename des Benutzers. Muss über alle Benutzer hinweg eindeutig sein.
emailstringE-Mail-Adresse des Benutzers. Wird für Anmeldebenachrichtigungen, Passwort-Zurücksetzen und als Anmeldealias verwendet.
positioningeneralstringFreitext zur Position oder Rolle des Benutzers.
crm_personCRMPerson10CRM-Person, die mit diesem Anmeldebenutzer verknüpft ist. Verbindet das Anmeldekonto mit dem Personendatensatz.
profile_picture_urlstringURL des Profilbilds des Benutzers.
archivedbooleanMarkiert den Benutzer als archiviert. Archivierte Benutzer bleiben zur Historie erhalten und sind nicht aktiv.
require2fabooleanFür diesen Benutzer ist die Zwei-Faktor-Authentifizierung Pflicht.
search_stringstringText, unter dem die Entität gesucht werden kann.
descriptionstringBeschreibung der Arbeit.
startstring (date-time)Beginn der Arbeitszeit.
start_datestringStartdatum der Arbeitszeit als Text.
start_monthintegerMonat des Beginns.
start_yearintegerJahr des Beginns.
endstring (date-time)Ende der Arbeitszeit.
break_startstring (date-time)Beginn der Pause.
break_endstring (date-time)Ende der Pause.
break_durationintegerPausendauer in Sekunden
manual_break_durationintegerZ17.2: Pausendauer in Sekunden ohne Lage, z. B. aus einer genehmigten Korrektur, die nur die Dauer der Pause ändert. Zählt wie eine erfasste Pause, solange keine Pause mit Beginn und Ende erfasst ist; null = keine.
auto_breakbooleanEine Pause wurde automatisch hinzugefügt.
force_no_breakbooleanFür diesen Eintrag wird keine Pause hinzugefügt.
durationintegerDauer in Sekunden
auto_closedbooleanDer Eintrag wurde automatisch abgeschlossen.
has_warningbooleanDer Eintrag hat eine Warnung, zum Beispiel ein fehlendes Ende.
has_scanner_startbooleanDer Beginn wurde mit dem Scanner erfasst.
has_scanner_endbooleanDas Ende wurde mit dem Scanner erfasst.
closed_editingbooleanDie Bearbeitung des Eintrags ist gesperrt.
closed_editing_hrbooleanDie Bearbeitung des Eintrags ist für HR gesperrt.
confirmedbooleanDer Eintrag ist bestätigt.
shift_plan_entryShiftPlanEntry3L38: die Schicht, für die dieser Eintrag eingestempelt wurde. Der Eintrag behält die realen Uhrzeiten; die Verknüpfung gibt nur an, zu welcher geplanten Schicht sie gehören.
Felder anzeigen (29)
opened_absence_typestringDie Abwesenheitsart als einfache Bezeichnung, damit die Planung „Krank“ anzeigen kann, ohne die ganze Anfrage in jede Schicht zu übernehmen.
idintegerPrimärschlüssel des Schichtplan-Eintrags. Interne ID.
userUser14Der Schicht zugewiesener Benutzer.
personCRMPerson10Person, die der Schicht zugewiesen ist.
contractEmploymentContract5Vertrag, auf dem die Schicht geplant ist.
employment_contract_groupEmploymentContractGroupPlanungscontainer - Pflichtangabe, auch wenn eine Person einer anderen Gruppe aushilft.
shift_typeShiftType5Ursprungstyp - Zeiten wurden kopiert, der Verweis dient nur der Information.
startstring (date-time)Beginn des Dienstes.
endstring (date-time)Ende der Schicht.
start_datestringStartdatum des Dienstes als Text.
start_monthintegerMonat der Schicht.
start_yearintegerJahr der Schicht.
break_duration_secondsintegerPausendauer der Schicht in Sekunden.
durationintegerZielsekunden: (Ende - Start) - Pause, wird von recalculate() gepflegt.
required_qualificationEmploymentQualification5Für die Schicht erforderliche Qualifikation.
qualification_match_modestringL18: EXACT verlangt die geforderte Qualifikation selbst; EQUIVALENT (Standard, bisheriges Verhalten) akzeptiert auch verknüpfte oder gleichgruppierte Qualifikationen mit ausreichendem Rang.
statusstringStatus des Dienstes, zum Beispiel geplant oder veröffentlicht.
published_atstring (date-time)Zeitpunkt, zu dem die Schicht veröffentlicht wurde.
descriptionstringBeschreibung der Schicht.
has_warningbooleanGespeichertes Konfliktkennzeichen für Listen-Badges - die konkreten Warnungen werden bei Bedarf berechnet (ShiftPlanHelper) und nur vorübergehend zurückgegeben.
availability_bookingBaseBooking13L35: die Verfügbarkeit, für die die veröffentlichte Schicht im Buchungsbereich steht (wird vom ShiftBookingSyncHelper synchron gehalten, solange die Synchronisation für den Vertrag aktiviert ist).
bookingBaseBooking13L35: der aus dieser Schicht erstellte Termin, falls vorhanden.
opened_reasonstringGrund, warum die Schicht für andere Mitarbeitende freigegeben wurde.
opened_atstring (date-time)Zeitpunkt, zu dem die Schicht geöffnet wurde.
opened_from_personCRMPerson10Wer die Schicht vor der Freigabe bearbeitet hat – die Zuweisung selbst ist entfallen, und die Planung muss wissen, wen sie fragen kann.
opened_absence_requestNonWorkTimeRequest5Die Abwesenheit, die ihn freigegeben hat, für OPENED_REASON_ABSENCE. Enthält Art und Tage, sodass die Planung „krank“ statt nur „jemand ist abwesend“ anzeigen kann.
lock_versionintegerOptimistische Sperre. Zwei Planer, die dieselbe Schicht bearbeiten, oder eine Wochenveröffentlichung, während jemand eine Schicht darin verschiebt, würden sonst stillschweigend einander überschreiben - der Unterlegene erhält jetzt einen 409. Nur lesend: Doctrine verwaltet den Wert, der Client sendet den zuletzt gesehenen Wert als Query-Parameter lock_version zurück.
createdstring (date-time)Zeitpunkt, zu dem der Datensatz angelegt wurde.
updatedstring (date-time)Zeitpunkt, zu dem der Datensatz zuletzt aktualisiert wurde.
shift_start_deviation_minutesintegerL38: Minuten, um die der reale Beginn vor (negativ) oder nach (positiv) dem geplanten Schichtbeginn liegt; null ohne Schicht.
shift_end_deviation_minutesintegerL38: Minuten, um die das reale Ende vor (negativ) oder nach (positiv) dem geplanten Schichtende liegt.
content_typestringArt der Tätigkeit, zum Beispiel Arbeit oder Training.
search_stringstringText, unter dem die Entität gesucht werden kann.
curl --request PATCH \
--url https://eure-instanz.iw-erp.de/api/time/workentries/42 \
--header 'content-type: application/json' \
--header 'x-iw-jwt-token: <TOKEN>' \
--data '
{
"work_time_entry": {
"description": "Text",
"start": "2026-10-15T09:30:00+02:00",
"end": "2026-10-15T09:30:00+02:00",
"break_start": "2026-10-15T09:30:00+02:00",
"break_end": "2026-10-15T09:30:00+02:00",
"force_no_break": true
}
}
'const options = {
method: 'PATCH',
headers: {'x-iw-jwt-token': '<TOKEN>', 'content-type': 'application/json'},
body: JSON.stringify({
work_time_entry: {
description: 'Text',
start: '2026-10-15T09:30:00+02:00',
end: '2026-10-15T09:30:00+02:00',
break_start: '2026-10-15T09:30:00+02:00',
break_end: '2026-10-15T09:30:00+02:00',
force_no_break: true
}
})
};
fetch('https://eure-instanz.iw-erp.de/api/time/workentries/42', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://eure-instanz.iw-erp.de/api/time/workentries/42"
payload = { "work_time_entry": {
"description": "Text",
"start": "2026-10-15T09:30:00+02:00",
"end": "2026-10-15T09:30:00+02:00",
"break_start": "2026-10-15T09:30:00+02:00",
"break_end": "2026-10-15T09:30:00+02:00",
"force_no_break": True
} }
headers = {
"x-iw-jwt-token": "<TOKEN>",
"content-type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)<?php
require_once('vendor/autoload.php');
$client = new \GuzzleHttp\Client();
$response = $client->request('PATCH', 'https://eure-instanz.iw-erp.de/api/time/workentries/42', [
'body' => '{"work_time_entry":{"description":"Text","start":"2026-10-15T09:30:00+02:00","end":"2026-10-15T09:30:00+02:00","break_start":"2026-10-15T09:30:00+02:00","break_end":"2026-10-15T09:30:00+02:00","force_no_break":true}}',
'headers' => [
'content-type' => 'application/json',
'x-iw-jwt-token' => '<TOKEN>',
],
]);
echo $response->getBody();using System.Net.Http.Headers;
var client = new HttpClient();
var request = new HttpRequestMessage
{
Method = HttpMethod.Patch,
RequestUri = new Uri("https://eure-instanz.iw-erp.de/api/time/workentries/42"),
Headers =
{
{ "x-iw-jwt-token", "<TOKEN>" },
},
Content = new StringContent("{\"work_time_entry\":{\"description\":\"Text\",\"start\":\"2026-10-15T09:30:00+02:00\",\"end\":\"2026-10-15T09:30:00+02:00\",\"break_start\":\"2026-10-15T09:30:00+02:00\",\"break_end\":\"2026-10-15T09:30:00+02:00\",\"force_no_break\":true}}")
{
Headers =
{
ContentType = new MediaTypeHeaderValue("application/json")
}
}
};
using (var response = await client.SendAsync(request))
{
response.EnsureSuccessStatusCode();
var body = await response.Content.ReadAsStringAsync();
Console.WriteLine(body);
}OkHttpClient client = new OkHttpClient();
MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{\"work_time_entry\":{\"description\":\"Text\",\"start\":\"2026-10-15T09:30:00+02:00\",\"end\":\"2026-10-15T09:30:00+02:00\",\"break_start\":\"2026-10-15T09:30:00+02:00\",\"break_end\":\"2026-10-15T09:30:00+02:00\",\"force_no_break\":true}}");
Request request = new Request.Builder()
.url("https://eure-instanz.iw-erp.de/api/time/workentries/42")
.patch(body)
.addHeader("x-iw-jwt-token", "<TOKEN>")
.addHeader("content-type", "application/json")
.build();
Response response = client.newCall(request).execute();package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://eure-instanz.iw-erp.de/api/time/workentries/42"
payload := strings.NewReader("{\"work_time_entry\":{\"description\":\"Text\",\"start\":\"2026-10-15T09:30:00+02:00\",\"end\":\"2026-10-15T09:30:00+02:00\",\"break_start\":\"2026-10-15T09:30:00+02:00\",\"break_end\":\"2026-10-15T09:30:00+02:00\",\"force_no_break\":true}}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("x-iw-jwt-token", "<TOKEN>")
req.Header.Add("content-type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}Dart mit dem Package iw_erp_api
import 'package:iw_erp_api/clients/time_tracking_work_time_entry_controller.dart';
import 'package:iw_erp_api/logic/iw_api_state.dart';
import 'package:iw_erp_api/model/time_tracking_work_time_entry.dart';
IwApiState().host = 'eure-instanz.iw-erp.de';
IwApiState().currentJwtApiToken = '<TOKEN>';
final result = await TimeTrackingWorkTimeEntryController.patch(TimeTrackingWorkTimeEntry.fromJson({
"description": "Text",
"start": "2026-10-15T09:30:00+02:00",
"end": "2026-10-15T09:30:00+02:00",
"break_start": "2026-10-15T09:30:00+02:00",
"break_end": "2026-10-15T09:30:00+02:00",
"force_no_break": true
}), 'description');
if (result.success) {
print(result.data);
}{
"id": 42,
"description": "Text",
"user": {
"id": 42,
"name": "Beispiel",
"username": "lena.hartmann@example.org",
"email": "lena.hartmann@example.org",
"profile_picture_url": "https://vynst.de",
"positioningeneral": "string",
"crm_person": {
"id": 42,
"first_name": "Lena",
"last_name": "Hartmann",
"title": "Beispiel",
"language": "de",
"support_description": "Text",
"profile_picture_url": "https://vynst.de",
"address_street": "Jakobistr. 39",
"address_city": "Hannover",
"address_zip": "30163"
},
"archived": true,
"require2fa": true,
"search_string": "string"
},
"start": "2026-10-15T09:30:00+02:00",
"start_date": "2026-10-15T09:30:00+02:00",
"start_month": 1,
"start_year": 1,
"end": "2026-10-15T09:30:00+02:00",
"break_start": "2026-10-15T09:30:00+02:00",
"break_end": "2026-10-15T09:30:00+02:00"
}Einen einzelnen WorkTimeEntry löschen
DELETE/api/time/workentries/{id}
Pfad-Parameter
idPflichtstring |
Antworten
200Einen einzelnen WorkTimeEntry löschenWorkTimeEntry
Felder anzeigen (27)
idintegerPrimärschlüssel des Arbeitszeiteintrags. Interne ID.
userUser14Benutzer, der gearbeitet hat.
Felder anzeigen (10)
idintegerPrimärschlüssel des Benutzers. Interne ID des Anmeldebenutzers.
namestringAnzeigename des Benutzers. Wird in der Oberfläche und in Protokolleinträgen angezeigt.
usernamestringAnmeldename des Benutzers. Muss über alle Benutzer hinweg eindeutig sein.
emailstringE-Mail-Adresse des Benutzers. Wird für Anmeldebenachrichtigungen, Passwort-Zurücksetzen und als Anmeldealias verwendet.
positioningeneralstringFreitext zur Position oder Rolle des Benutzers.
crm_personCRMPerson10CRM-Person, die mit diesem Anmeldebenutzer verknüpft ist. Verbindet das Anmeldekonto mit dem Personendatensatz.
profile_picture_urlstringURL des Profilbilds des Benutzers.
archivedbooleanMarkiert den Benutzer als archiviert. Archivierte Benutzer bleiben zur Historie erhalten und sind nicht aktiv.
require2fabooleanFür diesen Benutzer ist die Zwei-Faktor-Authentifizierung Pflicht.
search_stringstringText, unter dem die Entität gesucht werden kann.
descriptionstringBeschreibung der Arbeit.
startstring (date-time)Beginn der Arbeitszeit.
start_datestringStartdatum der Arbeitszeit als Text.
start_monthintegerMonat des Beginns.
start_yearintegerJahr des Beginns.
endstring (date-time)Ende der Arbeitszeit.
break_startstring (date-time)Beginn der Pause.
break_endstring (date-time)Ende der Pause.
break_durationintegerPausendauer in Sekunden
manual_break_durationintegerZ17.2: Pausendauer in Sekunden ohne Lage, z. B. aus einer genehmigten Korrektur, die nur die Dauer der Pause ändert. Zählt wie eine erfasste Pause, solange keine Pause mit Beginn und Ende erfasst ist; null = keine.
auto_breakbooleanEine Pause wurde automatisch hinzugefügt.
force_no_breakbooleanFür diesen Eintrag wird keine Pause hinzugefügt.
durationintegerDauer in Sekunden
auto_closedbooleanDer Eintrag wurde automatisch abgeschlossen.
has_warningbooleanDer Eintrag hat eine Warnung, zum Beispiel ein fehlendes Ende.
has_scanner_startbooleanDer Beginn wurde mit dem Scanner erfasst.
has_scanner_endbooleanDas Ende wurde mit dem Scanner erfasst.
closed_editingbooleanDie Bearbeitung des Eintrags ist gesperrt.
closed_editing_hrbooleanDie Bearbeitung des Eintrags ist für HR gesperrt.
confirmedbooleanDer Eintrag ist bestätigt.
shift_plan_entryShiftPlanEntry3L38: die Schicht, für die dieser Eintrag eingestempelt wurde. Der Eintrag behält die realen Uhrzeiten; die Verknüpfung gibt nur an, zu welcher geplanten Schicht sie gehören.
Felder anzeigen (29)
opened_absence_typestringDie Abwesenheitsart als einfache Bezeichnung, damit die Planung „Krank“ anzeigen kann, ohne die ganze Anfrage in jede Schicht zu übernehmen.
idintegerPrimärschlüssel des Schichtplan-Eintrags. Interne ID.
userUser14Der Schicht zugewiesener Benutzer.
personCRMPerson10Person, die der Schicht zugewiesen ist.
contractEmploymentContract5Vertrag, auf dem die Schicht geplant ist.
employment_contract_groupEmploymentContractGroupPlanungscontainer - Pflichtangabe, auch wenn eine Person einer anderen Gruppe aushilft.
shift_typeShiftType5Ursprungstyp - Zeiten wurden kopiert, der Verweis dient nur der Information.
startstring (date-time)Beginn des Dienstes.
endstring (date-time)Ende der Schicht.
start_datestringStartdatum des Dienstes als Text.
start_monthintegerMonat der Schicht.
start_yearintegerJahr der Schicht.
break_duration_secondsintegerPausendauer der Schicht in Sekunden.
durationintegerZielsekunden: (Ende - Start) - Pause, wird von recalculate() gepflegt.
required_qualificationEmploymentQualification5Für die Schicht erforderliche Qualifikation.
qualification_match_modestringL18: EXACT verlangt die geforderte Qualifikation selbst; EQUIVALENT (Standard, bisheriges Verhalten) akzeptiert auch verknüpfte oder gleichgruppierte Qualifikationen mit ausreichendem Rang.
statusstringStatus des Dienstes, zum Beispiel geplant oder veröffentlicht.
published_atstring (date-time)Zeitpunkt, zu dem die Schicht veröffentlicht wurde.
descriptionstringBeschreibung der Schicht.
has_warningbooleanGespeichertes Konfliktkennzeichen für Listen-Badges - die konkreten Warnungen werden bei Bedarf berechnet (ShiftPlanHelper) und nur vorübergehend zurückgegeben.
availability_bookingBaseBooking13L35: die Verfügbarkeit, für die die veröffentlichte Schicht im Buchungsbereich steht (wird vom ShiftBookingSyncHelper synchron gehalten, solange die Synchronisation für den Vertrag aktiviert ist).
bookingBaseBooking13L35: der aus dieser Schicht erstellte Termin, falls vorhanden.
opened_reasonstringGrund, warum die Schicht für andere Mitarbeitende freigegeben wurde.
opened_atstring (date-time)Zeitpunkt, zu dem die Schicht geöffnet wurde.
opened_from_personCRMPerson10Wer die Schicht vor der Freigabe bearbeitet hat – die Zuweisung selbst ist entfallen, und die Planung muss wissen, wen sie fragen kann.
opened_absence_requestNonWorkTimeRequest5Die Abwesenheit, die ihn freigegeben hat, für OPENED_REASON_ABSENCE. Enthält Art und Tage, sodass die Planung „krank“ statt nur „jemand ist abwesend“ anzeigen kann.
lock_versionintegerOptimistische Sperre. Zwei Planer, die dieselbe Schicht bearbeiten, oder eine Wochenveröffentlichung, während jemand eine Schicht darin verschiebt, würden sonst stillschweigend einander überschreiben - der Unterlegene erhält jetzt einen 409. Nur lesend: Doctrine verwaltet den Wert, der Client sendet den zuletzt gesehenen Wert als Query-Parameter lock_version zurück.
createdstring (date-time)Zeitpunkt, zu dem der Datensatz angelegt wurde.
updatedstring (date-time)Zeitpunkt, zu dem der Datensatz zuletzt aktualisiert wurde.
shift_start_deviation_minutesintegerL38: Minuten, um die der reale Beginn vor (negativ) oder nach (positiv) dem geplanten Schichtbeginn liegt; null ohne Schicht.
shift_end_deviation_minutesintegerL38: Minuten, um die das reale Ende vor (negativ) oder nach (positiv) dem geplanten Schichtende liegt.
content_typestringArt der Tätigkeit, zum Beispiel Arbeit oder Training.
search_stringstringText, unter dem die Entität gesucht werden kann.
curl --request DELETE \
--url https://eure-instanz.iw-erp.de/api/time/workentries/42 \
--header 'x-iw-jwt-token: <TOKEN>'const options = {method: 'DELETE', headers: {'x-iw-jwt-token': '<TOKEN>'}};
fetch('https://eure-instanz.iw-erp.de/api/time/workentries/42', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://eure-instanz.iw-erp.de/api/time/workentries/42"
headers = {"x-iw-jwt-token": "<TOKEN>"}
response = requests.delete(url, headers=headers)
print(response.text)<?php
require_once('vendor/autoload.php');
$client = new \GuzzleHttp\Client();
$response = $client->request('DELETE', 'https://eure-instanz.iw-erp.de/api/time/workentries/42', [
'headers' => [
'x-iw-jwt-token' => '<TOKEN>',
],
]);
echo $response->getBody();using System.Net.Http.Headers;
var client = new HttpClient();
var request = new HttpRequestMessage
{
Method = HttpMethod.Delete,
RequestUri = new Uri("https://eure-instanz.iw-erp.de/api/time/workentries/42"),
Headers =
{
{ "x-iw-jwt-token", "<TOKEN>" },
},
};
using (var response = await client.SendAsync(request))
{
response.EnsureSuccessStatusCode();
var body = await response.Content.ReadAsStringAsync();
Console.WriteLine(body);
}OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("https://eure-instanz.iw-erp.de/api/time/workentries/42")
.delete(null)
.addHeader("x-iw-jwt-token", "<TOKEN>")
.build();
Response response = client.newCall(request).execute();package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://eure-instanz.iw-erp.de/api/time/workentries/42"
req, _ := http.NewRequest("DELETE", url, nil)
req.Header.Add("x-iw-jwt-token", "<TOKEN>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}Dart mit dem Package iw_erp_api
import 'package:iw_erp_api/clients/time_tracking_work_time_entry_controller.dart';
import 'package:iw_erp_api/logic/iw_api_state.dart';
IwApiState().host = 'eure-instanz.iw-erp.de';
IwApiState().currentJwtApiToken = '<TOKEN>';
final result = await TimeTrackingWorkTimeEntryController.delete('42');
if (result.success) {
print(result.data);
}{
"id": 42,
"description": "Text",
"user": {
"id": 42,
"name": "Beispiel",
"username": "lena.hartmann@example.org",
"email": "lena.hartmann@example.org",
"profile_picture_url": "https://vynst.de",
"positioningeneral": "string",
"crm_person": {
"id": 42,
"first_name": "Lena",
"last_name": "Hartmann",
"title": "Beispiel",
"language": "de",
"support_description": "Text",
"profile_picture_url": "https://vynst.de",
"address_street": "Jakobistr. 39",
"address_city": "Hannover",
"address_zip": "30163"
},
"archived": true,
"require2fa": true,
"search_string": "string"
},
"start": "2026-10-15T09:30:00+02:00",
"start_date": "2026-10-15T09:30:00+02:00",
"start_month": 1,
"start_year": 1,
"end": "2026-10-15T09:30:00+02:00",
"break_start": "2026-10-15T09:30:00+02:00",
"break_end": "2026-10-15T09:30:00+02:00"
}Den aktuellen eigenen WorkTimeEntry abrufen
GET/api/time/current_own_workentry
Antworten
200Den aktuellen eigenen WorkTimeEntry abrufenWorkTimeEntry
Felder anzeigen (27)
idintegerPrimärschlüssel des Arbeitszeiteintrags. Interne ID.
userUser14Benutzer, der gearbeitet hat.
Felder anzeigen (10)
idintegerPrimärschlüssel des Benutzers. Interne ID des Anmeldebenutzers.
namestringAnzeigename des Benutzers. Wird in der Oberfläche und in Protokolleinträgen angezeigt.
usernamestringAnmeldename des Benutzers. Muss über alle Benutzer hinweg eindeutig sein.
emailstringE-Mail-Adresse des Benutzers. Wird für Anmeldebenachrichtigungen, Passwort-Zurücksetzen und als Anmeldealias verwendet.
positioningeneralstringFreitext zur Position oder Rolle des Benutzers.
crm_personCRMPerson10CRM-Person, die mit diesem Anmeldebenutzer verknüpft ist. Verbindet das Anmeldekonto mit dem Personendatensatz.
profile_picture_urlstringURL des Profilbilds des Benutzers.
archivedbooleanMarkiert den Benutzer als archiviert. Archivierte Benutzer bleiben zur Historie erhalten und sind nicht aktiv.
require2fabooleanFür diesen Benutzer ist die Zwei-Faktor-Authentifizierung Pflicht.
search_stringstringText, unter dem die Entität gesucht werden kann.
descriptionstringBeschreibung der Arbeit.
startstring (date-time)Beginn der Arbeitszeit.
start_datestringStartdatum der Arbeitszeit als Text.
start_monthintegerMonat des Beginns.
start_yearintegerJahr des Beginns.
endstring (date-time)Ende der Arbeitszeit.
break_startstring (date-time)Beginn der Pause.
break_endstring (date-time)Ende der Pause.
break_durationintegerPausendauer in Sekunden
manual_break_durationintegerZ17.2: Pausendauer in Sekunden ohne Lage, z. B. aus einer genehmigten Korrektur, die nur die Dauer der Pause ändert. Zählt wie eine erfasste Pause, solange keine Pause mit Beginn und Ende erfasst ist; null = keine.
auto_breakbooleanEine Pause wurde automatisch hinzugefügt.
force_no_breakbooleanFür diesen Eintrag wird keine Pause hinzugefügt.
durationintegerDauer in Sekunden
auto_closedbooleanDer Eintrag wurde automatisch abgeschlossen.
has_warningbooleanDer Eintrag hat eine Warnung, zum Beispiel ein fehlendes Ende.
has_scanner_startbooleanDer Beginn wurde mit dem Scanner erfasst.
has_scanner_endbooleanDas Ende wurde mit dem Scanner erfasst.
closed_editingbooleanDie Bearbeitung des Eintrags ist gesperrt.
closed_editing_hrbooleanDie Bearbeitung des Eintrags ist für HR gesperrt.
confirmedbooleanDer Eintrag ist bestätigt.
shift_plan_entryShiftPlanEntry3L38: die Schicht, für die dieser Eintrag eingestempelt wurde. Der Eintrag behält die realen Uhrzeiten; die Verknüpfung gibt nur an, zu welcher geplanten Schicht sie gehören.
Felder anzeigen (29)
opened_absence_typestringDie Abwesenheitsart als einfache Bezeichnung, damit die Planung „Krank“ anzeigen kann, ohne die ganze Anfrage in jede Schicht zu übernehmen.
idintegerPrimärschlüssel des Schichtplan-Eintrags. Interne ID.
userUser14Der Schicht zugewiesener Benutzer.
personCRMPerson10Person, die der Schicht zugewiesen ist.
contractEmploymentContract5Vertrag, auf dem die Schicht geplant ist.
employment_contract_groupEmploymentContractGroupPlanungscontainer - Pflichtangabe, auch wenn eine Person einer anderen Gruppe aushilft.
shift_typeShiftType5Ursprungstyp - Zeiten wurden kopiert, der Verweis dient nur der Information.
startstring (date-time)Beginn des Dienstes.
endstring (date-time)Ende der Schicht.
start_datestringStartdatum des Dienstes als Text.
start_monthintegerMonat der Schicht.
start_yearintegerJahr der Schicht.
break_duration_secondsintegerPausendauer der Schicht in Sekunden.
durationintegerZielsekunden: (Ende - Start) - Pause, wird von recalculate() gepflegt.
required_qualificationEmploymentQualification5Für die Schicht erforderliche Qualifikation.
qualification_match_modestringL18: EXACT verlangt die geforderte Qualifikation selbst; EQUIVALENT (Standard, bisheriges Verhalten) akzeptiert auch verknüpfte oder gleichgruppierte Qualifikationen mit ausreichendem Rang.
statusstringStatus des Dienstes, zum Beispiel geplant oder veröffentlicht.
published_atstring (date-time)Zeitpunkt, zu dem die Schicht veröffentlicht wurde.
descriptionstringBeschreibung der Schicht.
has_warningbooleanGespeichertes Konfliktkennzeichen für Listen-Badges - die konkreten Warnungen werden bei Bedarf berechnet (ShiftPlanHelper) und nur vorübergehend zurückgegeben.
availability_bookingBaseBooking13L35: die Verfügbarkeit, für die die veröffentlichte Schicht im Buchungsbereich steht (wird vom ShiftBookingSyncHelper synchron gehalten, solange die Synchronisation für den Vertrag aktiviert ist).
bookingBaseBooking13L35: der aus dieser Schicht erstellte Termin, falls vorhanden.
opened_reasonstringGrund, warum die Schicht für andere Mitarbeitende freigegeben wurde.
opened_atstring (date-time)Zeitpunkt, zu dem die Schicht geöffnet wurde.
opened_from_personCRMPerson10Wer die Schicht vor der Freigabe bearbeitet hat – die Zuweisung selbst ist entfallen, und die Planung muss wissen, wen sie fragen kann.
opened_absence_requestNonWorkTimeRequest5Die Abwesenheit, die ihn freigegeben hat, für OPENED_REASON_ABSENCE. Enthält Art und Tage, sodass die Planung „krank“ statt nur „jemand ist abwesend“ anzeigen kann.
lock_versionintegerOptimistische Sperre. Zwei Planer, die dieselbe Schicht bearbeiten, oder eine Wochenveröffentlichung, während jemand eine Schicht darin verschiebt, würden sonst stillschweigend einander überschreiben - der Unterlegene erhält jetzt einen 409. Nur lesend: Doctrine verwaltet den Wert, der Client sendet den zuletzt gesehenen Wert als Query-Parameter lock_version zurück.
createdstring (date-time)Zeitpunkt, zu dem der Datensatz angelegt wurde.
updatedstring (date-time)Zeitpunkt, zu dem der Datensatz zuletzt aktualisiert wurde.
shift_start_deviation_minutesintegerL38: Minuten, um die der reale Beginn vor (negativ) oder nach (positiv) dem geplanten Schichtbeginn liegt; null ohne Schicht.
shift_end_deviation_minutesintegerL38: Minuten, um die das reale Ende vor (negativ) oder nach (positiv) dem geplanten Schichtende liegt.
content_typestringArt der Tätigkeit, zum Beispiel Arbeit oder Training.
search_stringstringText, unter dem die Entität gesucht werden kann.
curl --request GET \
--url https://eure-instanz.iw-erp.de/api/time/current_own_workentry \
--header 'x-iw-jwt-token: <TOKEN>'const options = {method: 'GET', headers: {'x-iw-jwt-token': '<TOKEN>'}};
fetch('https://eure-instanz.iw-erp.de/api/time/current_own_workentry', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://eure-instanz.iw-erp.de/api/time/current_own_workentry"
headers = {"x-iw-jwt-token": "<TOKEN>"}
response = requests.get(url, headers=headers)
print(response.text)<?php
require_once('vendor/autoload.php');
$client = new \GuzzleHttp\Client();
$response = $client->request('GET', 'https://eure-instanz.iw-erp.de/api/time/current_own_workentry', [
'headers' => [
'x-iw-jwt-token' => '<TOKEN>',
],
]);
echo $response->getBody();using System.Net.Http.Headers;
var client = new HttpClient();
var request = new HttpRequestMessage
{
Method = HttpMethod.Get,
RequestUri = new Uri("https://eure-instanz.iw-erp.de/api/time/current_own_workentry"),
Headers =
{
{ "x-iw-jwt-token", "<TOKEN>" },
},
};
using (var response = await client.SendAsync(request))
{
response.EnsureSuccessStatusCode();
var body = await response.Content.ReadAsStringAsync();
Console.WriteLine(body);
}OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("https://eure-instanz.iw-erp.de/api/time/current_own_workentry")
.get()
.addHeader("x-iw-jwt-token", "<TOKEN>")
.build();
Response response = client.newCall(request).execute();package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://eure-instanz.iw-erp.de/api/time/current_own_workentry"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-iw-jwt-token", "<TOKEN>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}Dart mit dem Package iw_erp_api
import 'package:iw_erp_api/clients/time_tracking_work_time_entry_controller.dart';
import 'package:iw_erp_api/logic/iw_api_state.dart';
IwApiState().host = 'eure-instanz.iw-erp.de';
IwApiState().currentJwtApiToken = '<TOKEN>';
final result = await TimeTrackingWorkTimeEntryController.getOwnCurrentEntry();
if (result.success) {
print(result.data);
}{
"id": 42,
"description": "Text",
"user": {
"id": 42,
"name": "Beispiel",
"username": "lena.hartmann@example.org",
"email": "lena.hartmann@example.org",
"profile_picture_url": "https://vynst.de",
"positioningeneral": "string",
"crm_person": {
"id": 42,
"first_name": "Lena",
"last_name": "Hartmann",
"title": "Beispiel",
"language": "de",
"support_description": "Text",
"profile_picture_url": "https://vynst.de",
"address_street": "Jakobistr. 39",
"address_city": "Hannover",
"address_zip": "30163"
},
"archived": true,
"require2fa": true,
"search_string": "string"
},
"start": "2026-10-15T09:30:00+02:00",
"start_date": "2026-10-15T09:30:00+02:00",
"start_month": 1,
"start_year": 1,
"end": "2026-10-15T09:30:00+02:00",
"break_start": "2026-10-15T09:30:00+02:00",
"break_end": "2026-10-15T09:30:00+02:00"
}WorkTimeEntries nach Monat gruppiert für Benutzer oder Person abrufen
GET/api/time/work_entry_grouped/months
Antworten
200WorkTimeEntries nach Monat gruppiert für Benutzer oder Person abrufenarray<WorkTimeEntryGroupedMonth>
curl --request GET \
--url https://eure-instanz.iw-erp.de/api/time/work_entry_grouped/months \
--header 'x-iw-jwt-token: <TOKEN>'const options = {method: 'GET', headers: {'x-iw-jwt-token': '<TOKEN>'}};
fetch('https://eure-instanz.iw-erp.de/api/time/work_entry_grouped/months', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://eure-instanz.iw-erp.de/api/time/work_entry_grouped/months"
headers = {"x-iw-jwt-token": "<TOKEN>"}
response = requests.get(url, headers=headers)
print(response.text)<?php
require_once('vendor/autoload.php');
$client = new \GuzzleHttp\Client();
$response = $client->request('GET', 'https://eure-instanz.iw-erp.de/api/time/work_entry_grouped/months', [
'headers' => [
'x-iw-jwt-token' => '<TOKEN>',
],
]);
echo $response->getBody();using System.Net.Http.Headers;
var client = new HttpClient();
var request = new HttpRequestMessage
{
Method = HttpMethod.Get,
RequestUri = new Uri("https://eure-instanz.iw-erp.de/api/time/work_entry_grouped/months"),
Headers =
{
{ "x-iw-jwt-token", "<TOKEN>" },
},
};
using (var response = await client.SendAsync(request))
{
response.EnsureSuccessStatusCode();
var body = await response.Content.ReadAsStringAsync();
Console.WriteLine(body);
}OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("https://eure-instanz.iw-erp.de/api/time/work_entry_grouped/months")
.get()
.addHeader("x-iw-jwt-token", "<TOKEN>")
.build();
Response response = client.newCall(request).execute();package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://eure-instanz.iw-erp.de/api/time/work_entry_grouped/months"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-iw-jwt-token", "<TOKEN>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}Dart mit dem Package iw_erp_api
import 'package:iw_erp_api/clients/time_tracking_work_time_entry_grouped_controller.dart';
import 'package:iw_erp_api/logic/iw_api_state.dart';
IwApiState().host = 'eure-instanz.iw-erp.de';
IwApiState().currentJwtApiToken = '<TOKEN>';
final result = await TimeTrackingWorkTimeEntryGroupedController.getByMonths();
if (result.success) {
print(result.data);
}[
{}
]Eigene WorkTimeEntries nach Monat gruppiert abrufen
GET/api/time/work_entry_grouped/own_months
Antworten
200Eigene WorkTimeEntries nach Monat gruppiert abrufenarray<WorkTimeEntryGroupedMonth>
curl --request GET \
--url https://eure-instanz.iw-erp.de/api/time/work_entry_grouped/own_months \
--header 'x-iw-jwt-token: <TOKEN>'const options = {method: 'GET', headers: {'x-iw-jwt-token': '<TOKEN>'}};
fetch('https://eure-instanz.iw-erp.de/api/time/work_entry_grouped/own_months', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://eure-instanz.iw-erp.de/api/time/work_entry_grouped/own_months"
headers = {"x-iw-jwt-token": "<TOKEN>"}
response = requests.get(url, headers=headers)
print(response.text)<?php
require_once('vendor/autoload.php');
$client = new \GuzzleHttp\Client();
$response = $client->request('GET', 'https://eure-instanz.iw-erp.de/api/time/work_entry_grouped/own_months', [
'headers' => [
'x-iw-jwt-token' => '<TOKEN>',
],
]);
echo $response->getBody();using System.Net.Http.Headers;
var client = new HttpClient();
var request = new HttpRequestMessage
{
Method = HttpMethod.Get,
RequestUri = new Uri("https://eure-instanz.iw-erp.de/api/time/work_entry_grouped/own_months"),
Headers =
{
{ "x-iw-jwt-token", "<TOKEN>" },
},
};
using (var response = await client.SendAsync(request))
{
response.EnsureSuccessStatusCode();
var body = await response.Content.ReadAsStringAsync();
Console.WriteLine(body);
}OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("https://eure-instanz.iw-erp.de/api/time/work_entry_grouped/own_months")
.get()
.addHeader("x-iw-jwt-token", "<TOKEN>")
.build();
Response response = client.newCall(request).execute();package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://eure-instanz.iw-erp.de/api/time/work_entry_grouped/own_months"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-iw-jwt-token", "<TOKEN>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}Dart mit dem Package iw_erp_api
import 'package:iw_erp_api/clients/time_tracking_work_time_entry_grouped_controller.dart';
import 'package:iw_erp_api/logic/iw_api_state.dart';
IwApiState().host = 'eure-instanz.iw-erp.de';
IwApiState().currentJwtApiToken = '<TOKEN>';
final result = await TimeTrackingWorkTimeEntryGroupedController.getOwnByMonths();
if (result.success) {
print(result.data);
}[
{}
]WorkTimeEntries nach Datum gruppiert für Benutzer oder Person abrufen
GET/api/time/work_entry_grouped/dates
Antworten
200WorkTimeEntries nach Datum gruppiert für Benutzer oder Person abrufenarray<WorkTimeEntryGroupedDate>
curl --request GET \
--url https://eure-instanz.iw-erp.de/api/time/work_entry_grouped/dates \
--header 'x-iw-jwt-token: <TOKEN>'const options = {method: 'GET', headers: {'x-iw-jwt-token': '<TOKEN>'}};
fetch('https://eure-instanz.iw-erp.de/api/time/work_entry_grouped/dates', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://eure-instanz.iw-erp.de/api/time/work_entry_grouped/dates"
headers = {"x-iw-jwt-token": "<TOKEN>"}
response = requests.get(url, headers=headers)
print(response.text)<?php
require_once('vendor/autoload.php');
$client = new \GuzzleHttp\Client();
$response = $client->request('GET', 'https://eure-instanz.iw-erp.de/api/time/work_entry_grouped/dates', [
'headers' => [
'x-iw-jwt-token' => '<TOKEN>',
],
]);
echo $response->getBody();using System.Net.Http.Headers;
var client = new HttpClient();
var request = new HttpRequestMessage
{
Method = HttpMethod.Get,
RequestUri = new Uri("https://eure-instanz.iw-erp.de/api/time/work_entry_grouped/dates"),
Headers =
{
{ "x-iw-jwt-token", "<TOKEN>" },
},
};
using (var response = await client.SendAsync(request))
{
response.EnsureSuccessStatusCode();
var body = await response.Content.ReadAsStringAsync();
Console.WriteLine(body);
}OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("https://eure-instanz.iw-erp.de/api/time/work_entry_grouped/dates")
.get()
.addHeader("x-iw-jwt-token", "<TOKEN>")
.build();
Response response = client.newCall(request).execute();package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://eure-instanz.iw-erp.de/api/time/work_entry_grouped/dates"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-iw-jwt-token", "<TOKEN>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}Dart mit dem Package iw_erp_api
import 'package:iw_erp_api/clients/time_tracking_work_time_entry_grouped_controller.dart';
import 'package:iw_erp_api/logic/iw_api_state.dart';
IwApiState().host = 'eure-instanz.iw-erp.de';
IwApiState().currentJwtApiToken = '<TOKEN>';
final result = await TimeTrackingWorkTimeEntryGroupedController.getByDates();
if (result.success) {
print(result.data);
}[
{}
]Eigene WorkTimeEntries nach Datum gruppiert abrufen
GET/api/time/work_entry_grouped/own_dates
Antworten
200Eigene WorkTimeEntries nach Datum gruppiert abrufenarray<WorkTimeEntryGroupedDate>
curl --request GET \
--url https://eure-instanz.iw-erp.de/api/time/work_entry_grouped/own_dates \
--header 'x-iw-jwt-token: <TOKEN>'const options = {method: 'GET', headers: {'x-iw-jwt-token': '<TOKEN>'}};
fetch('https://eure-instanz.iw-erp.de/api/time/work_entry_grouped/own_dates', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://eure-instanz.iw-erp.de/api/time/work_entry_grouped/own_dates"
headers = {"x-iw-jwt-token": "<TOKEN>"}
response = requests.get(url, headers=headers)
print(response.text)<?php
require_once('vendor/autoload.php');
$client = new \GuzzleHttp\Client();
$response = $client->request('GET', 'https://eure-instanz.iw-erp.de/api/time/work_entry_grouped/own_dates', [
'headers' => [
'x-iw-jwt-token' => '<TOKEN>',
],
]);
echo $response->getBody();using System.Net.Http.Headers;
var client = new HttpClient();
var request = new HttpRequestMessage
{
Method = HttpMethod.Get,
RequestUri = new Uri("https://eure-instanz.iw-erp.de/api/time/work_entry_grouped/own_dates"),
Headers =
{
{ "x-iw-jwt-token", "<TOKEN>" },
},
};
using (var response = await client.SendAsync(request))
{
response.EnsureSuccessStatusCode();
var body = await response.Content.ReadAsStringAsync();
Console.WriteLine(body);
}OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("https://eure-instanz.iw-erp.de/api/time/work_entry_grouped/own_dates")
.get()
.addHeader("x-iw-jwt-token", "<TOKEN>")
.build();
Response response = client.newCall(request).execute();package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://eure-instanz.iw-erp.de/api/time/work_entry_grouped/own_dates"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-iw-jwt-token", "<TOKEN>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}Dart mit dem Package iw_erp_api
import 'package:iw_erp_api/clients/time_tracking_work_time_entry_grouped_controller.dart';
import 'package:iw_erp_api/logic/iw_api_state.dart';
IwApiState().host = 'eure-instanz.iw-erp.de';
IwApiState().currentJwtApiToken = '<TOKEN>';
final result = await TimeTrackingWorkTimeEntryGroupedController.getOwnByDates();
if (result.success) {
print(result.data);
}[
{}
]