WorkTimeEntry
Get all WorkTimeEntry
GET/api/time/workentries
Query parameters
searchStringstring | text to search for in the list |
orderFieldNamestring | name of the order field |
orderFieldSortstring | sorting modeAllowed: DESCASC |
pageinteger | page of the list |
pageSizeinteger | number of entries for each page |
withMaxPageNumberstring | returns the number of pages available as a header if this is set |
Responses
200Get all WorkTimeEntryarray<WorkTimeEntry>
Show fields (27)
idintegerPrimary key of the work time entry. Internal ID.
userUser14Login user who worked.
Show fields (10)
idintegerPrimary key of the user. Internal ID of the login user.
namestringDisplay name of the user. Shown in the UI and in audit entries.
usernamestringLogin name of the user. Must be unique across all users.
emailstringE-mail address of the user. Used for login notifications, password resets and as a login alias.
positioningeneralstringFree text describing the position or role of the user.
crm_personCRMPerson10CRM person linked to this login user. Connects the login account with the person record.
profile_picture_urlstringURL of the profile picture of the user.
archivedbooleanMarks the user as archived. Archived users are kept for history and are not active.
require2fabooleanTwo-factor authentication is required for this user.
search_stringstringText that the entity can be searched by.
descriptionstringDescription of the work.
startstring (date-time)Start of the work time.
start_datestringStart date of the work time as text.
start_monthintegerMonth of the start.
start_yearintegerYear of the start.
endstring (date-time)End of the work time.
break_startstring (date-time)Start of the break.
break_endstring (date-time)End of the break.
break_durationintegerduration of break in seconds
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_breakbooleanA break was added automatically.
force_no_breakbooleanNo break is added for this entry.
durationintegerduration in seconds
auto_closedbooleanThe entry was closed automatically.
has_warningbooleanThe entry has a warning, for example a missing end.
has_scanner_startbooleanThe start was recorded with the scanner.
has_scanner_endbooleanThe end was recorded with the scanner.
closed_editingbooleanEditing of the entry is closed.
closed_editing_hrbooleanEditing of the entry is closed for HR.
confirmedbooleanThe entry is confirmed.
shift_plan_entryShiftPlanEntry3L38: the shift this entry was clocked for. The entry keeps the real clock times; the link only says which planned shift they belong to.
Show fields (29)
opened_absence_typestringThe absence type as a plain label, so the planning can show "Krank" without pulling the whole request into every shift.
idintegerPrimary key of the shift plan entry. Internal ID.
userUser14Login user assigned to the shift.
personCRMPerson10Person assigned to the shift.
contractEmploymentContract5Contract the shift is planned on.
employment_contract_groupEmploymentContractGroupPlanning container - mandatory even when a person of another group helps out.
shift_typeShiftType5Origin type - times were copied, the reference is informational.
startstring (date-time)Start of the shift.
endstring (date-time)End of the shift.
start_datestringStart date of the shift as text.
start_monthintegerMonth of the shift.
start_yearintegerYear of the shift.
break_duration_secondsintegerBreak duration of the shift in seconds.
durationintegerTarget seconds: (end - start) - break, maintained by recalculate().
required_qualificationEmploymentQualification5Qualification required for the shift.
qualification_match_modestringL18: EXACT demands the required qualification itself; EQUIVALENT (default, previous behaviour) also accepts linked or same-group qualifications with sufficient ranking.
statusstringStatus of the shift, for example planned or published.
published_atstring (date-time)Time the shift was published.
descriptionstringDescription of the shift.
has_warningbooleanPersisted conflict flag for list badges - the concrete warnings are computed on demand (ShiftPlanHelper) and returned transiently.
availability_bookingBaseBooking13L35: the availability the published shift stands for in the booking area (kept in step by ShiftBookingSyncHelper while the sync is switched on for the contract).
bookingBaseBooking13L35: the appointment created from this shift, if any.
opened_reasonstringReason the shift was opened for other staff.
opened_atstring (date-time)Time the shift was opened.
opened_from_personCRMPerson10Who worked the shift before it became open - the assignment itself is gone, and the planning has to know whom to ask.
opened_absence_requestNonWorkTimeRequest5The absence that freed it, for OPENED_REASON_ABSENCE. Carries the type and the days, so the planning sees "sick" instead of only "somebody is away".
lock_versionintegerOptimistic lock. Two planners editing the same shift, or publishing a week while someone else moves a shift inside it, would otherwise silently overwrite each other - the loser now gets a 409 instead. Read only: Doctrine owns the value, the client echoes the one it last saw back as the lock_version query parameter.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
shift_start_deviation_minutesintegerL38: minutes the real start lies before (negative) or after (positive) the planned shift start; null without a shift.
shift_end_deviation_minutesintegerL38: minutes the real end lies before (negative) or after (positive) the planned shift end.
content_typestringType of the work, for example work or training.
search_stringstringText that the entity can be searched by.
curl --request GET \
--url https://your-instance.iw-erp.de/api/time/workentries \
--header 'x-iw-jwt-token: <TOKEN>'const options = {method: 'GET', headers: {'x-iw-jwt-token': '<TOKEN>'}};
fetch('https://your-instance.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://your-instance.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://your-instance.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://your-instance.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://your-instance.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://your-instance.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 with the iw_erp_api package
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 = 'your-instance.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"
}
]Create a single WorkTimeEntry
POST/api/time/workentries
Request body application/json
work_time_entryWorkTimeEntry2Show fields (9)
personCRMPerson36Person who worked.
contractEmploymentContract7Contract the work time is booked on.
descriptionstringDescription of the work.
startstring (date-time)Start of the work time.
endstring (date-time)End of the work time.
break_startstring (date-time)Start of the break.
break_endstring (date-time)End of the break.
force_no_breakbooleanNo break is added for this entry.
content_typestringType of the work, for example work or training.
Responses
200Create a single WorkTimeEntryWorkTimeEntry
Show fields (27)
idintegerPrimary key of the work time entry. Internal ID.
userUser14Login user who worked.
Show fields (10)
idintegerPrimary key of the user. Internal ID of the login user.
namestringDisplay name of the user. Shown in the UI and in audit entries.
usernamestringLogin name of the user. Must be unique across all users.
emailstringE-mail address of the user. Used for login notifications, password resets and as a login alias.
positioningeneralstringFree text describing the position or role of the user.
crm_personCRMPerson10CRM person linked to this login user. Connects the login account with the person record.
profile_picture_urlstringURL of the profile picture of the user.
archivedbooleanMarks the user as archived. Archived users are kept for history and are not active.
require2fabooleanTwo-factor authentication is required for this user.
search_stringstringText that the entity can be searched by.
descriptionstringDescription of the work.
startstring (date-time)Start of the work time.
start_datestringStart date of the work time as text.
start_monthintegerMonth of the start.
start_yearintegerYear of the start.
endstring (date-time)End of the work time.
break_startstring (date-time)Start of the break.
break_endstring (date-time)End of the break.
break_durationintegerduration of break in seconds
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_breakbooleanA break was added automatically.
force_no_breakbooleanNo break is added for this entry.
durationintegerduration in seconds
auto_closedbooleanThe entry was closed automatically.
has_warningbooleanThe entry has a warning, for example a missing end.
has_scanner_startbooleanThe start was recorded with the scanner.
has_scanner_endbooleanThe end was recorded with the scanner.
closed_editingbooleanEditing of the entry is closed.
closed_editing_hrbooleanEditing of the entry is closed for HR.
confirmedbooleanThe entry is confirmed.
shift_plan_entryShiftPlanEntry3L38: the shift this entry was clocked for. The entry keeps the real clock times; the link only says which planned shift they belong to.
Show fields (29)
opened_absence_typestringThe absence type as a plain label, so the planning can show "Krank" without pulling the whole request into every shift.
idintegerPrimary key of the shift plan entry. Internal ID.
userUser14Login user assigned to the shift.
personCRMPerson10Person assigned to the shift.
contractEmploymentContract5Contract the shift is planned on.
employment_contract_groupEmploymentContractGroupPlanning container - mandatory even when a person of another group helps out.
shift_typeShiftType5Origin type - times were copied, the reference is informational.
startstring (date-time)Start of the shift.
endstring (date-time)End of the shift.
start_datestringStart date of the shift as text.
start_monthintegerMonth of the shift.
start_yearintegerYear of the shift.
break_duration_secondsintegerBreak duration of the shift in seconds.
durationintegerTarget seconds: (end - start) - break, maintained by recalculate().
required_qualificationEmploymentQualification5Qualification required for the shift.
qualification_match_modestringL18: EXACT demands the required qualification itself; EQUIVALENT (default, previous behaviour) also accepts linked or same-group qualifications with sufficient ranking.
statusstringStatus of the shift, for example planned or published.
published_atstring (date-time)Time the shift was published.
descriptionstringDescription of the shift.
has_warningbooleanPersisted conflict flag for list badges - the concrete warnings are computed on demand (ShiftPlanHelper) and returned transiently.
availability_bookingBaseBooking13L35: the availability the published shift stands for in the booking area (kept in step by ShiftBookingSyncHelper while the sync is switched on for the contract).
bookingBaseBooking13L35: the appointment created from this shift, if any.
opened_reasonstringReason the shift was opened for other staff.
opened_atstring (date-time)Time the shift was opened.
opened_from_personCRMPerson10Who worked the shift before it became open - the assignment itself is gone, and the planning has to know whom to ask.
opened_absence_requestNonWorkTimeRequest5The absence that freed it, for OPENED_REASON_ABSENCE. Carries the type and the days, so the planning sees "sick" instead of only "somebody is away".
lock_versionintegerOptimistic lock. Two planners editing the same shift, or publishing a week while someone else moves a shift inside it, would otherwise silently overwrite each other - the loser now gets a 409 instead. Read only: Doctrine owns the value, the client echoes the one it last saw back as the lock_version query parameter.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
shift_start_deviation_minutesintegerL38: minutes the real start lies before (negative) or after (positive) the planned shift start; null without a shift.
shift_end_deviation_minutesintegerL38: minutes the real end lies before (negative) or after (positive) the planned shift end.
content_typestringType of the work, for example work or training.
search_stringstringText that the entity can be searched by.
curl --request POST \
--url https://your-instance.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://your-instance.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://your-instance.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://your-instance.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://your-instance.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://your-instance.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://your-instance.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 with the iw_erp_api package
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 = 'your-instance.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"
}Get a single WorkTimeEntry
GET/api/time/workentries/{id}
Path parameters
idrequiredstring |
Responses
200Get a single WorkTimeEntryWorkTimeEntry
Show fields (27)
idintegerPrimary key of the work time entry. Internal ID.
userUser14Login user who worked.
Show fields (10)
idintegerPrimary key of the user. Internal ID of the login user.
namestringDisplay name of the user. Shown in the UI and in audit entries.
usernamestringLogin name of the user. Must be unique across all users.
emailstringE-mail address of the user. Used for login notifications, password resets and as a login alias.
positioningeneralstringFree text describing the position or role of the user.
crm_personCRMPerson10CRM person linked to this login user. Connects the login account with the person record.
profile_picture_urlstringURL of the profile picture of the user.
archivedbooleanMarks the user as archived. Archived users are kept for history and are not active.
require2fabooleanTwo-factor authentication is required for this user.
search_stringstringText that the entity can be searched by.
descriptionstringDescription of the work.
startstring (date-time)Start of the work time.
start_datestringStart date of the work time as text.
start_monthintegerMonth of the start.
start_yearintegerYear of the start.
endstring (date-time)End of the work time.
break_startstring (date-time)Start of the break.
break_endstring (date-time)End of the break.
break_durationintegerduration of break in seconds
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_breakbooleanA break was added automatically.
force_no_breakbooleanNo break is added for this entry.
durationintegerduration in seconds
auto_closedbooleanThe entry was closed automatically.
has_warningbooleanThe entry has a warning, for example a missing end.
has_scanner_startbooleanThe start was recorded with the scanner.
has_scanner_endbooleanThe end was recorded with the scanner.
closed_editingbooleanEditing of the entry is closed.
closed_editing_hrbooleanEditing of the entry is closed for HR.
confirmedbooleanThe entry is confirmed.
shift_plan_entryShiftPlanEntry3L38: the shift this entry was clocked for. The entry keeps the real clock times; the link only says which planned shift they belong to.
Show fields (29)
opened_absence_typestringThe absence type as a plain label, so the planning can show "Krank" without pulling the whole request into every shift.
idintegerPrimary key of the shift plan entry. Internal ID.
userUser14Login user assigned to the shift.
personCRMPerson10Person assigned to the shift.
contractEmploymentContract5Contract the shift is planned on.
employment_contract_groupEmploymentContractGroupPlanning container - mandatory even when a person of another group helps out.
shift_typeShiftType5Origin type - times were copied, the reference is informational.
startstring (date-time)Start of the shift.
endstring (date-time)End of the shift.
start_datestringStart date of the shift as text.
start_monthintegerMonth of the shift.
start_yearintegerYear of the shift.
break_duration_secondsintegerBreak duration of the shift in seconds.
durationintegerTarget seconds: (end - start) - break, maintained by recalculate().
required_qualificationEmploymentQualification5Qualification required for the shift.
qualification_match_modestringL18: EXACT demands the required qualification itself; EQUIVALENT (default, previous behaviour) also accepts linked or same-group qualifications with sufficient ranking.
statusstringStatus of the shift, for example planned or published.
published_atstring (date-time)Time the shift was published.
descriptionstringDescription of the shift.
has_warningbooleanPersisted conflict flag for list badges - the concrete warnings are computed on demand (ShiftPlanHelper) and returned transiently.
availability_bookingBaseBooking13L35: the availability the published shift stands for in the booking area (kept in step by ShiftBookingSyncHelper while the sync is switched on for the contract).
bookingBaseBooking13L35: the appointment created from this shift, if any.
opened_reasonstringReason the shift was opened for other staff.
opened_atstring (date-time)Time the shift was opened.
opened_from_personCRMPerson10Who worked the shift before it became open - the assignment itself is gone, and the planning has to know whom to ask.
opened_absence_requestNonWorkTimeRequest5The absence that freed it, for OPENED_REASON_ABSENCE. Carries the type and the days, so the planning sees "sick" instead of only "somebody is away".
lock_versionintegerOptimistic lock. Two planners editing the same shift, or publishing a week while someone else moves a shift inside it, would otherwise silently overwrite each other - the loser now gets a 409 instead. Read only: Doctrine owns the value, the client echoes the one it last saw back as the lock_version query parameter.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
shift_start_deviation_minutesintegerL38: minutes the real start lies before (negative) or after (positive) the planned shift start; null without a shift.
shift_end_deviation_minutesintegerL38: minutes the real end lies before (negative) or after (positive) the planned shift end.
content_typestringType of the work, for example work or training.
search_stringstringText that the entity can be searched by.
curl --request GET \
--url https://your-instance.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://your-instance.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://your-instance.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://your-instance.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://your-instance.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://your-instance.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://your-instance.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 with the iw_erp_api package
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 = 'your-instance.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"
}Update a single WorkTimeEntry
PUT/api/time/workentries/{id}
Path parameters
idrequiredstring |
Request body application/json
work_time_entryWorkTimeEntry2Show fields (9)
personCRMPerson36Person who worked.
contractEmploymentContract7Contract the work time is booked on.
descriptionstringDescription of the work.
startstring (date-time)Start of the work time.
endstring (date-time)End of the work time.
break_startstring (date-time)Start of the break.
break_endstring (date-time)End of the break.
force_no_breakbooleanNo break is added for this entry.
content_typestringType of the work, for example work or training.
Responses
200Update a single WorkTimeEntryWorkTimeEntry
Show fields (27)
idintegerPrimary key of the work time entry. Internal ID.
userUser14Login user who worked.
Show fields (10)
idintegerPrimary key of the user. Internal ID of the login user.
namestringDisplay name of the user. Shown in the UI and in audit entries.
usernamestringLogin name of the user. Must be unique across all users.
emailstringE-mail address of the user. Used for login notifications, password resets and as a login alias.
positioningeneralstringFree text describing the position or role of the user.
crm_personCRMPerson10CRM person linked to this login user. Connects the login account with the person record.
profile_picture_urlstringURL of the profile picture of the user.
archivedbooleanMarks the user as archived. Archived users are kept for history and are not active.
require2fabooleanTwo-factor authentication is required for this user.
search_stringstringText that the entity can be searched by.
descriptionstringDescription of the work.
startstring (date-time)Start of the work time.
start_datestringStart date of the work time as text.
start_monthintegerMonth of the start.
start_yearintegerYear of the start.
endstring (date-time)End of the work time.
break_startstring (date-time)Start of the break.
break_endstring (date-time)End of the break.
break_durationintegerduration of break in seconds
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_breakbooleanA break was added automatically.
force_no_breakbooleanNo break is added for this entry.
durationintegerduration in seconds
auto_closedbooleanThe entry was closed automatically.
has_warningbooleanThe entry has a warning, for example a missing end.
has_scanner_startbooleanThe start was recorded with the scanner.
has_scanner_endbooleanThe end was recorded with the scanner.
closed_editingbooleanEditing of the entry is closed.
closed_editing_hrbooleanEditing of the entry is closed for HR.
confirmedbooleanThe entry is confirmed.
shift_plan_entryShiftPlanEntry3L38: the shift this entry was clocked for. The entry keeps the real clock times; the link only says which planned shift they belong to.
Show fields (29)
opened_absence_typestringThe absence type as a plain label, so the planning can show "Krank" without pulling the whole request into every shift.
idintegerPrimary key of the shift plan entry. Internal ID.
userUser14Login user assigned to the shift.
personCRMPerson10Person assigned to the shift.
contractEmploymentContract5Contract the shift is planned on.
employment_contract_groupEmploymentContractGroupPlanning container - mandatory even when a person of another group helps out.
shift_typeShiftType5Origin type - times were copied, the reference is informational.
startstring (date-time)Start of the shift.
endstring (date-time)End of the shift.
start_datestringStart date of the shift as text.
start_monthintegerMonth of the shift.
start_yearintegerYear of the shift.
break_duration_secondsintegerBreak duration of the shift in seconds.
durationintegerTarget seconds: (end - start) - break, maintained by recalculate().
required_qualificationEmploymentQualification5Qualification required for the shift.
qualification_match_modestringL18: EXACT demands the required qualification itself; EQUIVALENT (default, previous behaviour) also accepts linked or same-group qualifications with sufficient ranking.
statusstringStatus of the shift, for example planned or published.
published_atstring (date-time)Time the shift was published.
descriptionstringDescription of the shift.
has_warningbooleanPersisted conflict flag for list badges - the concrete warnings are computed on demand (ShiftPlanHelper) and returned transiently.
availability_bookingBaseBooking13L35: the availability the published shift stands for in the booking area (kept in step by ShiftBookingSyncHelper while the sync is switched on for the contract).
bookingBaseBooking13L35: the appointment created from this shift, if any.
opened_reasonstringReason the shift was opened for other staff.
opened_atstring (date-time)Time the shift was opened.
opened_from_personCRMPerson10Who worked the shift before it became open - the assignment itself is gone, and the planning has to know whom to ask.
opened_absence_requestNonWorkTimeRequest5The absence that freed it, for OPENED_REASON_ABSENCE. Carries the type and the days, so the planning sees "sick" instead of only "somebody is away".
lock_versionintegerOptimistic lock. Two planners editing the same shift, or publishing a week while someone else moves a shift inside it, would otherwise silently overwrite each other - the loser now gets a 409 instead. Read only: Doctrine owns the value, the client echoes the one it last saw back as the lock_version query parameter.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
shift_start_deviation_minutesintegerL38: minutes the real start lies before (negative) or after (positive) the planned shift start; null without a shift.
shift_end_deviation_minutesintegerL38: minutes the real end lies before (negative) or after (positive) the planned shift end.
content_typestringType of the work, for example work or training.
search_stringstringText that the entity can be searched by.
curl --request PUT \
--url https://your-instance.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://your-instance.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://your-instance.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://your-instance.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://your-instance.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://your-instance.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://your-instance.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 with the iw_erp_api package
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 = 'your-instance.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"
}Update a single WorkTimeEntry
PATCH/api/time/workentries/{id}
Path parameters
idrequiredstring |
Request body application/json
work_time_entryWorkTimeEntry2Show fields (9)
personCRMPerson36Person who worked.
contractEmploymentContract7Contract the work time is booked on.
descriptionstringDescription of the work.
startstring (date-time)Start of the work time.
endstring (date-time)End of the work time.
break_startstring (date-time)Start of the break.
break_endstring (date-time)End of the break.
force_no_breakbooleanNo break is added for this entry.
content_typestringType of the work, for example work or training.
Responses
200Update a single WorkTimeEntryWorkTimeEntry
Show fields (27)
idintegerPrimary key of the work time entry. Internal ID.
userUser14Login user who worked.
Show fields (10)
idintegerPrimary key of the user. Internal ID of the login user.
namestringDisplay name of the user. Shown in the UI and in audit entries.
usernamestringLogin name of the user. Must be unique across all users.
emailstringE-mail address of the user. Used for login notifications, password resets and as a login alias.
positioningeneralstringFree text describing the position or role of the user.
crm_personCRMPerson10CRM person linked to this login user. Connects the login account with the person record.
profile_picture_urlstringURL of the profile picture of the user.
archivedbooleanMarks the user as archived. Archived users are kept for history and are not active.
require2fabooleanTwo-factor authentication is required for this user.
search_stringstringText that the entity can be searched by.
descriptionstringDescription of the work.
startstring (date-time)Start of the work time.
start_datestringStart date of the work time as text.
start_monthintegerMonth of the start.
start_yearintegerYear of the start.
endstring (date-time)End of the work time.
break_startstring (date-time)Start of the break.
break_endstring (date-time)End of the break.
break_durationintegerduration of break in seconds
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_breakbooleanA break was added automatically.
force_no_breakbooleanNo break is added for this entry.
durationintegerduration in seconds
auto_closedbooleanThe entry was closed automatically.
has_warningbooleanThe entry has a warning, for example a missing end.
has_scanner_startbooleanThe start was recorded with the scanner.
has_scanner_endbooleanThe end was recorded with the scanner.
closed_editingbooleanEditing of the entry is closed.
closed_editing_hrbooleanEditing of the entry is closed for HR.
confirmedbooleanThe entry is confirmed.
shift_plan_entryShiftPlanEntry3L38: the shift this entry was clocked for. The entry keeps the real clock times; the link only says which planned shift they belong to.
Show fields (29)
opened_absence_typestringThe absence type as a plain label, so the planning can show "Krank" without pulling the whole request into every shift.
idintegerPrimary key of the shift plan entry. Internal ID.
userUser14Login user assigned to the shift.
personCRMPerson10Person assigned to the shift.
contractEmploymentContract5Contract the shift is planned on.
employment_contract_groupEmploymentContractGroupPlanning container - mandatory even when a person of another group helps out.
shift_typeShiftType5Origin type - times were copied, the reference is informational.
startstring (date-time)Start of the shift.
endstring (date-time)End of the shift.
start_datestringStart date of the shift as text.
start_monthintegerMonth of the shift.
start_yearintegerYear of the shift.
break_duration_secondsintegerBreak duration of the shift in seconds.
durationintegerTarget seconds: (end - start) - break, maintained by recalculate().
required_qualificationEmploymentQualification5Qualification required for the shift.
qualification_match_modestringL18: EXACT demands the required qualification itself; EQUIVALENT (default, previous behaviour) also accepts linked or same-group qualifications with sufficient ranking.
statusstringStatus of the shift, for example planned or published.
published_atstring (date-time)Time the shift was published.
descriptionstringDescription of the shift.
has_warningbooleanPersisted conflict flag for list badges - the concrete warnings are computed on demand (ShiftPlanHelper) and returned transiently.
availability_bookingBaseBooking13L35: the availability the published shift stands for in the booking area (kept in step by ShiftBookingSyncHelper while the sync is switched on for the contract).
bookingBaseBooking13L35: the appointment created from this shift, if any.
opened_reasonstringReason the shift was opened for other staff.
opened_atstring (date-time)Time the shift was opened.
opened_from_personCRMPerson10Who worked the shift before it became open - the assignment itself is gone, and the planning has to know whom to ask.
opened_absence_requestNonWorkTimeRequest5The absence that freed it, for OPENED_REASON_ABSENCE. Carries the type and the days, so the planning sees "sick" instead of only "somebody is away".
lock_versionintegerOptimistic lock. Two planners editing the same shift, or publishing a week while someone else moves a shift inside it, would otherwise silently overwrite each other - the loser now gets a 409 instead. Read only: Doctrine owns the value, the client echoes the one it last saw back as the lock_version query parameter.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
shift_start_deviation_minutesintegerL38: minutes the real start lies before (negative) or after (positive) the planned shift start; null without a shift.
shift_end_deviation_minutesintegerL38: minutes the real end lies before (negative) or after (positive) the planned shift end.
content_typestringType of the work, for example work or training.
search_stringstringText that the entity can be searched by.
curl --request PATCH \
--url https://your-instance.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://your-instance.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://your-instance.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://your-instance.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://your-instance.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://your-instance.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://your-instance.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 with the iw_erp_api package
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 = 'your-instance.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"
}Delete a single WorkTimeEntry
DELETE/api/time/workentries/{id}
Path parameters
idrequiredstring |
Responses
200Delete a single WorkTimeEntryWorkTimeEntry
Show fields (27)
idintegerPrimary key of the work time entry. Internal ID.
userUser14Login user who worked.
Show fields (10)
idintegerPrimary key of the user. Internal ID of the login user.
namestringDisplay name of the user. Shown in the UI and in audit entries.
usernamestringLogin name of the user. Must be unique across all users.
emailstringE-mail address of the user. Used for login notifications, password resets and as a login alias.
positioningeneralstringFree text describing the position or role of the user.
crm_personCRMPerson10CRM person linked to this login user. Connects the login account with the person record.
profile_picture_urlstringURL of the profile picture of the user.
archivedbooleanMarks the user as archived. Archived users are kept for history and are not active.
require2fabooleanTwo-factor authentication is required for this user.
search_stringstringText that the entity can be searched by.
descriptionstringDescription of the work.
startstring (date-time)Start of the work time.
start_datestringStart date of the work time as text.
start_monthintegerMonth of the start.
start_yearintegerYear of the start.
endstring (date-time)End of the work time.
break_startstring (date-time)Start of the break.
break_endstring (date-time)End of the break.
break_durationintegerduration of break in seconds
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_breakbooleanA break was added automatically.
force_no_breakbooleanNo break is added for this entry.
durationintegerduration in seconds
auto_closedbooleanThe entry was closed automatically.
has_warningbooleanThe entry has a warning, for example a missing end.
has_scanner_startbooleanThe start was recorded with the scanner.
has_scanner_endbooleanThe end was recorded with the scanner.
closed_editingbooleanEditing of the entry is closed.
closed_editing_hrbooleanEditing of the entry is closed for HR.
confirmedbooleanThe entry is confirmed.
shift_plan_entryShiftPlanEntry3L38: the shift this entry was clocked for. The entry keeps the real clock times; the link only says which planned shift they belong to.
Show fields (29)
opened_absence_typestringThe absence type as a plain label, so the planning can show "Krank" without pulling the whole request into every shift.
idintegerPrimary key of the shift plan entry. Internal ID.
userUser14Login user assigned to the shift.
personCRMPerson10Person assigned to the shift.
contractEmploymentContract5Contract the shift is planned on.
employment_contract_groupEmploymentContractGroupPlanning container - mandatory even when a person of another group helps out.
shift_typeShiftType5Origin type - times were copied, the reference is informational.
startstring (date-time)Start of the shift.
endstring (date-time)End of the shift.
start_datestringStart date of the shift as text.
start_monthintegerMonth of the shift.
start_yearintegerYear of the shift.
break_duration_secondsintegerBreak duration of the shift in seconds.
durationintegerTarget seconds: (end - start) - break, maintained by recalculate().
required_qualificationEmploymentQualification5Qualification required for the shift.
qualification_match_modestringL18: EXACT demands the required qualification itself; EQUIVALENT (default, previous behaviour) also accepts linked or same-group qualifications with sufficient ranking.
statusstringStatus of the shift, for example planned or published.
published_atstring (date-time)Time the shift was published.
descriptionstringDescription of the shift.
has_warningbooleanPersisted conflict flag for list badges - the concrete warnings are computed on demand (ShiftPlanHelper) and returned transiently.
availability_bookingBaseBooking13L35: the availability the published shift stands for in the booking area (kept in step by ShiftBookingSyncHelper while the sync is switched on for the contract).
bookingBaseBooking13L35: the appointment created from this shift, if any.
opened_reasonstringReason the shift was opened for other staff.
opened_atstring (date-time)Time the shift was opened.
opened_from_personCRMPerson10Who worked the shift before it became open - the assignment itself is gone, and the planning has to know whom to ask.
opened_absence_requestNonWorkTimeRequest5The absence that freed it, for OPENED_REASON_ABSENCE. Carries the type and the days, so the planning sees "sick" instead of only "somebody is away".
lock_versionintegerOptimistic lock. Two planners editing the same shift, or publishing a week while someone else moves a shift inside it, would otherwise silently overwrite each other - the loser now gets a 409 instead. Read only: Doctrine owns the value, the client echoes the one it last saw back as the lock_version query parameter.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
shift_start_deviation_minutesintegerL38: minutes the real start lies before (negative) or after (positive) the planned shift start; null without a shift.
shift_end_deviation_minutesintegerL38: minutes the real end lies before (negative) or after (positive) the planned shift end.
content_typestringType of the work, for example work or training.
search_stringstringText that the entity can be searched by.
curl --request DELETE \
--url https://your-instance.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://your-instance.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://your-instance.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://your-instance.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://your-instance.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://your-instance.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://your-instance.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 with the iw_erp_api package
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 = 'your-instance.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"
}Get the current own WorkTimeEntry
GET/api/time/current_own_workentry
Responses
200Get the current own WorkTimeEntryWorkTimeEntry
Show fields (27)
idintegerPrimary key of the work time entry. Internal ID.
userUser14Login user who worked.
Show fields (10)
idintegerPrimary key of the user. Internal ID of the login user.
namestringDisplay name of the user. Shown in the UI and in audit entries.
usernamestringLogin name of the user. Must be unique across all users.
emailstringE-mail address of the user. Used for login notifications, password resets and as a login alias.
positioningeneralstringFree text describing the position or role of the user.
crm_personCRMPerson10CRM person linked to this login user. Connects the login account with the person record.
profile_picture_urlstringURL of the profile picture of the user.
archivedbooleanMarks the user as archived. Archived users are kept for history and are not active.
require2fabooleanTwo-factor authentication is required for this user.
search_stringstringText that the entity can be searched by.
descriptionstringDescription of the work.
startstring (date-time)Start of the work time.
start_datestringStart date of the work time as text.
start_monthintegerMonth of the start.
start_yearintegerYear of the start.
endstring (date-time)End of the work time.
break_startstring (date-time)Start of the break.
break_endstring (date-time)End of the break.
break_durationintegerduration of break in seconds
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_breakbooleanA break was added automatically.
force_no_breakbooleanNo break is added for this entry.
durationintegerduration in seconds
auto_closedbooleanThe entry was closed automatically.
has_warningbooleanThe entry has a warning, for example a missing end.
has_scanner_startbooleanThe start was recorded with the scanner.
has_scanner_endbooleanThe end was recorded with the scanner.
closed_editingbooleanEditing of the entry is closed.
closed_editing_hrbooleanEditing of the entry is closed for HR.
confirmedbooleanThe entry is confirmed.
shift_plan_entryShiftPlanEntry3L38: the shift this entry was clocked for. The entry keeps the real clock times; the link only says which planned shift they belong to.
Show fields (29)
opened_absence_typestringThe absence type as a plain label, so the planning can show "Krank" without pulling the whole request into every shift.
idintegerPrimary key of the shift plan entry. Internal ID.
userUser14Login user assigned to the shift.
personCRMPerson10Person assigned to the shift.
contractEmploymentContract5Contract the shift is planned on.
employment_contract_groupEmploymentContractGroupPlanning container - mandatory even when a person of another group helps out.
shift_typeShiftType5Origin type - times were copied, the reference is informational.
startstring (date-time)Start of the shift.
endstring (date-time)End of the shift.
start_datestringStart date of the shift as text.
start_monthintegerMonth of the shift.
start_yearintegerYear of the shift.
break_duration_secondsintegerBreak duration of the shift in seconds.
durationintegerTarget seconds: (end - start) - break, maintained by recalculate().
required_qualificationEmploymentQualification5Qualification required for the shift.
qualification_match_modestringL18: EXACT demands the required qualification itself; EQUIVALENT (default, previous behaviour) also accepts linked or same-group qualifications with sufficient ranking.
statusstringStatus of the shift, for example planned or published.
published_atstring (date-time)Time the shift was published.
descriptionstringDescription of the shift.
has_warningbooleanPersisted conflict flag for list badges - the concrete warnings are computed on demand (ShiftPlanHelper) and returned transiently.
availability_bookingBaseBooking13L35: the availability the published shift stands for in the booking area (kept in step by ShiftBookingSyncHelper while the sync is switched on for the contract).
bookingBaseBooking13L35: the appointment created from this shift, if any.
opened_reasonstringReason the shift was opened for other staff.
opened_atstring (date-time)Time the shift was opened.
opened_from_personCRMPerson10Who worked the shift before it became open - the assignment itself is gone, and the planning has to know whom to ask.
opened_absence_requestNonWorkTimeRequest5The absence that freed it, for OPENED_REASON_ABSENCE. Carries the type and the days, so the planning sees "sick" instead of only "somebody is away".
lock_versionintegerOptimistic lock. Two planners editing the same shift, or publishing a week while someone else moves a shift inside it, would otherwise silently overwrite each other - the loser now gets a 409 instead. Read only: Doctrine owns the value, the client echoes the one it last saw back as the lock_version query parameter.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
shift_start_deviation_minutesintegerL38: minutes the real start lies before (negative) or after (positive) the planned shift start; null without a shift.
shift_end_deviation_minutesintegerL38: minutes the real end lies before (negative) or after (positive) the planned shift end.
content_typestringType of the work, for example work or training.
search_stringstringText that the entity can be searched by.
curl --request GET \
--url https://your-instance.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://your-instance.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://your-instance.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://your-instance.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://your-instance.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://your-instance.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://your-instance.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 with the iw_erp_api package
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 = 'your-instance.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"
}Get WorkTimeEntries grouped by month for user or person
GET/api/time/work_entry_grouped/months
Responses
200Get WorkTimeEntries grouped by month for user or personarray<WorkTimeEntryGroupedMonth>
curl --request GET \
--url https://your-instance.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://your-instance.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://your-instance.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://your-instance.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://your-instance.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://your-instance.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://your-instance.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 with the iw_erp_api package
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 = 'your-instance.iw-erp.de';
IwApiState().currentJwtApiToken = '<TOKEN>';
final result = await TimeTrackingWorkTimeEntryGroupedController.getByMonths();
if (result.success) {
print(result.data);
}[
{}
]Get own WorkTimeEntries grouped by month
GET/api/time/work_entry_grouped/own_months
Responses
200Get own WorkTimeEntries grouped by montharray<WorkTimeEntryGroupedMonth>
curl --request GET \
--url https://your-instance.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://your-instance.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://your-instance.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://your-instance.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://your-instance.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://your-instance.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://your-instance.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 with the iw_erp_api package
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 = 'your-instance.iw-erp.de';
IwApiState().currentJwtApiToken = '<TOKEN>';
final result = await TimeTrackingWorkTimeEntryGroupedController.getOwnByMonths();
if (result.success) {
print(result.data);
}[
{}
]Get WorkTimeEntries grouped by date for user or person
GET/api/time/work_entry_grouped/dates
Responses
200Get WorkTimeEntries grouped by date for user or personarray<WorkTimeEntryGroupedDate>
curl --request GET \
--url https://your-instance.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://your-instance.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://your-instance.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://your-instance.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://your-instance.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://your-instance.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://your-instance.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 with the iw_erp_api package
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 = 'your-instance.iw-erp.de';
IwApiState().currentJwtApiToken = '<TOKEN>';
final result = await TimeTrackingWorkTimeEntryGroupedController.getByDates();
if (result.success) {
print(result.data);
}[
{}
]Get own WorkTimeEntries grouped by date
GET/api/time/work_entry_grouped/own_dates
Responses
200Get own WorkTimeEntries grouped by datearray<WorkTimeEntryGroupedDate>
curl --request GET \
--url https://your-instance.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://your-instance.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://your-instance.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://your-instance.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://your-instance.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://your-instance.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://your-instance.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 with the iw_erp_api package
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 = 'your-instance.iw-erp.de';
IwApiState().currentJwtApiToken = '<TOKEN>';
final result = await TimeTrackingWorkTimeEntryGroupedController.getOwnByDates();
if (result.success) {
print(result.data);
}[
{}
]