NonWorkTimeRequest
The approved request as a printable document
GET/api/time/non_work_time_request/{id}/pdf
The paper rule the digital request replaced still ends on paper: the approved request goes back to the team lead, and the employee gets a printout on request. Withdrawn days are named as withdrawn rather than merely missing - the rules ask for exactly that.
Path parameters
idrequiredstring |
Responses
200PDF of the absence request
curl --request GET \
--url https://your-instance.iw-erp.de/api/time/non_work_time_request/42/pdf \
--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/non_work_time_request/42/pdf', 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/non_work_time_request/42/pdf"
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/non_work_time_request/42/pdf', [
'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/non_work_time_request/42/pdf"),
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/non_work_time_request/42/pdf")
.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/non_work_time_request/42/pdf"
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_non_work_time_request_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 TimeTrackingNonWorkTimeRequestController.getDownloadLinkPdf('42');
print(result);Get all NonWorkTimeRequest
GET/api/time/non_work_time_request
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 NonWorkTimeRequestarray<NonWorkTimeRequest>
Show fields (35)
overduebooleanU04: still waiting after the processing deadline.
approval_versionintegerVersion of the approval process.
change_modestringMode of a change to the request.
balance_override_reasonstringL11: why a planner approved this request although the projected vacation balance was negative.
coverage_override_reasonstringL54: why the approver accepted a day below the minimum staffing.
coverage_hintbooleanL53: handed in although it eats into the staffing buffer - the approvers see the hint.
sick_during_vacationbooleanU13: a sick report inside approved vacation - set by the server, shown as "während Urlaub".
consultation_notestringWho was consulted before requesting days a blocking period marks as consultation-only (U14).
daily_absence_start_timestringLocal daily absence window for half-day types; null preserves legacy planning.
daily_absence_end_timestringEnd time of daily absence.
idintegerPrimary key of the request. Internal ID.
userUser14User the request belongs to.
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 request.
startstring (date-time)Start of the requested period.
start_datestringStart date of the requested period.
start_monthintegerStart month of the requested period.
start_yearintegerStart year of the requested period.
endstring (date-time)End of the requested period.
end_datestringEnd date of the requested period.
end_monthintegerEnd month of the requested period.
end_yearintegerEnd year of the requested period.
durationnumber (float)duration in days linked to NonWorkTimePlan - a half day type counts 0.5 (Z6)
statusstringStatus of the request.
content_typestringType of the request, e.g. vacation or absence.
secondary_content_typestringSecondary type of the request.
linked_content_typeNonWorkTimePlanSelectionType3Plan selection type linked to the request.
Show fields (15)
effective_colorstringThe colour to show: the configured one, else the default of the type.
namestringName of the absence type, for example vacation or sick leave.
valueintegerNumeric value of the absence type.
priorityintegerPriority of the absence type when several types overlap.
processed_content_typestringContent type used when the absence is processed.
secondary_content_type_optionsstringOptions for the secondary content type, separated by a comma
iconstringIcon of the absence type.
is_vacationbooleanThe absence type counts as vacation.
is_sickbooleanThe absence type counts as sick leave.
status_change_requires_hr_approvalbooleanChanging the status of this absence type requires HR approval.
selectable_for_requestbooleanWhether a new absence request may be created with this type. Types that only describe a day in an overview - holiday, school holiday, work day - are not offered in the editors.
requires_management_approvalbooleanRequests of this type need a final written decision by the management (the organization leadership), appended after the regular approval chain (U10).
max_days_per_requestintegerUpper limit of calendar days one request of this type may cover; null = unlimited.
colorstringR5: colour of this absence type in the shift plan and the team calendar ("#RRGGBB"); null = the default of the type (getEffectiveColor). Used with absence_type_colors_enabled.
deletedbooleanThis property is used to mark an entity as deleted / archived
parent_requestNonWorkTimeRequestThe request this one changes ("Änderungsantrag zum Jahresurlaub"). A change request is an ordinary request in every other respect; the reference is what turns a second, unrelated looking request into a visible correction of the first - and what lets the days it withdraws be marked as withdrawn instead of merely refused.
annual_requestNonWorkTimeAnnualRequest4L47/L48: the annual plan ("Jahresurlaubsantrag") this period belongs to. The bundle is decided as a whole; the period stays an ordinary request in every other respect.
Show fields (9)
idintegerPrimary key of the annual request. Internal ID.
userUser14User the annual request belongs to.
personCRMPerson10Person the annual request belongs to.
yearintegerThe vacation year the periods belong to.
content_typeintegerAbsence type of every period (NonWorkTimePlanSelectionType value).
descriptionstringDescription of the annual request.
statusstringDerived from the periods, see class comment.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
request_kindstringU02/U18: ANNUAL = period of the annual plan, SUPPLEMENT = Ergänzungsantrag for the held back flexible days. null = ordinary request.
processing_due_datestring (date-time)U04/U20: the day by which the request has to be decided, counted from its receipt.
escalated_atstring (date-time)U04: when the overdue escalation was sent; null = not (yet) escalated.
written_approval_reasonstringU21: why the management step with a written comment was added to this request (e.g. SUMMER_CANCELLATION); null = no extra written approval needed.
search_stringstringText that the entity can be searched by.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
curl --request GET \
--url https://your-instance.iw-erp.de/api/time/non_work_time_request \
--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/non_work_time_request', 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/non_work_time_request"
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/non_work_time_request', [
'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/non_work_time_request"),
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/non_work_time_request")
.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/non_work_time_request"
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_non_work_time_request_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 TimeTrackingNonWorkTimeRequestController.getAll();
if (result.success) {
print(result.data);
}[
{
"id": 42,
"description": "Text",
"overdue": true,
"approval_version": 1,
"change_mode": "string",
"balance_override_reason": "string",
"coverage_override_reason": "string",
"coverage_hint": true,
"sick_during_vacation": true,
"consultation_note": "string"
}
]Create a single NonWorkTimeRequest
POST/api/time/non_work_time_request
Request body application/json
dataNonWorkTimeRequest2Show fields (17)
change_modestringMode of a change to the request.
daily_absence_start_timestringLocal daily absence window for half-day types; null preserves legacy planning.
daily_absence_end_timestringEnd time of daily absence.
personCRMPerson37Person the request belongs to.
contractEmploymentContract8Employment contract the request belongs to.
descriptionstringDescription of the request.
startstring (date-time)Start of the requested period.
endstring (date-time)End of the requested period.
statusstringStatus of the request.
content_typestringType of the request, e.g. vacation or absence.
secondary_content_typestringSecondary type of the request.
attachmentsarray<Attachment12>Attachments of the request.
commentsarray<NonWorkTimeRequestComment3>Comments on the request.
plan_entriesarray<NonWorkTimePlan>Plan entries generated for the request.
parent_requestNonWorkTimeRequest2The request this one changes ("Änderungsantrag zum Jahresurlaub"). A change request is an ordinary request in every other respect; the reference is what turns a second, unrelated looking request into a visible correction of the first - and what lets the days it withdraws be marked as withdrawn instead of merely refused.
annual_requestNonWorkTimeAnnualRequest5L47/L48: the annual plan ("Jahresurlaubsantrag") this period belongs to. The bundle is decided as a whole; the period stays an ordinary request in every other respect.
request_kindstringU02/U18: ANNUAL = period of the annual plan, SUPPLEMENT = Ergänzungsantrag for the held back flexible days. null = ordinary request.
Responses
200Create a single NonWorkTimeRequestNonWorkTimeRequest3
Show fields (39)
overduebooleanU04: still waiting after the processing deadline.
approval_versionintegerVersion of the approval process.
change_modestringMode of a change to the request.
balance_override_reasonstringL11: why a planner approved this request although the projected vacation balance was negative.
coverage_override_reasonstringL54: why the approver accepted a day below the minimum staffing.
coverage_hintbooleanL53: handed in although it eats into the staffing buffer - the approvers see the hint.
sick_during_vacationbooleanU13: a sick report inside approved vacation - set by the server, shown as "während Urlaub".
consultation_notestringWho was consulted before requesting days a blocking period marks as consultation-only (U14).
daily_absence_start_timestringLocal daily absence window for half-day types; null preserves legacy planning.
daily_absence_end_timestringEnd time of daily absence.
idintegerPrimary key of the request. Internal ID.
userUser14User the request belongs to.
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.
contractEmploymentContract9Employment contract the request belongs to.
Show fields (43)
staged_absence_approvalbooleannull inherits group then organization policy; existing installations stay off.
idintegerPrimary key of the employment contract. Internal ID.
tokenstringPublic token of the contract. Used instead of the ID.
userUser14Login user of the employee.
week_total_hoursnumber (float)Total working hours per week.
week_total_daysnumber (float)Total working days per week.
reserved_hours_preparationnumber (float)L03: weekly hours reserved for Vorbereitung - part of the contract hours but not plannable in the shift plan. null = none.
reserved_hours_follow_upnumber (float)L03: weekly hours reserved for Nachbereitung - part of the contract hours but not plannable in the shift plan. null = none.
reserved_hours_travelnumber (float)L03: weekly hours reserved for Fahrt - part of the contract hours but not plannable in the shift plan. null = none.
reserved_hours_flexiblenumber (float)L03: weekly hours reserved for freie Einteilung - part of the contract hours but not plannable in the shift plan. null = none.
week_full_time_total_daysnumber (float)Total working days per week for a full-time contract.
year_vacation_daysnumber (float)Vacation days per year.
month_vacation_daysnumber (float)Vacation days per month.
year_vacation_weeksnumber (float)Vacation weeks per year.
monday_hoursnumber (float)Working hours on Monday.
tuesday_hoursnumber (float)Working hours on Tuesday.
wednesday_hoursnumber (float)Working hours on Wednesday.
thursday_hoursnumber (float)Working hours on Thursday.
friday_hoursnumber (float)Working hours on Friday.
saturday_hoursnumber (float)Working hours on Saturday.
sunday_hoursnumber (float)Working hours on Sunday.
netto_hour_costnumber (float)Net cost per hour.
brutto_hour_costnumber (float)Gross cost per hour.
startstring (date-time)Start date of the contract.
endstring (date-time)End date of the contract.
fixed_term_statusstringBefristung: PERMANENT (unbefristet, default), FIXED_TERM or EXTENDED (FIXED_TERM_STATUS_*).
fixed_term_endstring (date-time)Befristet bis (erster Zeitraum).
fixed_term_extension_endstring (date-time)Befristet bis nach Verlängerung.
probation_endstring (date-time)Probezeit bis; filled from the template's probationMonths when a contract is created without it.
numberstringContract number.
descriptionstringDescription of the contract.
archivedbooleanThe contract is archived.
allow_app_time_trackingbooleanThe employee may track time in the app.
allow_scanner_time_trackingbooleanThe employee may track time with the scanner.
allow_app_non_work_time_managementbooleanThe employee may manage absences in the app.
force_no_auto_breakbooleanAutomatic breaks are not added for this contract.
work_time_modestringHow the target working time is defined - null behaves as WEEKDAY_HOURS so existing contracts keep their previous behaviour unchanged.
holiday_credit_modestringHoliday credit for WEEK_TOTAL contracts - null behaves as WEEKDAY_TARGET (previous behaviour, only meaningful for WEEKDAY_HOURS contracts).
holiday_credit_fixed_secondsintegerFixed holiday credit in seconds.
planning_weekdays_bitmaskintegerISO weekday bitmask (Mo=1 ... So=64) of the days this WEEK_TOTAL contract can be planned / takes vacation on - null behaves as Mo-Fr.
request_lead_time_daysintegerDays an absence request has to be handed in ahead of its first day ("Bearbeitungs- frist"). null falls back to the contract group and from there to the installation wide setting, so an existing contract keeps behaving exactly as before.
shift_booking_syncbooleanL35: shifts as availabilities / appointments in the booking area; null inherits the group (which inherits the organisation).
search_stringstringText that the entity can be searched by.
descriptionstringDescription of the request.
startstring (date-time)Start of the requested period.
start_datestringStart date of the requested period.
start_monthintegerStart month of the requested period.
start_yearintegerStart year of the requested period.
endstring (date-time)End of the requested period.
end_datestringEnd date of the requested period.
end_monthintegerEnd month of the requested period.
end_yearintegerEnd year of the requested period.
durationnumber (float)duration in days linked to NonWorkTimePlan - a half day type counts 0.5 (Z6)
statusstringStatus of the request.
content_typestringType of the request, e.g. vacation or absence.
secondary_content_typestringSecondary type of the request.
linked_content_typeNonWorkTimePlanSelectionType3Plan selection type linked to the request.
Show fields (15)
effective_colorstringThe colour to show: the configured one, else the default of the type.
namestringName of the absence type, for example vacation or sick leave.
valueintegerNumeric value of the absence type.
priorityintegerPriority of the absence type when several types overlap.
processed_content_typestringContent type used when the absence is processed.
secondary_content_type_optionsstringOptions for the secondary content type, separated by a comma
iconstringIcon of the absence type.
is_vacationbooleanThe absence type counts as vacation.
is_sickbooleanThe absence type counts as sick leave.
status_change_requires_hr_approvalbooleanChanging the status of this absence type requires HR approval.
selectable_for_requestbooleanWhether a new absence request may be created with this type. Types that only describe a day in an overview - holiday, school holiday, work day - are not offered in the editors.
requires_management_approvalbooleanRequests of this type need a final written decision by the management (the organization leadership), appended after the regular approval chain (U10).
max_days_per_requestintegerUpper limit of calendar days one request of this type may cover; null = unlimited.
colorstringR5: colour of this absence type in the shift plan and the team calendar ("#RRGGBB"); null = the default of the type (getEffectiveColor). Used with absence_type_colors_enabled.
deletedbooleanThis property is used to mark an entity as deleted / archived
attachmentsarray<Attachment10>Attachments of the request.
Show fields (25)
idintegerPrimary key of the attachment. Internal ID.
filenamestringOriginal file name.
filesizestringSize of the file in bytes.
mimetypestringMIME type of the file.
createdbyusernamestringName of the user who uploaded the file, as text.
createdstring (date-time)Point in time the attachment was created.
googleidstringID of the file in Google Drive.
scopestringScope that controls who can see the attachment.
ocr_document_typestringDocument type recognized by OCR.
ocr_from_namestringSender name recognized by OCR.
ocr_from_companystringSender company recognized by OCR.
ocr_from_addressstringSender address recognized by OCR.
ocr_from_emailstringSender e-mail address recognized by OCR.
ocr_from_phonestringSender phone number recognized by OCR.
ocr_to_namestringRecipient name recognized by OCR.
ocr_to_companystringRecipient company recognized by OCR.
ocr_to_addressstringRecipient address recognized by OCR.
ocr_to_emailstringRecipient e-mail address recognized by OCR.
ocr_to_phonestringRecipient phone number recognized by OCR.
ocr_summarystringSummary of the document created by OCR.
ocr_statusstringOCR processing status: null=not processed, pending, processing, done, error
ocr_errorstringReason of the last failed or incomplete OCR run, null when it went through
ocr_processed_atstring (date-time)Point in time OCR processing finished.
virus_checkedboolean1 once the virus scan has passed for this file. The scan runs in the background (AttachmentVirusScanCommand), so a freshly uploaded file starts at 0 and stays there until it was really checked. An infected file never reaches 1 - it is deleted instead. UIs use this to decide whether a file may be handed to a user, so it must stay false until proven otherwise.
virus_checked_atstring (date-time)When the virus scan passed. Null while the file is still waiting.
commentsarray<NonWorkTimeRequestComment4>Comments on the request.
Show fields (5)
idintegerPrimary key of the absence request comment. Internal ID.
userUser14Login user who wrote the comment.
descriptionstringText of the comment.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
plan_entriesarray<NonWorkTimePlan2>Plan entries generated for the request.
Show fields (1)
idintegerPrimary key of the absence plan entry. Internal ID.
parent_requestNonWorkTimeRequest3The request this one changes ("Änderungsantrag zum Jahresurlaub"). A change request is an ordinary request in every other respect; the reference is what turns a second, unrelated looking request into a visible correction of the first - and what lets the days it withdraws be marked as withdrawn instead of merely refused.
annual_requestNonWorkTimeAnnualRequest6L47/L48: the annual plan ("Jahresurlaubsantrag") this period belongs to. The bundle is decided as a whole; the period stays an ordinary request in every other respect.
Show fields (9)
idintegerPrimary key of the annual request. Internal ID.
userUser14User the annual request belongs to.
personCRMPerson10Person the annual request belongs to.
yearintegerThe vacation year the periods belong to.
content_typeintegerAbsence type of every period (NonWorkTimePlanSelectionType value).
descriptionstringDescription of the annual request.
statusstringDerived from the periods, see class comment.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
request_kindstringU02/U18: ANNUAL = period of the annual plan, SUPPLEMENT = Ergänzungsantrag for the held back flexible days. null = ordinary request.
processing_due_datestring (date-time)U04/U20: the day by which the request has to be decided, counted from its receipt.
escalated_atstring (date-time)U04: when the overdue escalation was sent; null = not (yet) escalated.
written_approval_reasonstringU21: why the management step with a written comment was added to this request (e.g. SUMMER_CANCELLATION); null = no extra written approval needed.
search_stringstringText that the entity can be searched by.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
curl --request POST \
--url https://your-instance.iw-erp.de/api/time/non_work_time_request \
--header 'content-type: application/json' \
--header 'x-iw-jwt-token: <TOKEN>' \
--data '
{
"data": {
"description": "Text",
"change_mode": "string",
"daily_absence_start_time": "string",
"daily_absence_end_time": "string",
"start": "2026-10-15T09:30:00+02:00",
"end": "2026-10-15T09:30:00+02:00"
}
}
'const options = {
method: 'POST',
headers: {'x-iw-jwt-token': '<TOKEN>', 'content-type': 'application/json'},
body: JSON.stringify({
data: {
description: 'Text',
change_mode: 'string',
daily_absence_start_time: 'string',
daily_absence_end_time: 'string',
start: '2026-10-15T09:30:00+02:00',
end: '2026-10-15T09:30:00+02:00'
}
})
};
fetch('https://your-instance.iw-erp.de/api/time/non_work_time_request', 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/non_work_time_request"
payload = { "data": {
"description": "Text",
"change_mode": "string",
"daily_absence_start_time": "string",
"daily_absence_end_time": "string",
"start": "2026-10-15T09:30:00+02:00",
"end": "2026-10-15T09:30:00+02:00"
} }
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/non_work_time_request', [
'body' => '{"data":{"description":"Text","change_mode":"string","daily_absence_start_time":"string","daily_absence_end_time":"string","start":"2026-10-15T09:30:00+02:00","end":"2026-10-15T09:30:00+02:00"}}',
'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/non_work_time_request"),
Headers =
{
{ "x-iw-jwt-token", "<TOKEN>" },
},
Content = new StringContent("{\"data\":{\"description\":\"Text\",\"change_mode\":\"string\",\"daily_absence_start_time\":\"string\",\"daily_absence_end_time\":\"string\",\"start\":\"2026-10-15T09:30:00+02:00\",\"end\":\"2026-10-15T09:30:00+02:00\"}}")
{
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, "{\"data\":{\"description\":\"Text\",\"change_mode\":\"string\",\"daily_absence_start_time\":\"string\",\"daily_absence_end_time\":\"string\",\"start\":\"2026-10-15T09:30:00+02:00\",\"end\":\"2026-10-15T09:30:00+02:00\"}}");
Request request = new Request.Builder()
.url("https://your-instance.iw-erp.de/api/time/non_work_time_request")
.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/non_work_time_request"
payload := strings.NewReader("{\"data\":{\"description\":\"Text\",\"change_mode\":\"string\",\"daily_absence_start_time\":\"string\",\"daily_absence_end_time\":\"string\",\"start\":\"2026-10-15T09:30:00+02:00\",\"end\":\"2026-10-15T09:30:00+02:00\"}}")
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_non_work_time_request_controller.dart';
import 'package:iw_erp_api/logic/iw_api_state.dart';
import 'package:iw_erp_api/model/time_tracking_non_work_time_request.dart';
IwApiState().host = 'your-instance.iw-erp.de';
IwApiState().currentJwtApiToken = '<TOKEN>';
final result = await TimeTrackingNonWorkTimeRequestController.post(TimeTrackingNonWorkTimeRequest.fromJson({
"description": "Text",
"change_mode": "string",
"daily_absence_start_time": "string",
"daily_absence_end_time": "string",
"start": "2026-10-15T09:30:00+02:00",
"end": "2026-10-15T09:30:00+02:00"
}));
if (result.success) {
print(result.data);
}{
"id": 42,
"description": "Text",
"overdue": true,
"approval_version": 1,
"change_mode": "string",
"balance_override_reason": "string",
"coverage_override_reason": "string",
"coverage_hint": true,
"sick_during_vacation": true,
"consultation_note": "string"
}Get a single NonWorkTimeRequest
GET/api/time/non_work_time_request/{id}
Path parameters
idrequiredstring |
Responses
200Get a single NonWorkTimeRequestNonWorkTimeRequest3
Show fields (39)
overduebooleanU04: still waiting after the processing deadline.
approval_versionintegerVersion of the approval process.
change_modestringMode of a change to the request.
balance_override_reasonstringL11: why a planner approved this request although the projected vacation balance was negative.
coverage_override_reasonstringL54: why the approver accepted a day below the minimum staffing.
coverage_hintbooleanL53: handed in although it eats into the staffing buffer - the approvers see the hint.
sick_during_vacationbooleanU13: a sick report inside approved vacation - set by the server, shown as "während Urlaub".
consultation_notestringWho was consulted before requesting days a blocking period marks as consultation-only (U14).
daily_absence_start_timestringLocal daily absence window for half-day types; null preserves legacy planning.
daily_absence_end_timestringEnd time of daily absence.
idintegerPrimary key of the request. Internal ID.
userUser14User the request belongs to.
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.
contractEmploymentContract9Employment contract the request belongs to.
Show fields (43)
staged_absence_approvalbooleannull inherits group then organization policy; existing installations stay off.
idintegerPrimary key of the employment contract. Internal ID.
tokenstringPublic token of the contract. Used instead of the ID.
userUser14Login user of the employee.
week_total_hoursnumber (float)Total working hours per week.
week_total_daysnumber (float)Total working days per week.
reserved_hours_preparationnumber (float)L03: weekly hours reserved for Vorbereitung - part of the contract hours but not plannable in the shift plan. null = none.
reserved_hours_follow_upnumber (float)L03: weekly hours reserved for Nachbereitung - part of the contract hours but not plannable in the shift plan. null = none.
reserved_hours_travelnumber (float)L03: weekly hours reserved for Fahrt - part of the contract hours but not plannable in the shift plan. null = none.
reserved_hours_flexiblenumber (float)L03: weekly hours reserved for freie Einteilung - part of the contract hours but not plannable in the shift plan. null = none.
week_full_time_total_daysnumber (float)Total working days per week for a full-time contract.
year_vacation_daysnumber (float)Vacation days per year.
month_vacation_daysnumber (float)Vacation days per month.
year_vacation_weeksnumber (float)Vacation weeks per year.
monday_hoursnumber (float)Working hours on Monday.
tuesday_hoursnumber (float)Working hours on Tuesday.
wednesday_hoursnumber (float)Working hours on Wednesday.
thursday_hoursnumber (float)Working hours on Thursday.
friday_hoursnumber (float)Working hours on Friday.
saturday_hoursnumber (float)Working hours on Saturday.
sunday_hoursnumber (float)Working hours on Sunday.
netto_hour_costnumber (float)Net cost per hour.
brutto_hour_costnumber (float)Gross cost per hour.
startstring (date-time)Start date of the contract.
endstring (date-time)End date of the contract.
fixed_term_statusstringBefristung: PERMANENT (unbefristet, default), FIXED_TERM or EXTENDED (FIXED_TERM_STATUS_*).
fixed_term_endstring (date-time)Befristet bis (erster Zeitraum).
fixed_term_extension_endstring (date-time)Befristet bis nach Verlängerung.
probation_endstring (date-time)Probezeit bis; filled from the template's probationMonths when a contract is created without it.
numberstringContract number.
descriptionstringDescription of the contract.
archivedbooleanThe contract is archived.
allow_app_time_trackingbooleanThe employee may track time in the app.
allow_scanner_time_trackingbooleanThe employee may track time with the scanner.
allow_app_non_work_time_managementbooleanThe employee may manage absences in the app.
force_no_auto_breakbooleanAutomatic breaks are not added for this contract.
work_time_modestringHow the target working time is defined - null behaves as WEEKDAY_HOURS so existing contracts keep their previous behaviour unchanged.
holiday_credit_modestringHoliday credit for WEEK_TOTAL contracts - null behaves as WEEKDAY_TARGET (previous behaviour, only meaningful for WEEKDAY_HOURS contracts).
holiday_credit_fixed_secondsintegerFixed holiday credit in seconds.
planning_weekdays_bitmaskintegerISO weekday bitmask (Mo=1 ... So=64) of the days this WEEK_TOTAL contract can be planned / takes vacation on - null behaves as Mo-Fr.
request_lead_time_daysintegerDays an absence request has to be handed in ahead of its first day ("Bearbeitungs- frist"). null falls back to the contract group and from there to the installation wide setting, so an existing contract keeps behaving exactly as before.
shift_booking_syncbooleanL35: shifts as availabilities / appointments in the booking area; null inherits the group (which inherits the organisation).
search_stringstringText that the entity can be searched by.
descriptionstringDescription of the request.
startstring (date-time)Start of the requested period.
start_datestringStart date of the requested period.
start_monthintegerStart month of the requested period.
start_yearintegerStart year of the requested period.
endstring (date-time)End of the requested period.
end_datestringEnd date of the requested period.
end_monthintegerEnd month of the requested period.
end_yearintegerEnd year of the requested period.
durationnumber (float)duration in days linked to NonWorkTimePlan - a half day type counts 0.5 (Z6)
statusstringStatus of the request.
content_typestringType of the request, e.g. vacation or absence.
secondary_content_typestringSecondary type of the request.
linked_content_typeNonWorkTimePlanSelectionType3Plan selection type linked to the request.
Show fields (15)
effective_colorstringThe colour to show: the configured one, else the default of the type.
namestringName of the absence type, for example vacation or sick leave.
valueintegerNumeric value of the absence type.
priorityintegerPriority of the absence type when several types overlap.
processed_content_typestringContent type used when the absence is processed.
secondary_content_type_optionsstringOptions for the secondary content type, separated by a comma
iconstringIcon of the absence type.
is_vacationbooleanThe absence type counts as vacation.
is_sickbooleanThe absence type counts as sick leave.
status_change_requires_hr_approvalbooleanChanging the status of this absence type requires HR approval.
selectable_for_requestbooleanWhether a new absence request may be created with this type. Types that only describe a day in an overview - holiday, school holiday, work day - are not offered in the editors.
requires_management_approvalbooleanRequests of this type need a final written decision by the management (the organization leadership), appended after the regular approval chain (U10).
max_days_per_requestintegerUpper limit of calendar days one request of this type may cover; null = unlimited.
colorstringR5: colour of this absence type in the shift plan and the team calendar ("#RRGGBB"); null = the default of the type (getEffectiveColor). Used with absence_type_colors_enabled.
deletedbooleanThis property is used to mark an entity as deleted / archived
attachmentsarray<Attachment10>Attachments of the request.
Show fields (25)
idintegerPrimary key of the attachment. Internal ID.
filenamestringOriginal file name.
filesizestringSize of the file in bytes.
mimetypestringMIME type of the file.
createdbyusernamestringName of the user who uploaded the file, as text.
createdstring (date-time)Point in time the attachment was created.
googleidstringID of the file in Google Drive.
scopestringScope that controls who can see the attachment.
ocr_document_typestringDocument type recognized by OCR.
ocr_from_namestringSender name recognized by OCR.
ocr_from_companystringSender company recognized by OCR.
ocr_from_addressstringSender address recognized by OCR.
ocr_from_emailstringSender e-mail address recognized by OCR.
ocr_from_phonestringSender phone number recognized by OCR.
ocr_to_namestringRecipient name recognized by OCR.
ocr_to_companystringRecipient company recognized by OCR.
ocr_to_addressstringRecipient address recognized by OCR.
ocr_to_emailstringRecipient e-mail address recognized by OCR.
ocr_to_phonestringRecipient phone number recognized by OCR.
ocr_summarystringSummary of the document created by OCR.
ocr_statusstringOCR processing status: null=not processed, pending, processing, done, error
ocr_errorstringReason of the last failed or incomplete OCR run, null when it went through
ocr_processed_atstring (date-time)Point in time OCR processing finished.
virus_checkedboolean1 once the virus scan has passed for this file. The scan runs in the background (AttachmentVirusScanCommand), so a freshly uploaded file starts at 0 and stays there until it was really checked. An infected file never reaches 1 - it is deleted instead. UIs use this to decide whether a file may be handed to a user, so it must stay false until proven otherwise.
virus_checked_atstring (date-time)When the virus scan passed. Null while the file is still waiting.
commentsarray<NonWorkTimeRequestComment4>Comments on the request.
Show fields (5)
idintegerPrimary key of the absence request comment. Internal ID.
userUser14Login user who wrote the comment.
descriptionstringText of the comment.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
plan_entriesarray<NonWorkTimePlan2>Plan entries generated for the request.
Show fields (1)
idintegerPrimary key of the absence plan entry. Internal ID.
parent_requestNonWorkTimeRequest3The request this one changes ("Änderungsantrag zum Jahresurlaub"). A change request is an ordinary request in every other respect; the reference is what turns a second, unrelated looking request into a visible correction of the first - and what lets the days it withdraws be marked as withdrawn instead of merely refused.
annual_requestNonWorkTimeAnnualRequest6L47/L48: the annual plan ("Jahresurlaubsantrag") this period belongs to. The bundle is decided as a whole; the period stays an ordinary request in every other respect.
Show fields (9)
idintegerPrimary key of the annual request. Internal ID.
userUser14User the annual request belongs to.
personCRMPerson10Person the annual request belongs to.
yearintegerThe vacation year the periods belong to.
content_typeintegerAbsence type of every period (NonWorkTimePlanSelectionType value).
descriptionstringDescription of the annual request.
statusstringDerived from the periods, see class comment.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
request_kindstringU02/U18: ANNUAL = period of the annual plan, SUPPLEMENT = Ergänzungsantrag for the held back flexible days. null = ordinary request.
processing_due_datestring (date-time)U04/U20: the day by which the request has to be decided, counted from its receipt.
escalated_atstring (date-time)U04: when the overdue escalation was sent; null = not (yet) escalated.
written_approval_reasonstringU21: why the management step with a written comment was added to this request (e.g. SUMMER_CANCELLATION); null = no extra written approval needed.
search_stringstringText that the entity can be searched by.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
curl --request GET \
--url https://your-instance.iw-erp.de/api/time/non_work_time_request/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/non_work_time_request/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/non_work_time_request/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/non_work_time_request/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/non_work_time_request/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/non_work_time_request/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/non_work_time_request/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_non_work_time_request_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 TimeTrackingNonWorkTimeRequestController.get('42');
if (result.success) {
print(result.data);
}{
"id": 42,
"description": "Text",
"overdue": true,
"approval_version": 1,
"change_mode": "string",
"balance_override_reason": "string",
"coverage_override_reason": "string",
"coverage_hint": true,
"sick_during_vacation": true,
"consultation_note": "string"
}Update a single NonWorkTimeRequest
PUT/api/time/non_work_time_request/{id}
Path parameters
idrequiredstring |
Query parameters
actionstring | CANCEL_OWN withdraws an own pending request without binding body fieldsAllowed: CANCEL_OWN |
approval_versioninteger | Displayed request version; required for CANCEL_OWN and staged decisions |
approval_commentstring | Written decision of the current approval step; mandatory for the management (Geschäftsleitung) step |
balance_override_reasonstring | L11: reason for approving although the projected year-end vacation balance is negative; required when non_work_time_negative_balance_override_required is on |
coverage_override_reasonstring | L54: reason for approving although a day drops below the minimum staffing; required when staffing_coverage_override_reason_required is on |
Request body application/json
dataNonWorkTimeRequest2Show fields (17)
change_modestringMode of a change to the request.
daily_absence_start_timestringLocal daily absence window for half-day types; null preserves legacy planning.
daily_absence_end_timestringEnd time of daily absence.
personCRMPerson37Person the request belongs to.
contractEmploymentContract8Employment contract the request belongs to.
descriptionstringDescription of the request.
startstring (date-time)Start of the requested period.
endstring (date-time)End of the requested period.
statusstringStatus of the request.
content_typestringType of the request, e.g. vacation or absence.
secondary_content_typestringSecondary type of the request.
attachmentsarray<Attachment12>Attachments of the request.
commentsarray<NonWorkTimeRequestComment3>Comments on the request.
plan_entriesarray<NonWorkTimePlan>Plan entries generated for the request.
parent_requestNonWorkTimeRequest2The request this one changes ("Änderungsantrag zum Jahresurlaub"). A change request is an ordinary request in every other respect; the reference is what turns a second, unrelated looking request into a visible correction of the first - and what lets the days it withdraws be marked as withdrawn instead of merely refused.
annual_requestNonWorkTimeAnnualRequest5L47/L48: the annual plan ("Jahresurlaubsantrag") this period belongs to. The bundle is decided as a whole; the period stays an ordinary request in every other respect.
request_kindstringU02/U18: ANNUAL = period of the annual plan, SUPPLEMENT = Ergänzungsantrag for the held back flexible days. null = ordinary request.
Responses
200Update a single NonWorkTimeRequestNonWorkTimeRequest3
Show fields (39)
overduebooleanU04: still waiting after the processing deadline.
approval_versionintegerVersion of the approval process.
change_modestringMode of a change to the request.
balance_override_reasonstringL11: why a planner approved this request although the projected vacation balance was negative.
coverage_override_reasonstringL54: why the approver accepted a day below the minimum staffing.
coverage_hintbooleanL53: handed in although it eats into the staffing buffer - the approvers see the hint.
sick_during_vacationbooleanU13: a sick report inside approved vacation - set by the server, shown as "während Urlaub".
consultation_notestringWho was consulted before requesting days a blocking period marks as consultation-only (U14).
daily_absence_start_timestringLocal daily absence window for half-day types; null preserves legacy planning.
daily_absence_end_timestringEnd time of daily absence.
idintegerPrimary key of the request. Internal ID.
userUser14User the request belongs to.
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.
contractEmploymentContract9Employment contract the request belongs to.
Show fields (43)
staged_absence_approvalbooleannull inherits group then organization policy; existing installations stay off.
idintegerPrimary key of the employment contract. Internal ID.
tokenstringPublic token of the contract. Used instead of the ID.
userUser14Login user of the employee.
week_total_hoursnumber (float)Total working hours per week.
week_total_daysnumber (float)Total working days per week.
reserved_hours_preparationnumber (float)L03: weekly hours reserved for Vorbereitung - part of the contract hours but not plannable in the shift plan. null = none.
reserved_hours_follow_upnumber (float)L03: weekly hours reserved for Nachbereitung - part of the contract hours but not plannable in the shift plan. null = none.
reserved_hours_travelnumber (float)L03: weekly hours reserved for Fahrt - part of the contract hours but not plannable in the shift plan. null = none.
reserved_hours_flexiblenumber (float)L03: weekly hours reserved for freie Einteilung - part of the contract hours but not plannable in the shift plan. null = none.
week_full_time_total_daysnumber (float)Total working days per week for a full-time contract.
year_vacation_daysnumber (float)Vacation days per year.
month_vacation_daysnumber (float)Vacation days per month.
year_vacation_weeksnumber (float)Vacation weeks per year.
monday_hoursnumber (float)Working hours on Monday.
tuesday_hoursnumber (float)Working hours on Tuesday.
wednesday_hoursnumber (float)Working hours on Wednesday.
thursday_hoursnumber (float)Working hours on Thursday.
friday_hoursnumber (float)Working hours on Friday.
saturday_hoursnumber (float)Working hours on Saturday.
sunday_hoursnumber (float)Working hours on Sunday.
netto_hour_costnumber (float)Net cost per hour.
brutto_hour_costnumber (float)Gross cost per hour.
startstring (date-time)Start date of the contract.
endstring (date-time)End date of the contract.
fixed_term_statusstringBefristung: PERMANENT (unbefristet, default), FIXED_TERM or EXTENDED (FIXED_TERM_STATUS_*).
fixed_term_endstring (date-time)Befristet bis (erster Zeitraum).
fixed_term_extension_endstring (date-time)Befristet bis nach Verlängerung.
probation_endstring (date-time)Probezeit bis; filled from the template's probationMonths when a contract is created without it.
numberstringContract number.
descriptionstringDescription of the contract.
archivedbooleanThe contract is archived.
allow_app_time_trackingbooleanThe employee may track time in the app.
allow_scanner_time_trackingbooleanThe employee may track time with the scanner.
allow_app_non_work_time_managementbooleanThe employee may manage absences in the app.
force_no_auto_breakbooleanAutomatic breaks are not added for this contract.
work_time_modestringHow the target working time is defined - null behaves as WEEKDAY_HOURS so existing contracts keep their previous behaviour unchanged.
holiday_credit_modestringHoliday credit for WEEK_TOTAL contracts - null behaves as WEEKDAY_TARGET (previous behaviour, only meaningful for WEEKDAY_HOURS contracts).
holiday_credit_fixed_secondsintegerFixed holiday credit in seconds.
planning_weekdays_bitmaskintegerISO weekday bitmask (Mo=1 ... So=64) of the days this WEEK_TOTAL contract can be planned / takes vacation on - null behaves as Mo-Fr.
request_lead_time_daysintegerDays an absence request has to be handed in ahead of its first day ("Bearbeitungs- frist"). null falls back to the contract group and from there to the installation wide setting, so an existing contract keeps behaving exactly as before.
shift_booking_syncbooleanL35: shifts as availabilities / appointments in the booking area; null inherits the group (which inherits the organisation).
search_stringstringText that the entity can be searched by.
descriptionstringDescription of the request.
startstring (date-time)Start of the requested period.
start_datestringStart date of the requested period.
start_monthintegerStart month of the requested period.
start_yearintegerStart year of the requested period.
endstring (date-time)End of the requested period.
end_datestringEnd date of the requested period.
end_monthintegerEnd month of the requested period.
end_yearintegerEnd year of the requested period.
durationnumber (float)duration in days linked to NonWorkTimePlan - a half day type counts 0.5 (Z6)
statusstringStatus of the request.
content_typestringType of the request, e.g. vacation or absence.
secondary_content_typestringSecondary type of the request.
linked_content_typeNonWorkTimePlanSelectionType3Plan selection type linked to the request.
Show fields (15)
effective_colorstringThe colour to show: the configured one, else the default of the type.
namestringName of the absence type, for example vacation or sick leave.
valueintegerNumeric value of the absence type.
priorityintegerPriority of the absence type when several types overlap.
processed_content_typestringContent type used when the absence is processed.
secondary_content_type_optionsstringOptions for the secondary content type, separated by a comma
iconstringIcon of the absence type.
is_vacationbooleanThe absence type counts as vacation.
is_sickbooleanThe absence type counts as sick leave.
status_change_requires_hr_approvalbooleanChanging the status of this absence type requires HR approval.
selectable_for_requestbooleanWhether a new absence request may be created with this type. Types that only describe a day in an overview - holiday, school holiday, work day - are not offered in the editors.
requires_management_approvalbooleanRequests of this type need a final written decision by the management (the organization leadership), appended after the regular approval chain (U10).
max_days_per_requestintegerUpper limit of calendar days one request of this type may cover; null = unlimited.
colorstringR5: colour of this absence type in the shift plan and the team calendar ("#RRGGBB"); null = the default of the type (getEffectiveColor). Used with absence_type_colors_enabled.
deletedbooleanThis property is used to mark an entity as deleted / archived
attachmentsarray<Attachment10>Attachments of the request.
Show fields (25)
idintegerPrimary key of the attachment. Internal ID.
filenamestringOriginal file name.
filesizestringSize of the file in bytes.
mimetypestringMIME type of the file.
createdbyusernamestringName of the user who uploaded the file, as text.
createdstring (date-time)Point in time the attachment was created.
googleidstringID of the file in Google Drive.
scopestringScope that controls who can see the attachment.
ocr_document_typestringDocument type recognized by OCR.
ocr_from_namestringSender name recognized by OCR.
ocr_from_companystringSender company recognized by OCR.
ocr_from_addressstringSender address recognized by OCR.
ocr_from_emailstringSender e-mail address recognized by OCR.
ocr_from_phonestringSender phone number recognized by OCR.
ocr_to_namestringRecipient name recognized by OCR.
ocr_to_companystringRecipient company recognized by OCR.
ocr_to_addressstringRecipient address recognized by OCR.
ocr_to_emailstringRecipient e-mail address recognized by OCR.
ocr_to_phonestringRecipient phone number recognized by OCR.
ocr_summarystringSummary of the document created by OCR.
ocr_statusstringOCR processing status: null=not processed, pending, processing, done, error
ocr_errorstringReason of the last failed or incomplete OCR run, null when it went through
ocr_processed_atstring (date-time)Point in time OCR processing finished.
virus_checkedboolean1 once the virus scan has passed for this file. The scan runs in the background (AttachmentVirusScanCommand), so a freshly uploaded file starts at 0 and stays there until it was really checked. An infected file never reaches 1 - it is deleted instead. UIs use this to decide whether a file may be handed to a user, so it must stay false until proven otherwise.
virus_checked_atstring (date-time)When the virus scan passed. Null while the file is still waiting.
commentsarray<NonWorkTimeRequestComment4>Comments on the request.
Show fields (5)
idintegerPrimary key of the absence request comment. Internal ID.
userUser14Login user who wrote the comment.
descriptionstringText of the comment.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
plan_entriesarray<NonWorkTimePlan2>Plan entries generated for the request.
Show fields (1)
idintegerPrimary key of the absence plan entry. Internal ID.
parent_requestNonWorkTimeRequest3The request this one changes ("Änderungsantrag zum Jahresurlaub"). A change request is an ordinary request in every other respect; the reference is what turns a second, unrelated looking request into a visible correction of the first - and what lets the days it withdraws be marked as withdrawn instead of merely refused.
annual_requestNonWorkTimeAnnualRequest6L47/L48: the annual plan ("Jahresurlaubsantrag") this period belongs to. The bundle is decided as a whole; the period stays an ordinary request in every other respect.
Show fields (9)
idintegerPrimary key of the annual request. Internal ID.
userUser14User the annual request belongs to.
personCRMPerson10Person the annual request belongs to.
yearintegerThe vacation year the periods belong to.
content_typeintegerAbsence type of every period (NonWorkTimePlanSelectionType value).
descriptionstringDescription of the annual request.
statusstringDerived from the periods, see class comment.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
request_kindstringU02/U18: ANNUAL = period of the annual plan, SUPPLEMENT = Ergänzungsantrag for the held back flexible days. null = ordinary request.
processing_due_datestring (date-time)U04/U20: the day by which the request has to be decided, counted from its receipt.
escalated_atstring (date-time)U04: when the overdue escalation was sent; null = not (yet) escalated.
written_approval_reasonstringU21: why the management step with a written comment was added to this request (e.g. SUMMER_CANCELLATION); null = no extra written approval needed.
search_stringstringText that the entity can be searched by.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
curl --request PUT \
--url https://your-instance.iw-erp.de/api/time/non_work_time_request/42 \
--header 'content-type: application/json' \
--header 'x-iw-jwt-token: <TOKEN>' \
--data '
{
"data": {
"description": "Text",
"change_mode": "string",
"daily_absence_start_time": "string",
"daily_absence_end_time": "string",
"start": "2026-10-15T09:30:00+02:00",
"end": "2026-10-15T09:30:00+02:00"
}
}
'const options = {
method: 'PUT',
headers: {'x-iw-jwt-token': '<TOKEN>', 'content-type': 'application/json'},
body: JSON.stringify({
data: {
description: 'Text',
change_mode: 'string',
daily_absence_start_time: 'string',
daily_absence_end_time: 'string',
start: '2026-10-15T09:30:00+02:00',
end: '2026-10-15T09:30:00+02:00'
}
})
};
fetch('https://your-instance.iw-erp.de/api/time/non_work_time_request/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/non_work_time_request/42"
payload = { "data": {
"description": "Text",
"change_mode": "string",
"daily_absence_start_time": "string",
"daily_absence_end_time": "string",
"start": "2026-10-15T09:30:00+02:00",
"end": "2026-10-15T09:30:00+02:00"
} }
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/non_work_time_request/42', [
'body' => '{"data":{"description":"Text","change_mode":"string","daily_absence_start_time":"string","daily_absence_end_time":"string","start":"2026-10-15T09:30:00+02:00","end":"2026-10-15T09:30:00+02:00"}}',
'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/non_work_time_request/42"),
Headers =
{
{ "x-iw-jwt-token", "<TOKEN>" },
},
Content = new StringContent("{\"data\":{\"description\":\"Text\",\"change_mode\":\"string\",\"daily_absence_start_time\":\"string\",\"daily_absence_end_time\":\"string\",\"start\":\"2026-10-15T09:30:00+02:00\",\"end\":\"2026-10-15T09:30:00+02:00\"}}")
{
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, "{\"data\":{\"description\":\"Text\",\"change_mode\":\"string\",\"daily_absence_start_time\":\"string\",\"daily_absence_end_time\":\"string\",\"start\":\"2026-10-15T09:30:00+02:00\",\"end\":\"2026-10-15T09:30:00+02:00\"}}");
Request request = new Request.Builder()
.url("https://your-instance.iw-erp.de/api/time/non_work_time_request/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/non_work_time_request/42"
payload := strings.NewReader("{\"data\":{\"description\":\"Text\",\"change_mode\":\"string\",\"daily_absence_start_time\":\"string\",\"daily_absence_end_time\":\"string\",\"start\":\"2026-10-15T09:30:00+02:00\",\"end\":\"2026-10-15T09:30:00+02:00\"}}")
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_non_work_time_request_controller.dart';
import 'package:iw_erp_api/logic/iw_api_state.dart';
import 'package:iw_erp_api/model/time_tracking_non_work_time_request.dart';
IwApiState().host = 'your-instance.iw-erp.de';
IwApiState().currentJwtApiToken = '<TOKEN>';
final result = await TimeTrackingNonWorkTimeRequestController.put(TimeTrackingNonWorkTimeRequest.fromJson({
"description": "Text",
"change_mode": "string",
"daily_absence_start_time": "string",
"daily_absence_end_time": "string",
"start": "2026-10-15T09:30:00+02:00",
"end": "2026-10-15T09:30:00+02:00"
}));
if (result.success) {
print(result.data);
}{
"id": 42,
"description": "Text",
"overdue": true,
"approval_version": 1,
"change_mode": "string",
"balance_override_reason": "string",
"coverage_override_reason": "string",
"coverage_hint": true,
"sick_during_vacation": true,
"consultation_note": "string"
}Update a single NonWorkTimeRequest
PATCH/api/time/non_work_time_request/{id}
Path parameters
idrequiredstring |
Query parameters
actionstring | CANCEL_OWN withdraws an own pending request without binding body fieldsAllowed: CANCEL_OWN |
approval_versioninteger | Displayed request version; required for CANCEL_OWN and staged decisions |
approval_commentstring | Written decision of the current approval step; mandatory for the management (Geschäftsleitung) step |
balance_override_reasonstring | L11: reason for approving although the projected year-end vacation balance is negative; required when non_work_time_negative_balance_override_required is on |
coverage_override_reasonstring | L54: reason for approving although a day drops below the minimum staffing; required when staffing_coverage_override_reason_required is on |
Request body application/json
dataNonWorkTimeRequest2Show fields (17)
change_modestringMode of a change to the request.
daily_absence_start_timestringLocal daily absence window for half-day types; null preserves legacy planning.
daily_absence_end_timestringEnd time of daily absence.
personCRMPerson37Person the request belongs to.
contractEmploymentContract8Employment contract the request belongs to.
descriptionstringDescription of the request.
startstring (date-time)Start of the requested period.
endstring (date-time)End of the requested period.
statusstringStatus of the request.
content_typestringType of the request, e.g. vacation or absence.
secondary_content_typestringSecondary type of the request.
attachmentsarray<Attachment12>Attachments of the request.
commentsarray<NonWorkTimeRequestComment3>Comments on the request.
plan_entriesarray<NonWorkTimePlan>Plan entries generated for the request.
parent_requestNonWorkTimeRequest2The request this one changes ("Änderungsantrag zum Jahresurlaub"). A change request is an ordinary request in every other respect; the reference is what turns a second, unrelated looking request into a visible correction of the first - and what lets the days it withdraws be marked as withdrawn instead of merely refused.
annual_requestNonWorkTimeAnnualRequest5L47/L48: the annual plan ("Jahresurlaubsantrag") this period belongs to. The bundle is decided as a whole; the period stays an ordinary request in every other respect.
request_kindstringU02/U18: ANNUAL = period of the annual plan, SUPPLEMENT = Ergänzungsantrag for the held back flexible days. null = ordinary request.
Responses
200Update a single NonWorkTimeRequestNonWorkTimeRequest3
Show fields (39)
overduebooleanU04: still waiting after the processing deadline.
approval_versionintegerVersion of the approval process.
change_modestringMode of a change to the request.
balance_override_reasonstringL11: why a planner approved this request although the projected vacation balance was negative.
coverage_override_reasonstringL54: why the approver accepted a day below the minimum staffing.
coverage_hintbooleanL53: handed in although it eats into the staffing buffer - the approvers see the hint.
sick_during_vacationbooleanU13: a sick report inside approved vacation - set by the server, shown as "während Urlaub".
consultation_notestringWho was consulted before requesting days a blocking period marks as consultation-only (U14).
daily_absence_start_timestringLocal daily absence window for half-day types; null preserves legacy planning.
daily_absence_end_timestringEnd time of daily absence.
idintegerPrimary key of the request. Internal ID.
userUser14User the request belongs to.
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.
contractEmploymentContract9Employment contract the request belongs to.
Show fields (43)
staged_absence_approvalbooleannull inherits group then organization policy; existing installations stay off.
idintegerPrimary key of the employment contract. Internal ID.
tokenstringPublic token of the contract. Used instead of the ID.
userUser14Login user of the employee.
week_total_hoursnumber (float)Total working hours per week.
week_total_daysnumber (float)Total working days per week.
reserved_hours_preparationnumber (float)L03: weekly hours reserved for Vorbereitung - part of the contract hours but not plannable in the shift plan. null = none.
reserved_hours_follow_upnumber (float)L03: weekly hours reserved for Nachbereitung - part of the contract hours but not plannable in the shift plan. null = none.
reserved_hours_travelnumber (float)L03: weekly hours reserved for Fahrt - part of the contract hours but not plannable in the shift plan. null = none.
reserved_hours_flexiblenumber (float)L03: weekly hours reserved for freie Einteilung - part of the contract hours but not plannable in the shift plan. null = none.
week_full_time_total_daysnumber (float)Total working days per week for a full-time contract.
year_vacation_daysnumber (float)Vacation days per year.
month_vacation_daysnumber (float)Vacation days per month.
year_vacation_weeksnumber (float)Vacation weeks per year.
monday_hoursnumber (float)Working hours on Monday.
tuesday_hoursnumber (float)Working hours on Tuesday.
wednesday_hoursnumber (float)Working hours on Wednesday.
thursday_hoursnumber (float)Working hours on Thursday.
friday_hoursnumber (float)Working hours on Friday.
saturday_hoursnumber (float)Working hours on Saturday.
sunday_hoursnumber (float)Working hours on Sunday.
netto_hour_costnumber (float)Net cost per hour.
brutto_hour_costnumber (float)Gross cost per hour.
startstring (date-time)Start date of the contract.
endstring (date-time)End date of the contract.
fixed_term_statusstringBefristung: PERMANENT (unbefristet, default), FIXED_TERM or EXTENDED (FIXED_TERM_STATUS_*).
fixed_term_endstring (date-time)Befristet bis (erster Zeitraum).
fixed_term_extension_endstring (date-time)Befristet bis nach Verlängerung.
probation_endstring (date-time)Probezeit bis; filled from the template's probationMonths when a contract is created without it.
numberstringContract number.
descriptionstringDescription of the contract.
archivedbooleanThe contract is archived.
allow_app_time_trackingbooleanThe employee may track time in the app.
allow_scanner_time_trackingbooleanThe employee may track time with the scanner.
allow_app_non_work_time_managementbooleanThe employee may manage absences in the app.
force_no_auto_breakbooleanAutomatic breaks are not added for this contract.
work_time_modestringHow the target working time is defined - null behaves as WEEKDAY_HOURS so existing contracts keep their previous behaviour unchanged.
holiday_credit_modestringHoliday credit for WEEK_TOTAL contracts - null behaves as WEEKDAY_TARGET (previous behaviour, only meaningful for WEEKDAY_HOURS contracts).
holiday_credit_fixed_secondsintegerFixed holiday credit in seconds.
planning_weekdays_bitmaskintegerISO weekday bitmask (Mo=1 ... So=64) of the days this WEEK_TOTAL contract can be planned / takes vacation on - null behaves as Mo-Fr.
request_lead_time_daysintegerDays an absence request has to be handed in ahead of its first day ("Bearbeitungs- frist"). null falls back to the contract group and from there to the installation wide setting, so an existing contract keeps behaving exactly as before.
shift_booking_syncbooleanL35: shifts as availabilities / appointments in the booking area; null inherits the group (which inherits the organisation).
search_stringstringText that the entity can be searched by.
descriptionstringDescription of the request.
startstring (date-time)Start of the requested period.
start_datestringStart date of the requested period.
start_monthintegerStart month of the requested period.
start_yearintegerStart year of the requested period.
endstring (date-time)End of the requested period.
end_datestringEnd date of the requested period.
end_monthintegerEnd month of the requested period.
end_yearintegerEnd year of the requested period.
durationnumber (float)duration in days linked to NonWorkTimePlan - a half day type counts 0.5 (Z6)
statusstringStatus of the request.
content_typestringType of the request, e.g. vacation or absence.
secondary_content_typestringSecondary type of the request.
linked_content_typeNonWorkTimePlanSelectionType3Plan selection type linked to the request.
Show fields (15)
effective_colorstringThe colour to show: the configured one, else the default of the type.
namestringName of the absence type, for example vacation or sick leave.
valueintegerNumeric value of the absence type.
priorityintegerPriority of the absence type when several types overlap.
processed_content_typestringContent type used when the absence is processed.
secondary_content_type_optionsstringOptions for the secondary content type, separated by a comma
iconstringIcon of the absence type.
is_vacationbooleanThe absence type counts as vacation.
is_sickbooleanThe absence type counts as sick leave.
status_change_requires_hr_approvalbooleanChanging the status of this absence type requires HR approval.
selectable_for_requestbooleanWhether a new absence request may be created with this type. Types that only describe a day in an overview - holiday, school holiday, work day - are not offered in the editors.
requires_management_approvalbooleanRequests of this type need a final written decision by the management (the organization leadership), appended after the regular approval chain (U10).
max_days_per_requestintegerUpper limit of calendar days one request of this type may cover; null = unlimited.
colorstringR5: colour of this absence type in the shift plan and the team calendar ("#RRGGBB"); null = the default of the type (getEffectiveColor). Used with absence_type_colors_enabled.
deletedbooleanThis property is used to mark an entity as deleted / archived
attachmentsarray<Attachment10>Attachments of the request.
Show fields (25)
idintegerPrimary key of the attachment. Internal ID.
filenamestringOriginal file name.
filesizestringSize of the file in bytes.
mimetypestringMIME type of the file.
createdbyusernamestringName of the user who uploaded the file, as text.
createdstring (date-time)Point in time the attachment was created.
googleidstringID of the file in Google Drive.
scopestringScope that controls who can see the attachment.
ocr_document_typestringDocument type recognized by OCR.
ocr_from_namestringSender name recognized by OCR.
ocr_from_companystringSender company recognized by OCR.
ocr_from_addressstringSender address recognized by OCR.
ocr_from_emailstringSender e-mail address recognized by OCR.
ocr_from_phonestringSender phone number recognized by OCR.
ocr_to_namestringRecipient name recognized by OCR.
ocr_to_companystringRecipient company recognized by OCR.
ocr_to_addressstringRecipient address recognized by OCR.
ocr_to_emailstringRecipient e-mail address recognized by OCR.
ocr_to_phonestringRecipient phone number recognized by OCR.
ocr_summarystringSummary of the document created by OCR.
ocr_statusstringOCR processing status: null=not processed, pending, processing, done, error
ocr_errorstringReason of the last failed or incomplete OCR run, null when it went through
ocr_processed_atstring (date-time)Point in time OCR processing finished.
virus_checkedboolean1 once the virus scan has passed for this file. The scan runs in the background (AttachmentVirusScanCommand), so a freshly uploaded file starts at 0 and stays there until it was really checked. An infected file never reaches 1 - it is deleted instead. UIs use this to decide whether a file may be handed to a user, so it must stay false until proven otherwise.
virus_checked_atstring (date-time)When the virus scan passed. Null while the file is still waiting.
commentsarray<NonWorkTimeRequestComment4>Comments on the request.
Show fields (5)
idintegerPrimary key of the absence request comment. Internal ID.
userUser14Login user who wrote the comment.
descriptionstringText of the comment.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
plan_entriesarray<NonWorkTimePlan2>Plan entries generated for the request.
Show fields (1)
idintegerPrimary key of the absence plan entry. Internal ID.
parent_requestNonWorkTimeRequest3The request this one changes ("Änderungsantrag zum Jahresurlaub"). A change request is an ordinary request in every other respect; the reference is what turns a second, unrelated looking request into a visible correction of the first - and what lets the days it withdraws be marked as withdrawn instead of merely refused.
annual_requestNonWorkTimeAnnualRequest6L47/L48: the annual plan ("Jahresurlaubsantrag") this period belongs to. The bundle is decided as a whole; the period stays an ordinary request in every other respect.
Show fields (9)
idintegerPrimary key of the annual request. Internal ID.
userUser14User the annual request belongs to.
personCRMPerson10Person the annual request belongs to.
yearintegerThe vacation year the periods belong to.
content_typeintegerAbsence type of every period (NonWorkTimePlanSelectionType value).
descriptionstringDescription of the annual request.
statusstringDerived from the periods, see class comment.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
request_kindstringU02/U18: ANNUAL = period of the annual plan, SUPPLEMENT = Ergänzungsantrag for the held back flexible days. null = ordinary request.
processing_due_datestring (date-time)U04/U20: the day by which the request has to be decided, counted from its receipt.
escalated_atstring (date-time)U04: when the overdue escalation was sent; null = not (yet) escalated.
written_approval_reasonstringU21: why the management step with a written comment was added to this request (e.g. SUMMER_CANCELLATION); null = no extra written approval needed.
search_stringstringText that the entity can be searched by.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
curl --request PATCH \
--url https://your-instance.iw-erp.de/api/time/non_work_time_request/42 \
--header 'content-type: application/json' \
--header 'x-iw-jwt-token: <TOKEN>' \
--data '
{
"data": {
"description": "Text",
"change_mode": "string",
"daily_absence_start_time": "string",
"daily_absence_end_time": "string",
"start": "2026-10-15T09:30:00+02:00",
"end": "2026-10-15T09:30:00+02:00"
}
}
'const options = {
method: 'PATCH',
headers: {'x-iw-jwt-token': '<TOKEN>', 'content-type': 'application/json'},
body: JSON.stringify({
data: {
description: 'Text',
change_mode: 'string',
daily_absence_start_time: 'string',
daily_absence_end_time: 'string',
start: '2026-10-15T09:30:00+02:00',
end: '2026-10-15T09:30:00+02:00'
}
})
};
fetch('https://your-instance.iw-erp.de/api/time/non_work_time_request/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/non_work_time_request/42"
payload = { "data": {
"description": "Text",
"change_mode": "string",
"daily_absence_start_time": "string",
"daily_absence_end_time": "string",
"start": "2026-10-15T09:30:00+02:00",
"end": "2026-10-15T09:30:00+02:00"
} }
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/non_work_time_request/42', [
'body' => '{"data":{"description":"Text","change_mode":"string","daily_absence_start_time":"string","daily_absence_end_time":"string","start":"2026-10-15T09:30:00+02:00","end":"2026-10-15T09:30:00+02:00"}}',
'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/non_work_time_request/42"),
Headers =
{
{ "x-iw-jwt-token", "<TOKEN>" },
},
Content = new StringContent("{\"data\":{\"description\":\"Text\",\"change_mode\":\"string\",\"daily_absence_start_time\":\"string\",\"daily_absence_end_time\":\"string\",\"start\":\"2026-10-15T09:30:00+02:00\",\"end\":\"2026-10-15T09:30:00+02:00\"}}")
{
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, "{\"data\":{\"description\":\"Text\",\"change_mode\":\"string\",\"daily_absence_start_time\":\"string\",\"daily_absence_end_time\":\"string\",\"start\":\"2026-10-15T09:30:00+02:00\",\"end\":\"2026-10-15T09:30:00+02:00\"}}");
Request request = new Request.Builder()
.url("https://your-instance.iw-erp.de/api/time/non_work_time_request/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/non_work_time_request/42"
payload := strings.NewReader("{\"data\":{\"description\":\"Text\",\"change_mode\":\"string\",\"daily_absence_start_time\":\"string\",\"daily_absence_end_time\":\"string\",\"start\":\"2026-10-15T09:30:00+02:00\",\"end\":\"2026-10-15T09:30:00+02:00\"}}")
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 package:http (no controller in the iw_erp_api package)
import 'dart:convert';
import 'package:http/http.dart' as http;
final response = await http.patch(
Uri.parse('https://your-instance.iw-erp.de/api/time/non_work_time_request/42'),
headers: {'x-iw-jwt-token': '<TOKEN>', 'content-type': 'application/json'},
body: jsonEncode({
"data": {
"description": "Text",
"change_mode": "string",
"daily_absence_start_time": "string",
"daily_absence_end_time": "string",
"start": "2026-10-15T09:30:00+02:00",
"end": "2026-10-15T09:30:00+02:00"
}
}),
);
print(response.body);{
"id": 42,
"description": "Text",
"overdue": true,
"approval_version": 1,
"change_mode": "string",
"balance_override_reason": "string",
"coverage_override_reason": "string",
"coverage_hint": true,
"sick_during_vacation": true,
"consultation_note": "string"
}Test a single NonWorkTimeRequest
POST/api/time/non_work_time_request_test
Request body application/json
dataNonWorkTimeRequest2Show fields (17)
change_modestringMode of a change to the request.
daily_absence_start_timestringLocal daily absence window for half-day types; null preserves legacy planning.
daily_absence_end_timestringEnd time of daily absence.
personCRMPerson37Person the request belongs to.
contractEmploymentContract8Employment contract the request belongs to.
descriptionstringDescription of the request.
startstring (date-time)Start of the requested period.
endstring (date-time)End of the requested period.
statusstringStatus of the request.
content_typestringType of the request, e.g. vacation or absence.
secondary_content_typestringSecondary type of the request.
attachmentsarray<Attachment12>Attachments of the request.
commentsarray<NonWorkTimeRequestComment3>Comments on the request.
plan_entriesarray<NonWorkTimePlan>Plan entries generated for the request.
parent_requestNonWorkTimeRequest2The request this one changes ("Änderungsantrag zum Jahresurlaub"). A change request is an ordinary request in every other respect; the reference is what turns a second, unrelated looking request into a visible correction of the first - and what lets the days it withdraws be marked as withdrawn instead of merely refused.
annual_requestNonWorkTimeAnnualRequest5L47/L48: the annual plan ("Jahresurlaubsantrag") this period belongs to. The bundle is decided as a whole; the period stays an ordinary request in every other respect.
request_kindstringU02/U18: ANNUAL = period of the annual plan, SUPPLEMENT = Ergänzungsantrag for the held back flexible days. null = ordinary request.
Responses
200Test a single NonWorkTimeRequestNonWorkTimeRequest3
Show fields (39)
overduebooleanU04: still waiting after the processing deadline.
approval_versionintegerVersion of the approval process.
change_modestringMode of a change to the request.
balance_override_reasonstringL11: why a planner approved this request although the projected vacation balance was negative.
coverage_override_reasonstringL54: why the approver accepted a day below the minimum staffing.
coverage_hintbooleanL53: handed in although it eats into the staffing buffer - the approvers see the hint.
sick_during_vacationbooleanU13: a sick report inside approved vacation - set by the server, shown as "während Urlaub".
consultation_notestringWho was consulted before requesting days a blocking period marks as consultation-only (U14).
daily_absence_start_timestringLocal daily absence window for half-day types; null preserves legacy planning.
daily_absence_end_timestringEnd time of daily absence.
idintegerPrimary key of the request. Internal ID.
userUser14User the request belongs to.
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.
contractEmploymentContract9Employment contract the request belongs to.
Show fields (43)
staged_absence_approvalbooleannull inherits group then organization policy; existing installations stay off.
idintegerPrimary key of the employment contract. Internal ID.
tokenstringPublic token of the contract. Used instead of the ID.
userUser14Login user of the employee.
week_total_hoursnumber (float)Total working hours per week.
week_total_daysnumber (float)Total working days per week.
reserved_hours_preparationnumber (float)L03: weekly hours reserved for Vorbereitung - part of the contract hours but not plannable in the shift plan. null = none.
reserved_hours_follow_upnumber (float)L03: weekly hours reserved for Nachbereitung - part of the contract hours but not plannable in the shift plan. null = none.
reserved_hours_travelnumber (float)L03: weekly hours reserved for Fahrt - part of the contract hours but not plannable in the shift plan. null = none.
reserved_hours_flexiblenumber (float)L03: weekly hours reserved for freie Einteilung - part of the contract hours but not plannable in the shift plan. null = none.
week_full_time_total_daysnumber (float)Total working days per week for a full-time contract.
year_vacation_daysnumber (float)Vacation days per year.
month_vacation_daysnumber (float)Vacation days per month.
year_vacation_weeksnumber (float)Vacation weeks per year.
monday_hoursnumber (float)Working hours on Monday.
tuesday_hoursnumber (float)Working hours on Tuesday.
wednesday_hoursnumber (float)Working hours on Wednesday.
thursday_hoursnumber (float)Working hours on Thursday.
friday_hoursnumber (float)Working hours on Friday.
saturday_hoursnumber (float)Working hours on Saturday.
sunday_hoursnumber (float)Working hours on Sunday.
netto_hour_costnumber (float)Net cost per hour.
brutto_hour_costnumber (float)Gross cost per hour.
startstring (date-time)Start date of the contract.
endstring (date-time)End date of the contract.
fixed_term_statusstringBefristung: PERMANENT (unbefristet, default), FIXED_TERM or EXTENDED (FIXED_TERM_STATUS_*).
fixed_term_endstring (date-time)Befristet bis (erster Zeitraum).
fixed_term_extension_endstring (date-time)Befristet bis nach Verlängerung.
probation_endstring (date-time)Probezeit bis; filled from the template's probationMonths when a contract is created without it.
numberstringContract number.
descriptionstringDescription of the contract.
archivedbooleanThe contract is archived.
allow_app_time_trackingbooleanThe employee may track time in the app.
allow_scanner_time_trackingbooleanThe employee may track time with the scanner.
allow_app_non_work_time_managementbooleanThe employee may manage absences in the app.
force_no_auto_breakbooleanAutomatic breaks are not added for this contract.
work_time_modestringHow the target working time is defined - null behaves as WEEKDAY_HOURS so existing contracts keep their previous behaviour unchanged.
holiday_credit_modestringHoliday credit for WEEK_TOTAL contracts - null behaves as WEEKDAY_TARGET (previous behaviour, only meaningful for WEEKDAY_HOURS contracts).
holiday_credit_fixed_secondsintegerFixed holiday credit in seconds.
planning_weekdays_bitmaskintegerISO weekday bitmask (Mo=1 ... So=64) of the days this WEEK_TOTAL contract can be planned / takes vacation on - null behaves as Mo-Fr.
request_lead_time_daysintegerDays an absence request has to be handed in ahead of its first day ("Bearbeitungs- frist"). null falls back to the contract group and from there to the installation wide setting, so an existing contract keeps behaving exactly as before.
shift_booking_syncbooleanL35: shifts as availabilities / appointments in the booking area; null inherits the group (which inherits the organisation).
search_stringstringText that the entity can be searched by.
descriptionstringDescription of the request.
startstring (date-time)Start of the requested period.
start_datestringStart date of the requested period.
start_monthintegerStart month of the requested period.
start_yearintegerStart year of the requested period.
endstring (date-time)End of the requested period.
end_datestringEnd date of the requested period.
end_monthintegerEnd month of the requested period.
end_yearintegerEnd year of the requested period.
durationnumber (float)duration in days linked to NonWorkTimePlan - a half day type counts 0.5 (Z6)
statusstringStatus of the request.
content_typestringType of the request, e.g. vacation or absence.
secondary_content_typestringSecondary type of the request.
linked_content_typeNonWorkTimePlanSelectionType3Plan selection type linked to the request.
Show fields (15)
effective_colorstringThe colour to show: the configured one, else the default of the type.
namestringName of the absence type, for example vacation or sick leave.
valueintegerNumeric value of the absence type.
priorityintegerPriority of the absence type when several types overlap.
processed_content_typestringContent type used when the absence is processed.
secondary_content_type_optionsstringOptions for the secondary content type, separated by a comma
iconstringIcon of the absence type.
is_vacationbooleanThe absence type counts as vacation.
is_sickbooleanThe absence type counts as sick leave.
status_change_requires_hr_approvalbooleanChanging the status of this absence type requires HR approval.
selectable_for_requestbooleanWhether a new absence request may be created with this type. Types that only describe a day in an overview - holiday, school holiday, work day - are not offered in the editors.
requires_management_approvalbooleanRequests of this type need a final written decision by the management (the organization leadership), appended after the regular approval chain (U10).
max_days_per_requestintegerUpper limit of calendar days one request of this type may cover; null = unlimited.
colorstringR5: colour of this absence type in the shift plan and the team calendar ("#RRGGBB"); null = the default of the type (getEffectiveColor). Used with absence_type_colors_enabled.
deletedbooleanThis property is used to mark an entity as deleted / archived
attachmentsarray<Attachment10>Attachments of the request.
Show fields (25)
idintegerPrimary key of the attachment. Internal ID.
filenamestringOriginal file name.
filesizestringSize of the file in bytes.
mimetypestringMIME type of the file.
createdbyusernamestringName of the user who uploaded the file, as text.
createdstring (date-time)Point in time the attachment was created.
googleidstringID of the file in Google Drive.
scopestringScope that controls who can see the attachment.
ocr_document_typestringDocument type recognized by OCR.
ocr_from_namestringSender name recognized by OCR.
ocr_from_companystringSender company recognized by OCR.
ocr_from_addressstringSender address recognized by OCR.
ocr_from_emailstringSender e-mail address recognized by OCR.
ocr_from_phonestringSender phone number recognized by OCR.
ocr_to_namestringRecipient name recognized by OCR.
ocr_to_companystringRecipient company recognized by OCR.
ocr_to_addressstringRecipient address recognized by OCR.
ocr_to_emailstringRecipient e-mail address recognized by OCR.
ocr_to_phonestringRecipient phone number recognized by OCR.
ocr_summarystringSummary of the document created by OCR.
ocr_statusstringOCR processing status: null=not processed, pending, processing, done, error
ocr_errorstringReason of the last failed or incomplete OCR run, null when it went through
ocr_processed_atstring (date-time)Point in time OCR processing finished.
virus_checkedboolean1 once the virus scan has passed for this file. The scan runs in the background (AttachmentVirusScanCommand), so a freshly uploaded file starts at 0 and stays there until it was really checked. An infected file never reaches 1 - it is deleted instead. UIs use this to decide whether a file may be handed to a user, so it must stay false until proven otherwise.
virus_checked_atstring (date-time)When the virus scan passed. Null while the file is still waiting.
commentsarray<NonWorkTimeRequestComment4>Comments on the request.
Show fields (5)
idintegerPrimary key of the absence request comment. Internal ID.
userUser14Login user who wrote the comment.
descriptionstringText of the comment.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
plan_entriesarray<NonWorkTimePlan2>Plan entries generated for the request.
Show fields (1)
idintegerPrimary key of the absence plan entry. Internal ID.
parent_requestNonWorkTimeRequest3The request this one changes ("Änderungsantrag zum Jahresurlaub"). A change request is an ordinary request in every other respect; the reference is what turns a second, unrelated looking request into a visible correction of the first - and what lets the days it withdraws be marked as withdrawn instead of merely refused.
annual_requestNonWorkTimeAnnualRequest6L47/L48: the annual plan ("Jahresurlaubsantrag") this period belongs to. The bundle is decided as a whole; the period stays an ordinary request in every other respect.
Show fields (9)
idintegerPrimary key of the annual request. Internal ID.
userUser14User the annual request belongs to.
personCRMPerson10Person the annual request belongs to.
yearintegerThe vacation year the periods belong to.
content_typeintegerAbsence type of every period (NonWorkTimePlanSelectionType value).
descriptionstringDescription of the annual request.
statusstringDerived from the periods, see class comment.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
request_kindstringU02/U18: ANNUAL = period of the annual plan, SUPPLEMENT = Ergänzungsantrag for the held back flexible days. null = ordinary request.
processing_due_datestring (date-time)U04/U20: the day by which the request has to be decided, counted from its receipt.
escalated_atstring (date-time)U04: when the overdue escalation was sent; null = not (yet) escalated.
written_approval_reasonstringU21: why the management step with a written comment was added to this request (e.g. SUMMER_CANCELLATION); null = no extra written approval needed.
search_stringstringText that the entity can be searched by.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
curl --request POST \
--url https://your-instance.iw-erp.de/api/time/non_work_time_request_test \
--header 'content-type: application/json' \
--header 'x-iw-jwt-token: <TOKEN>' \
--data '
{
"data": {
"description": "Text",
"change_mode": "string",
"daily_absence_start_time": "string",
"daily_absence_end_time": "string",
"start": "2026-10-15T09:30:00+02:00",
"end": "2026-10-15T09:30:00+02:00"
}
}
'const options = {
method: 'POST',
headers: {'x-iw-jwt-token': '<TOKEN>', 'content-type': 'application/json'},
body: JSON.stringify({
data: {
description: 'Text',
change_mode: 'string',
daily_absence_start_time: 'string',
daily_absence_end_time: 'string',
start: '2026-10-15T09:30:00+02:00',
end: '2026-10-15T09:30:00+02:00'
}
})
};
fetch('https://your-instance.iw-erp.de/api/time/non_work_time_request_test', 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/non_work_time_request_test"
payload = { "data": {
"description": "Text",
"change_mode": "string",
"daily_absence_start_time": "string",
"daily_absence_end_time": "string",
"start": "2026-10-15T09:30:00+02:00",
"end": "2026-10-15T09:30:00+02:00"
} }
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/non_work_time_request_test', [
'body' => '{"data":{"description":"Text","change_mode":"string","daily_absence_start_time":"string","daily_absence_end_time":"string","start":"2026-10-15T09:30:00+02:00","end":"2026-10-15T09:30:00+02:00"}}',
'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/non_work_time_request_test"),
Headers =
{
{ "x-iw-jwt-token", "<TOKEN>" },
},
Content = new StringContent("{\"data\":{\"description\":\"Text\",\"change_mode\":\"string\",\"daily_absence_start_time\":\"string\",\"daily_absence_end_time\":\"string\",\"start\":\"2026-10-15T09:30:00+02:00\",\"end\":\"2026-10-15T09:30:00+02:00\"}}")
{
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, "{\"data\":{\"description\":\"Text\",\"change_mode\":\"string\",\"daily_absence_start_time\":\"string\",\"daily_absence_end_time\":\"string\",\"start\":\"2026-10-15T09:30:00+02:00\",\"end\":\"2026-10-15T09:30:00+02:00\"}}");
Request request = new Request.Builder()
.url("https://your-instance.iw-erp.de/api/time/non_work_time_request_test")
.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/non_work_time_request_test"
payload := strings.NewReader("{\"data\":{\"description\":\"Text\",\"change_mode\":\"string\",\"daily_absence_start_time\":\"string\",\"daily_absence_end_time\":\"string\",\"start\":\"2026-10-15T09:30:00+02:00\",\"end\":\"2026-10-15T09:30:00+02:00\"}}")
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_non_work_time_request_controller.dart';
import 'package:iw_erp_api/logic/iw_api_state.dart';
import 'package:iw_erp_api/model/time_tracking_non_work_time_request.dart';
IwApiState().host = 'your-instance.iw-erp.de';
IwApiState().currentJwtApiToken = '<TOKEN>';
final result = await TimeTrackingNonWorkTimeRequestController.postTest(TimeTrackingNonWorkTimeRequest.fromJson({
"description": "Text",
"change_mode": "string",
"daily_absence_start_time": "string",
"daily_absence_end_time": "string",
"start": "2026-10-15T09:30:00+02:00",
"end": "2026-10-15T09:30:00+02:00"
}));
if (result.success) {
print(result.data);
}{
"id": 42,
"description": "Text",
"overdue": true,
"approval_version": 1,
"change_mode": "string",
"balance_override_reason": "string",
"coverage_override_reason": "string",
"coverage_hint": true,
"sick_during_vacation": true,
"consultation_note": "string"
}Create an annual request ("Jahresurlaubsantrag") with several separate periods (L47/L48)
POST/api/time/non_work_time_annual_request
Every period becomes an ordinary request of the bundle and runs through the same rules as a single request; one failing period refuses the whole bundle.
Request body application/json
dataNonWorkTimeAnnualRequest2Show fields (5)
personCRMPerson38Person the annual request belongs to.
contractEmploymentContract10Employment contract the annual request belongs to.
yearintegerThe vacation year the periods belong to.
content_typeintegerAbsence type of every period (NonWorkTimePlanSelectionType value).
descriptionstringDescription of the annual request.
Responses
200Create an annual request with several periodsNonWorkTimeAnnualRequest3
Show fields (12)
idintegerPrimary key of the annual request. Internal ID.
userUser14User the annual request belongs to.
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.
personCRMPerson10Person the annual request belongs to.
Show fields (81)
idintegerPrimary key of the person. Internal ID.
first_namestringFirst name of the person.
last_namestringLast name of the person.
numberintegerMember or customer number of the person.
manual_numberintegerNumber set manually instead of the automatic number.
number_stringstringMember or customer number as text, including prefix.
genderstringGender of the person.
titlestringAcademic or other title of the person.
positionstringPosition or role of the person.
languagestringPreferred language of the person.
special_salutationstringSpecial salutation text for letters.
form_of_salutationstringForm of salutation, for example formal or informal.
birthdaystring (date-time)Birthday of the person.
known_allergiesstringKnown allergies of the person.
confirmed_no_allergiesbooleanGuardian confirmed that there are no known allergies.
allow_photosbooleanPhotos of the person may be taken and published.
allow_leaving_alonebooleanThe person may leave the event alone.
authorized_pickupstringPersons who are allowed to pick up the person.
needs_supportbooleanThe person needs support, for example for inclusion.
support_descriptionstringDescription of the support the person needs.
financial_supportbooleanThe person receives financial support.
financial_support_numberstringNumber of the financial support.
municipal_supportbooleanThe person receives municipal support.
municipal_support_numberstringNumber of the municipal support.
grade_levelintegerSchool grade level of the person.
school_classstringSchool class of the person.
start_timestring (date-time)Start of the membership or activity.
start_time_reasonstringReason for the start.
end_timestring (date-time)End of the membership or activity.
end_time_reasonstringReason for the end.
confirmed_gtc_timestring (date-time)Time the general terms and conditions were confirmed.
chatbot_opt_inbooleanEinwilligung in die Nutzung des KI-Assistenten. Denormalisierter aktueller Stand - das pruefbare Protokoll steht in ChatbotConsent.
chatbot_opt_in_atstring (date-time)Time the person opted in to the chatbot.
chatbot_opt_in_text_versionstringVersion des Einwilligungstextes, dem zugestimmt wurde. Weicht sie von der aktuellen Version ab, ist das Opt-in abgelaufen.
app_usage_statistics_opt_outbooleanWiderspruch gegen die anonyme Nutzungsstatistik der Mitglieder-App. Die App liest ihn aus den StaticData und schickt dann nichts mehr; die gezaehlten Aufrufe selbst haben keinen Bezug zur Person.
crm_person_contact_dataarray<CRMPersonContactData>Contact data of the person, for example phone and e-mail.
archivedbooleanWhether the person is archived.
subscribed_newsletterbooleanWhether the person subscribed to the newsletter.
subscribed_magazinebooleanWhether the person subscribed to the magazine.
printed_member_cardbooleanWhether a member card has been printed for the person.
has_login_userbooleanWhether the person has a login user.
profile_picture_urlstringURL of the profile picture of the person.
log_book_staffbooleanLog book flag: staff.
log_book_staff1booleanLog book flag: staff, level 1.
log_book_staff2booleanLog book flag: staff, level 2.
log_book_memberbooleanLog book flag: member.
log_book_trainerbooleanLog book flag: trainer.
log_book_trainer1booleanLog book flag: trainer, level 1.
log_book_trainer2booleanLog book flag: trainer, level 2.
log_book_head_of_departmentbooleanLog book flag: head of department.
log_book_supervisory_boardbooleanLog book flag: supervisory board.
log_book_board_of_directorsbooleanLog book flag: board of directors.
log_book_honorary_memberbooleanLog book flag: honorary member.
log_book_club_card_onebooleanLog book flag: club card.
log_book_health_recoveredbooleanLog book flag: recovered from illness.
log_book_health_vaccinatedbooleanLog book flag: vaccinated.
log_book_health_vaccinated_additionstringDetails of the vaccination.
log_book_good_conductbooleanLog book flag: certificate of good conduct.
log_book_first_aidbooleanLog book flag: first aid training.
log_book_measles_vaccinationbooleanLog book flag: measles vaccination.
sync_lanistabooleanWhether the person is synchronized with Lanista.
categoryCRMPersonCategoryPerson category.
nicknamestringNickname of the person.
preferred_color_hexstringPreferred color of the person as hex value.
avatar_tokenstringToken of the avatar image.
search_stringstringText that the entity can be searched by.
addressstringAddress as text.
address_streetstringStreet of the address.
address_house_numberstringHouse number of the address.
address_street_levelstringStreet and house number of the address.
address_costringCare-of line of the address.
address_citystringCity of the address.
address_zipstringPostal code of the address.
address_admin_level1stringFirst administrative level of the address, e.g. the federal state.
address_countrystringCountry code of the address.
address_full_countrystringFull name of the country of the address.
address_geo_latstringLatitude of the address.
address_geo_lngstringLongitude of the address.
address_external_provider_idstringfield to store the external provider id of the address. e.g. Google Maps PlaceID like google:ChIJVcKw5r90sEcRhdjNq6NItqE
createdstring (date-time)Point in time the entity was created.
- … 2 more fields
contractEmploymentContract11Employment contract the annual request belongs to.
Show fields (43)
staged_absence_approvalbooleannull inherits group then organization policy; existing installations stay off.
idintegerPrimary key of the employment contract. Internal ID.
tokenstringPublic token of the contract. Used instead of the ID.
userUser14Login user of the employee.
week_total_hoursnumber (float)Total working hours per week.
week_total_daysnumber (float)Total working days per week.
reserved_hours_preparationnumber (float)L03: weekly hours reserved for Vorbereitung - part of the contract hours but not plannable in the shift plan. null = none.
reserved_hours_follow_upnumber (float)L03: weekly hours reserved for Nachbereitung - part of the contract hours but not plannable in the shift plan. null = none.
reserved_hours_travelnumber (float)L03: weekly hours reserved for Fahrt - part of the contract hours but not plannable in the shift plan. null = none.
reserved_hours_flexiblenumber (float)L03: weekly hours reserved for freie Einteilung - part of the contract hours but not plannable in the shift plan. null = none.
week_full_time_total_daysnumber (float)Total working days per week for a full-time contract.
year_vacation_daysnumber (float)Vacation days per year.
month_vacation_daysnumber (float)Vacation days per month.
year_vacation_weeksnumber (float)Vacation weeks per year.
monday_hoursnumber (float)Working hours on Monday.
tuesday_hoursnumber (float)Working hours on Tuesday.
wednesday_hoursnumber (float)Working hours on Wednesday.
thursday_hoursnumber (float)Working hours on Thursday.
friday_hoursnumber (float)Working hours on Friday.
saturday_hoursnumber (float)Working hours on Saturday.
sunday_hoursnumber (float)Working hours on Sunday.
netto_hour_costnumber (float)Net cost per hour.
brutto_hour_costnumber (float)Gross cost per hour.
startstring (date-time)Start date of the contract.
endstring (date-time)End date of the contract.
fixed_term_statusstringBefristung: PERMANENT (unbefristet, default), FIXED_TERM or EXTENDED (FIXED_TERM_STATUS_*).
fixed_term_endstring (date-time)Befristet bis (erster Zeitraum).
fixed_term_extension_endstring (date-time)Befristet bis nach Verlängerung.
probation_endstring (date-time)Probezeit bis; filled from the template's probationMonths when a contract is created without it.
numberstringContract number.
descriptionstringDescription of the contract.
archivedbooleanThe contract is archived.
allow_app_time_trackingbooleanThe employee may track time in the app.
allow_scanner_time_trackingbooleanThe employee may track time with the scanner.
allow_app_non_work_time_managementbooleanThe employee may manage absences in the app.
force_no_auto_breakbooleanAutomatic breaks are not added for this contract.
work_time_modestringHow the target working time is defined - null behaves as WEEKDAY_HOURS so existing contracts keep their previous behaviour unchanged.
holiday_credit_modestringHoliday credit for WEEK_TOTAL contracts - null behaves as WEEKDAY_TARGET (previous behaviour, only meaningful for WEEKDAY_HOURS contracts).
holiday_credit_fixed_secondsintegerFixed holiday credit in seconds.
planning_weekdays_bitmaskintegerISO weekday bitmask (Mo=1 ... So=64) of the days this WEEK_TOTAL contract can be planned / takes vacation on - null behaves as Mo-Fr.
request_lead_time_daysintegerDays an absence request has to be handed in ahead of its first day ("Bearbeitungs- frist"). null falls back to the contract group and from there to the installation wide setting, so an existing contract keeps behaving exactly as before.
shift_booking_syncbooleanL35: shifts as availabilities / appointments in the booking area; null inherits the group (which inherits the organisation).
search_stringstringText that the entity can be searched by.
created_by_userUser14User who created the annual request.
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.
yearintegerThe vacation year the periods belong to.
content_typeintegerAbsence type of every period (NonWorkTimePlanSelectionType value).
descriptionstringDescription of the annual request.
statusstringDerived from the periods, see class comment.
requestsarray<NonWorkTimeRequest6>Non-work time requests created from the annual request.
Show fields (39)
overduebooleanU04: still waiting after the processing deadline.
approval_versionintegerVersion of the approval process.
change_modestringMode of a change to the request.
balance_override_reasonstringL11: why a planner approved this request although the projected vacation balance was negative.
coverage_override_reasonstringL54: why the approver accepted a day below the minimum staffing.
coverage_hintbooleanL53: handed in although it eats into the staffing buffer - the approvers see the hint.
sick_during_vacationbooleanU13: a sick report inside approved vacation - set by the server, shown as "während Urlaub".
consultation_notestringWho was consulted before requesting days a blocking period marks as consultation-only (U14).
daily_absence_start_timestringLocal daily absence window for half-day types; null preserves legacy planning.
daily_absence_end_timestringEnd time of daily absence.
idintegerPrimary key of the request. Internal ID.
userUser14User the request belongs to.
contractEmploymentContract11Employment contract the request belongs to.
descriptionstringDescription of the request.
startstring (date-time)Start of the requested period.
start_datestringStart date of the requested period.
start_monthintegerStart month of the requested period.
start_yearintegerStart year of the requested period.
endstring (date-time)End of the requested period.
end_datestringEnd date of the requested period.
end_monthintegerEnd month of the requested period.
end_yearintegerEnd year of the requested period.
durationnumber (float)duration in days linked to NonWorkTimePlan - a half day type counts 0.5 (Z6)
statusstringStatus of the request.
content_typestringType of the request, e.g. vacation or absence.
secondary_content_typestringSecondary type of the request.
linked_content_typeNonWorkTimePlanSelectionType3Plan selection type linked to the request.
attachmentsarray<Attachment10>Attachments of the request.
commentsarray<NonWorkTimeRequestComment5>Comments on the request.
plan_entriesarray<NonWorkTimePlan2>Plan entries generated for the request.
parent_requestNonWorkTimeRequest6The request this one changes ("Änderungsantrag zum Jahresurlaub"). A change request is an ordinary request in every other respect; the reference is what turns a second, unrelated looking request into a visible correction of the first - and what lets the days it withdraws be marked as withdrawn instead of merely refused.
annual_requestNonWorkTimeAnnualRequest3L47/L48: the annual plan ("Jahresurlaubsantrag") this period belongs to. The bundle is decided as a whole; the period stays an ordinary request in every other respect.
request_kindstringU02/U18: ANNUAL = period of the annual plan, SUPPLEMENT = Ergänzungsantrag for the held back flexible days. null = ordinary request.
processing_due_datestring (date-time)U04/U20: the day by which the request has to be decided, counted from its receipt.
escalated_atstring (date-time)U04: when the overdue escalation was sent; null = not (yet) escalated.
written_approval_reasonstringU21: why the management step with a written comment was added to this request (e.g. SUMMER_CANCELLATION); null = no extra written approval needed.
search_stringstringText that the entity can be searched by.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
curl --request POST \
--url https://your-instance.iw-erp.de/api/time/non_work_time_annual_request \
--header 'content-type: application/json' \
--header 'x-iw-jwt-token: <TOKEN>' \
--data '
{
"data": {
"description": "Text",
"year": 1,
"content_type": 1
}
}
'const options = {
method: 'POST',
headers: {'x-iw-jwt-token': '<TOKEN>', 'content-type': 'application/json'},
body: JSON.stringify({data: {description: 'Text', year: 1, content_type: 1}})
};
fetch('https://your-instance.iw-erp.de/api/time/non_work_time_annual_request', 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/non_work_time_annual_request"
payload = { "data": {
"description": "Text",
"year": 1,
"content_type": 1
} }
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/non_work_time_annual_request', [
'body' => '{"data":{"description":"Text","year":1,"content_type":1}}',
'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/non_work_time_annual_request"),
Headers =
{
{ "x-iw-jwt-token", "<TOKEN>" },
},
Content = new StringContent("{\"data\":{\"description\":\"Text\",\"year\":1,\"content_type\":1}}")
{
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, "{\"data\":{\"description\":\"Text\",\"year\":1,\"content_type\":1}}");
Request request = new Request.Builder()
.url("https://your-instance.iw-erp.de/api/time/non_work_time_annual_request")
.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/non_work_time_annual_request"
payload := strings.NewReader("{\"data\":{\"description\":\"Text\",\"year\":1,\"content_type\":1}}")
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/non_work_time_annual_request_controller.dart';
import 'package:iw_erp_api/logic/iw_api_state.dart';
import 'package:iw_erp_api/model/non_work_time_annual_request.dart';
IwApiState().host = 'your-instance.iw-erp.de';
IwApiState().currentJwtApiToken = '<TOKEN>';
final result = await NonWorkTimeAnnualRequestController.post(NonWorkTimeAnnualRequest.fromJson({
"description": "Text",
"year": 1,
"content_type": 1
}));
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"
},
"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"
},
"contract": {
"id": 42,
"description": "Text",
"staged_absence_approval": true,
"token": "string",
"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"
},
"week_total_hours": 1.5,
"week_total_days": 1.5,
"reserved_hours_preparation": 1.5,
"reserved_hours_follow_up": 1.5,
"reserved_hours_travel": 1.5
},
"created_by_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"
},
"year": 1,
"content_type": 1,
"status": "string",
"requests": [
{
"id": 42,
"description": "Text",
"overdue": true,
"approval_version": 1,
"change_mode": "string",
"balance_override_reason": "string",
"coverage_override_reason": "string",
"coverage_hint": true,
"sick_during_vacation": true,
"consultation_note": "string"
}
]
}Decide an annual request as a whole (L48): every open period the current session may decide gets the same decision; `declined_requests` lists period ids to refuse while the rest is approved.
PUT/api/time/non_work_time_annual_request/{id}/decide
Path parameters
idrequiredstring |
Query parameters
decisionrequiredstring | APPROVED or DECLINEDAllowed: APPROVEDDECLINED |
approval_commentstring | Written decision, mandatory for the management step |
declined_requestsstring | Comma separated ids of periods to refuse while approving the rest |
balance_override_reasonstring | L11 override reason |
Responses
200Decide all open periods of an annual requestNonWorkTimeAnnualRequest3
Show fields (12)
idintegerPrimary key of the annual request. Internal ID.
userUser14User the annual request belongs to.
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.
personCRMPerson10Person the annual request belongs to.
Show fields (81)
idintegerPrimary key of the person. Internal ID.
first_namestringFirst name of the person.
last_namestringLast name of the person.
numberintegerMember or customer number of the person.
manual_numberintegerNumber set manually instead of the automatic number.
number_stringstringMember or customer number as text, including prefix.
genderstringGender of the person.
titlestringAcademic or other title of the person.
positionstringPosition or role of the person.
languagestringPreferred language of the person.
special_salutationstringSpecial salutation text for letters.
form_of_salutationstringForm of salutation, for example formal or informal.
birthdaystring (date-time)Birthday of the person.
known_allergiesstringKnown allergies of the person.
confirmed_no_allergiesbooleanGuardian confirmed that there are no known allergies.
allow_photosbooleanPhotos of the person may be taken and published.
allow_leaving_alonebooleanThe person may leave the event alone.
authorized_pickupstringPersons who are allowed to pick up the person.
needs_supportbooleanThe person needs support, for example for inclusion.
support_descriptionstringDescription of the support the person needs.
financial_supportbooleanThe person receives financial support.
financial_support_numberstringNumber of the financial support.
municipal_supportbooleanThe person receives municipal support.
municipal_support_numberstringNumber of the municipal support.
grade_levelintegerSchool grade level of the person.
school_classstringSchool class of the person.
start_timestring (date-time)Start of the membership or activity.
start_time_reasonstringReason for the start.
end_timestring (date-time)End of the membership or activity.
end_time_reasonstringReason for the end.
confirmed_gtc_timestring (date-time)Time the general terms and conditions were confirmed.
chatbot_opt_inbooleanEinwilligung in die Nutzung des KI-Assistenten. Denormalisierter aktueller Stand - das pruefbare Protokoll steht in ChatbotConsent.
chatbot_opt_in_atstring (date-time)Time the person opted in to the chatbot.
chatbot_opt_in_text_versionstringVersion des Einwilligungstextes, dem zugestimmt wurde. Weicht sie von der aktuellen Version ab, ist das Opt-in abgelaufen.
app_usage_statistics_opt_outbooleanWiderspruch gegen die anonyme Nutzungsstatistik der Mitglieder-App. Die App liest ihn aus den StaticData und schickt dann nichts mehr; die gezaehlten Aufrufe selbst haben keinen Bezug zur Person.
crm_person_contact_dataarray<CRMPersonContactData>Contact data of the person, for example phone and e-mail.
archivedbooleanWhether the person is archived.
subscribed_newsletterbooleanWhether the person subscribed to the newsletter.
subscribed_magazinebooleanWhether the person subscribed to the magazine.
printed_member_cardbooleanWhether a member card has been printed for the person.
has_login_userbooleanWhether the person has a login user.
profile_picture_urlstringURL of the profile picture of the person.
log_book_staffbooleanLog book flag: staff.
log_book_staff1booleanLog book flag: staff, level 1.
log_book_staff2booleanLog book flag: staff, level 2.
log_book_memberbooleanLog book flag: member.
log_book_trainerbooleanLog book flag: trainer.
log_book_trainer1booleanLog book flag: trainer, level 1.
log_book_trainer2booleanLog book flag: trainer, level 2.
log_book_head_of_departmentbooleanLog book flag: head of department.
log_book_supervisory_boardbooleanLog book flag: supervisory board.
log_book_board_of_directorsbooleanLog book flag: board of directors.
log_book_honorary_memberbooleanLog book flag: honorary member.
log_book_club_card_onebooleanLog book flag: club card.
log_book_health_recoveredbooleanLog book flag: recovered from illness.
log_book_health_vaccinatedbooleanLog book flag: vaccinated.
log_book_health_vaccinated_additionstringDetails of the vaccination.
log_book_good_conductbooleanLog book flag: certificate of good conduct.
log_book_first_aidbooleanLog book flag: first aid training.
log_book_measles_vaccinationbooleanLog book flag: measles vaccination.
sync_lanistabooleanWhether the person is synchronized with Lanista.
categoryCRMPersonCategoryPerson category.
nicknamestringNickname of the person.
preferred_color_hexstringPreferred color of the person as hex value.
avatar_tokenstringToken of the avatar image.
search_stringstringText that the entity can be searched by.
addressstringAddress as text.
address_streetstringStreet of the address.
address_house_numberstringHouse number of the address.
address_street_levelstringStreet and house number of the address.
address_costringCare-of line of the address.
address_citystringCity of the address.
address_zipstringPostal code of the address.
address_admin_level1stringFirst administrative level of the address, e.g. the federal state.
address_countrystringCountry code of the address.
address_full_countrystringFull name of the country of the address.
address_geo_latstringLatitude of the address.
address_geo_lngstringLongitude of the address.
address_external_provider_idstringfield to store the external provider id of the address. e.g. Google Maps PlaceID like google:ChIJVcKw5r90sEcRhdjNq6NItqE
createdstring (date-time)Point in time the entity was created.
- … 2 more fields
contractEmploymentContract11Employment contract the annual request belongs to.
Show fields (43)
staged_absence_approvalbooleannull inherits group then organization policy; existing installations stay off.
idintegerPrimary key of the employment contract. Internal ID.
tokenstringPublic token of the contract. Used instead of the ID.
userUser14Login user of the employee.
week_total_hoursnumber (float)Total working hours per week.
week_total_daysnumber (float)Total working days per week.
reserved_hours_preparationnumber (float)L03: weekly hours reserved for Vorbereitung - part of the contract hours but not plannable in the shift plan. null = none.
reserved_hours_follow_upnumber (float)L03: weekly hours reserved for Nachbereitung - part of the contract hours but not plannable in the shift plan. null = none.
reserved_hours_travelnumber (float)L03: weekly hours reserved for Fahrt - part of the contract hours but not plannable in the shift plan. null = none.
reserved_hours_flexiblenumber (float)L03: weekly hours reserved for freie Einteilung - part of the contract hours but not plannable in the shift plan. null = none.
week_full_time_total_daysnumber (float)Total working days per week for a full-time contract.
year_vacation_daysnumber (float)Vacation days per year.
month_vacation_daysnumber (float)Vacation days per month.
year_vacation_weeksnumber (float)Vacation weeks per year.
monday_hoursnumber (float)Working hours on Monday.
tuesday_hoursnumber (float)Working hours on Tuesday.
wednesday_hoursnumber (float)Working hours on Wednesday.
thursday_hoursnumber (float)Working hours on Thursday.
friday_hoursnumber (float)Working hours on Friday.
saturday_hoursnumber (float)Working hours on Saturday.
sunday_hoursnumber (float)Working hours on Sunday.
netto_hour_costnumber (float)Net cost per hour.
brutto_hour_costnumber (float)Gross cost per hour.
startstring (date-time)Start date of the contract.
endstring (date-time)End date of the contract.
fixed_term_statusstringBefristung: PERMANENT (unbefristet, default), FIXED_TERM or EXTENDED (FIXED_TERM_STATUS_*).
fixed_term_endstring (date-time)Befristet bis (erster Zeitraum).
fixed_term_extension_endstring (date-time)Befristet bis nach Verlängerung.
probation_endstring (date-time)Probezeit bis; filled from the template's probationMonths when a contract is created without it.
numberstringContract number.
descriptionstringDescription of the contract.
archivedbooleanThe contract is archived.
allow_app_time_trackingbooleanThe employee may track time in the app.
allow_scanner_time_trackingbooleanThe employee may track time with the scanner.
allow_app_non_work_time_managementbooleanThe employee may manage absences in the app.
force_no_auto_breakbooleanAutomatic breaks are not added for this contract.
work_time_modestringHow the target working time is defined - null behaves as WEEKDAY_HOURS so existing contracts keep their previous behaviour unchanged.
holiday_credit_modestringHoliday credit for WEEK_TOTAL contracts - null behaves as WEEKDAY_TARGET (previous behaviour, only meaningful for WEEKDAY_HOURS contracts).
holiday_credit_fixed_secondsintegerFixed holiday credit in seconds.
planning_weekdays_bitmaskintegerISO weekday bitmask (Mo=1 ... So=64) of the days this WEEK_TOTAL contract can be planned / takes vacation on - null behaves as Mo-Fr.
request_lead_time_daysintegerDays an absence request has to be handed in ahead of its first day ("Bearbeitungs- frist"). null falls back to the contract group and from there to the installation wide setting, so an existing contract keeps behaving exactly as before.
shift_booking_syncbooleanL35: shifts as availabilities / appointments in the booking area; null inherits the group (which inherits the organisation).
search_stringstringText that the entity can be searched by.
created_by_userUser14User who created the annual request.
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.
yearintegerThe vacation year the periods belong to.
content_typeintegerAbsence type of every period (NonWorkTimePlanSelectionType value).
descriptionstringDescription of the annual request.
statusstringDerived from the periods, see class comment.
requestsarray<NonWorkTimeRequest6>Non-work time requests created from the annual request.
Show fields (39)
overduebooleanU04: still waiting after the processing deadline.
approval_versionintegerVersion of the approval process.
change_modestringMode of a change to the request.
balance_override_reasonstringL11: why a planner approved this request although the projected vacation balance was negative.
coverage_override_reasonstringL54: why the approver accepted a day below the minimum staffing.
coverage_hintbooleanL53: handed in although it eats into the staffing buffer - the approvers see the hint.
sick_during_vacationbooleanU13: a sick report inside approved vacation - set by the server, shown as "während Urlaub".
consultation_notestringWho was consulted before requesting days a blocking period marks as consultation-only (U14).
daily_absence_start_timestringLocal daily absence window for half-day types; null preserves legacy planning.
daily_absence_end_timestringEnd time of daily absence.
idintegerPrimary key of the request. Internal ID.
userUser14User the request belongs to.
contractEmploymentContract11Employment contract the request belongs to.
descriptionstringDescription of the request.
startstring (date-time)Start of the requested period.
start_datestringStart date of the requested period.
start_monthintegerStart month of the requested period.
start_yearintegerStart year of the requested period.
endstring (date-time)End of the requested period.
end_datestringEnd date of the requested period.
end_monthintegerEnd month of the requested period.
end_yearintegerEnd year of the requested period.
durationnumber (float)duration in days linked to NonWorkTimePlan - a half day type counts 0.5 (Z6)
statusstringStatus of the request.
content_typestringType of the request, e.g. vacation or absence.
secondary_content_typestringSecondary type of the request.
linked_content_typeNonWorkTimePlanSelectionType3Plan selection type linked to the request.
attachmentsarray<Attachment10>Attachments of the request.
commentsarray<NonWorkTimeRequestComment5>Comments on the request.
plan_entriesarray<NonWorkTimePlan2>Plan entries generated for the request.
parent_requestNonWorkTimeRequest6The request this one changes ("Änderungsantrag zum Jahresurlaub"). A change request is an ordinary request in every other respect; the reference is what turns a second, unrelated looking request into a visible correction of the first - and what lets the days it withdraws be marked as withdrawn instead of merely refused.
annual_requestNonWorkTimeAnnualRequest3L47/L48: the annual plan ("Jahresurlaubsantrag") this period belongs to. The bundle is decided as a whole; the period stays an ordinary request in every other respect.
request_kindstringU02/U18: ANNUAL = period of the annual plan, SUPPLEMENT = Ergänzungsantrag for the held back flexible days. null = ordinary request.
processing_due_datestring (date-time)U04/U20: the day by which the request has to be decided, counted from its receipt.
escalated_atstring (date-time)U04: when the overdue escalation was sent; null = not (yet) escalated.
written_approval_reasonstringU21: why the management step with a written comment was added to this request (e.g. SUMMER_CANCELLATION); null = no extra written approval needed.
search_stringstringText that the entity can be searched by.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
curl --request PUT \
--url 'https://your-instance.iw-erp.de/api/time/non_work_time_annual_request/42/decide?decision=APPROVED' \
--header 'x-iw-jwt-token: <TOKEN>'const options = {method: 'PUT', headers: {'x-iw-jwt-token': '<TOKEN>'}};
fetch('https://your-instance.iw-erp.de/api/time/non_work_time_annual_request/42/decide?decision=APPROVED', 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/non_work_time_annual_request/42/decide?decision=APPROVED"
headers = {"x-iw-jwt-token": "<TOKEN>"}
response = requests.put(url, 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/non_work_time_annual_request/42/decide?decision=APPROVED', [
'headers' => [
'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/non_work_time_annual_request/42/decide?decision=APPROVED"),
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/non_work_time_annual_request/42/decide?decision=APPROVED")
.put(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/non_work_time_annual_request/42/decide?decision=APPROVED"
req, _ := http.NewRequest("PUT", 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/non_work_time_annual_request_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 NonWorkTimeAnnualRequestController.decide(42, decision: 'APPROVED');
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"
},
"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"
},
"contract": {
"id": 42,
"description": "Text",
"staged_absence_approval": true,
"token": "string",
"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"
},
"week_total_hours": 1.5,
"week_total_days": 1.5,
"reserved_hours_preparation": 1.5,
"reserved_hours_follow_up": 1.5,
"reserved_hours_travel": 1.5
},
"created_by_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"
},
"year": 1,
"content_type": 1,
"status": "string",
"requests": [
{
"id": 42,
"description": "Text",
"overdue": true,
"approval_version": 1,
"change_mode": "string",
"balance_override_reason": "string",
"coverage_override_reason": "string",
"coverage_hint": true,
"sick_during_vacation": true,
"consultation_note": "string"
}
]
}Decide an annual request as a whole (L48): every open period the current session may decide gets the same decision; `declined_requests` lists period ids to refuse while the rest is approved.
PATCH/api/time/non_work_time_annual_request/{id}/decide
Path parameters
idrequiredstring |
Query parameters
decisionrequiredstring | APPROVED or DECLINEDAllowed: APPROVEDDECLINED |
approval_commentstring | Written decision, mandatory for the management step |
declined_requestsstring | Comma separated ids of periods to refuse while approving the rest |
balance_override_reasonstring | L11 override reason |
Responses
200Decide all open periods of an annual requestNonWorkTimeAnnualRequest3
Show fields (12)
idintegerPrimary key of the annual request. Internal ID.
userUser14User the annual request belongs to.
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.
personCRMPerson10Person the annual request belongs to.
Show fields (81)
idintegerPrimary key of the person. Internal ID.
first_namestringFirst name of the person.
last_namestringLast name of the person.
numberintegerMember or customer number of the person.
manual_numberintegerNumber set manually instead of the automatic number.
number_stringstringMember or customer number as text, including prefix.
genderstringGender of the person.
titlestringAcademic or other title of the person.
positionstringPosition or role of the person.
languagestringPreferred language of the person.
special_salutationstringSpecial salutation text for letters.
form_of_salutationstringForm of salutation, for example formal or informal.
birthdaystring (date-time)Birthday of the person.
known_allergiesstringKnown allergies of the person.
confirmed_no_allergiesbooleanGuardian confirmed that there are no known allergies.
allow_photosbooleanPhotos of the person may be taken and published.
allow_leaving_alonebooleanThe person may leave the event alone.
authorized_pickupstringPersons who are allowed to pick up the person.
needs_supportbooleanThe person needs support, for example for inclusion.
support_descriptionstringDescription of the support the person needs.
financial_supportbooleanThe person receives financial support.
financial_support_numberstringNumber of the financial support.
municipal_supportbooleanThe person receives municipal support.
municipal_support_numberstringNumber of the municipal support.
grade_levelintegerSchool grade level of the person.
school_classstringSchool class of the person.
start_timestring (date-time)Start of the membership or activity.
start_time_reasonstringReason for the start.
end_timestring (date-time)End of the membership or activity.
end_time_reasonstringReason for the end.
confirmed_gtc_timestring (date-time)Time the general terms and conditions were confirmed.
chatbot_opt_inbooleanEinwilligung in die Nutzung des KI-Assistenten. Denormalisierter aktueller Stand - das pruefbare Protokoll steht in ChatbotConsent.
chatbot_opt_in_atstring (date-time)Time the person opted in to the chatbot.
chatbot_opt_in_text_versionstringVersion des Einwilligungstextes, dem zugestimmt wurde. Weicht sie von der aktuellen Version ab, ist das Opt-in abgelaufen.
app_usage_statistics_opt_outbooleanWiderspruch gegen die anonyme Nutzungsstatistik der Mitglieder-App. Die App liest ihn aus den StaticData und schickt dann nichts mehr; die gezaehlten Aufrufe selbst haben keinen Bezug zur Person.
crm_person_contact_dataarray<CRMPersonContactData>Contact data of the person, for example phone and e-mail.
archivedbooleanWhether the person is archived.
subscribed_newsletterbooleanWhether the person subscribed to the newsletter.
subscribed_magazinebooleanWhether the person subscribed to the magazine.
printed_member_cardbooleanWhether a member card has been printed for the person.
has_login_userbooleanWhether the person has a login user.
profile_picture_urlstringURL of the profile picture of the person.
log_book_staffbooleanLog book flag: staff.
log_book_staff1booleanLog book flag: staff, level 1.
log_book_staff2booleanLog book flag: staff, level 2.
log_book_memberbooleanLog book flag: member.
log_book_trainerbooleanLog book flag: trainer.
log_book_trainer1booleanLog book flag: trainer, level 1.
log_book_trainer2booleanLog book flag: trainer, level 2.
log_book_head_of_departmentbooleanLog book flag: head of department.
log_book_supervisory_boardbooleanLog book flag: supervisory board.
log_book_board_of_directorsbooleanLog book flag: board of directors.
log_book_honorary_memberbooleanLog book flag: honorary member.
log_book_club_card_onebooleanLog book flag: club card.
log_book_health_recoveredbooleanLog book flag: recovered from illness.
log_book_health_vaccinatedbooleanLog book flag: vaccinated.
log_book_health_vaccinated_additionstringDetails of the vaccination.
log_book_good_conductbooleanLog book flag: certificate of good conduct.
log_book_first_aidbooleanLog book flag: first aid training.
log_book_measles_vaccinationbooleanLog book flag: measles vaccination.
sync_lanistabooleanWhether the person is synchronized with Lanista.
categoryCRMPersonCategoryPerson category.
nicknamestringNickname of the person.
preferred_color_hexstringPreferred color of the person as hex value.
avatar_tokenstringToken of the avatar image.
search_stringstringText that the entity can be searched by.
addressstringAddress as text.
address_streetstringStreet of the address.
address_house_numberstringHouse number of the address.
address_street_levelstringStreet and house number of the address.
address_costringCare-of line of the address.
address_citystringCity of the address.
address_zipstringPostal code of the address.
address_admin_level1stringFirst administrative level of the address, e.g. the federal state.
address_countrystringCountry code of the address.
address_full_countrystringFull name of the country of the address.
address_geo_latstringLatitude of the address.
address_geo_lngstringLongitude of the address.
address_external_provider_idstringfield to store the external provider id of the address. e.g. Google Maps PlaceID like google:ChIJVcKw5r90sEcRhdjNq6NItqE
createdstring (date-time)Point in time the entity was created.
- … 2 more fields
contractEmploymentContract11Employment contract the annual request belongs to.
Show fields (43)
staged_absence_approvalbooleannull inherits group then organization policy; existing installations stay off.
idintegerPrimary key of the employment contract. Internal ID.
tokenstringPublic token of the contract. Used instead of the ID.
userUser14Login user of the employee.
week_total_hoursnumber (float)Total working hours per week.
week_total_daysnumber (float)Total working days per week.
reserved_hours_preparationnumber (float)L03: weekly hours reserved for Vorbereitung - part of the contract hours but not plannable in the shift plan. null = none.
reserved_hours_follow_upnumber (float)L03: weekly hours reserved for Nachbereitung - part of the contract hours but not plannable in the shift plan. null = none.
reserved_hours_travelnumber (float)L03: weekly hours reserved for Fahrt - part of the contract hours but not plannable in the shift plan. null = none.
reserved_hours_flexiblenumber (float)L03: weekly hours reserved for freie Einteilung - part of the contract hours but not plannable in the shift plan. null = none.
week_full_time_total_daysnumber (float)Total working days per week for a full-time contract.
year_vacation_daysnumber (float)Vacation days per year.
month_vacation_daysnumber (float)Vacation days per month.
year_vacation_weeksnumber (float)Vacation weeks per year.
monday_hoursnumber (float)Working hours on Monday.
tuesday_hoursnumber (float)Working hours on Tuesday.
wednesday_hoursnumber (float)Working hours on Wednesday.
thursday_hoursnumber (float)Working hours on Thursday.
friday_hoursnumber (float)Working hours on Friday.
saturday_hoursnumber (float)Working hours on Saturday.
sunday_hoursnumber (float)Working hours on Sunday.
netto_hour_costnumber (float)Net cost per hour.
brutto_hour_costnumber (float)Gross cost per hour.
startstring (date-time)Start date of the contract.
endstring (date-time)End date of the contract.
fixed_term_statusstringBefristung: PERMANENT (unbefristet, default), FIXED_TERM or EXTENDED (FIXED_TERM_STATUS_*).
fixed_term_endstring (date-time)Befristet bis (erster Zeitraum).
fixed_term_extension_endstring (date-time)Befristet bis nach Verlängerung.
probation_endstring (date-time)Probezeit bis; filled from the template's probationMonths when a contract is created without it.
numberstringContract number.
descriptionstringDescription of the contract.
archivedbooleanThe contract is archived.
allow_app_time_trackingbooleanThe employee may track time in the app.
allow_scanner_time_trackingbooleanThe employee may track time with the scanner.
allow_app_non_work_time_managementbooleanThe employee may manage absences in the app.
force_no_auto_breakbooleanAutomatic breaks are not added for this contract.
work_time_modestringHow the target working time is defined - null behaves as WEEKDAY_HOURS so existing contracts keep their previous behaviour unchanged.
holiday_credit_modestringHoliday credit for WEEK_TOTAL contracts - null behaves as WEEKDAY_TARGET (previous behaviour, only meaningful for WEEKDAY_HOURS contracts).
holiday_credit_fixed_secondsintegerFixed holiday credit in seconds.
planning_weekdays_bitmaskintegerISO weekday bitmask (Mo=1 ... So=64) of the days this WEEK_TOTAL contract can be planned / takes vacation on - null behaves as Mo-Fr.
request_lead_time_daysintegerDays an absence request has to be handed in ahead of its first day ("Bearbeitungs- frist"). null falls back to the contract group and from there to the installation wide setting, so an existing contract keeps behaving exactly as before.
shift_booking_syncbooleanL35: shifts as availabilities / appointments in the booking area; null inherits the group (which inherits the organisation).
search_stringstringText that the entity can be searched by.
created_by_userUser14User who created the annual request.
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.
yearintegerThe vacation year the periods belong to.
content_typeintegerAbsence type of every period (NonWorkTimePlanSelectionType value).
descriptionstringDescription of the annual request.
statusstringDerived from the periods, see class comment.
requestsarray<NonWorkTimeRequest6>Non-work time requests created from the annual request.
Show fields (39)
overduebooleanU04: still waiting after the processing deadline.
approval_versionintegerVersion of the approval process.
change_modestringMode of a change to the request.
balance_override_reasonstringL11: why a planner approved this request although the projected vacation balance was negative.
coverage_override_reasonstringL54: why the approver accepted a day below the minimum staffing.
coverage_hintbooleanL53: handed in although it eats into the staffing buffer - the approvers see the hint.
sick_during_vacationbooleanU13: a sick report inside approved vacation - set by the server, shown as "während Urlaub".
consultation_notestringWho was consulted before requesting days a blocking period marks as consultation-only (U14).
daily_absence_start_timestringLocal daily absence window for half-day types; null preserves legacy planning.
daily_absence_end_timestringEnd time of daily absence.
idintegerPrimary key of the request. Internal ID.
userUser14User the request belongs to.
contractEmploymentContract11Employment contract the request belongs to.
descriptionstringDescription of the request.
startstring (date-time)Start of the requested period.
start_datestringStart date of the requested period.
start_monthintegerStart month of the requested period.
start_yearintegerStart year of the requested period.
endstring (date-time)End of the requested period.
end_datestringEnd date of the requested period.
end_monthintegerEnd month of the requested period.
end_yearintegerEnd year of the requested period.
durationnumber (float)duration in days linked to NonWorkTimePlan - a half day type counts 0.5 (Z6)
statusstringStatus of the request.
content_typestringType of the request, e.g. vacation or absence.
secondary_content_typestringSecondary type of the request.
linked_content_typeNonWorkTimePlanSelectionType3Plan selection type linked to the request.
attachmentsarray<Attachment10>Attachments of the request.
commentsarray<NonWorkTimeRequestComment5>Comments on the request.
plan_entriesarray<NonWorkTimePlan2>Plan entries generated for the request.
parent_requestNonWorkTimeRequest6The request this one changes ("Änderungsantrag zum Jahresurlaub"). A change request is an ordinary request in every other respect; the reference is what turns a second, unrelated looking request into a visible correction of the first - and what lets the days it withdraws be marked as withdrawn instead of merely refused.
annual_requestNonWorkTimeAnnualRequest3L47/L48: the annual plan ("Jahresurlaubsantrag") this period belongs to. The bundle is decided as a whole; the period stays an ordinary request in every other respect.
request_kindstringU02/U18: ANNUAL = period of the annual plan, SUPPLEMENT = Ergänzungsantrag for the held back flexible days. null = ordinary request.
processing_due_datestring (date-time)U04/U20: the day by which the request has to be decided, counted from its receipt.
escalated_atstring (date-time)U04: when the overdue escalation was sent; null = not (yet) escalated.
written_approval_reasonstringU21: why the management step with a written comment was added to this request (e.g. SUMMER_CANCELLATION); null = no extra written approval needed.
search_stringstringText that the entity can be searched by.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
curl --request PATCH \
--url 'https://your-instance.iw-erp.de/api/time/non_work_time_annual_request/42/decide?decision=APPROVED' \
--header 'x-iw-jwt-token: <TOKEN>'const options = {method: 'PATCH', headers: {'x-iw-jwt-token': '<TOKEN>'}};
fetch('https://your-instance.iw-erp.de/api/time/non_work_time_annual_request/42/decide?decision=APPROVED', 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/non_work_time_annual_request/42/decide?decision=APPROVED"
headers = {"x-iw-jwt-token": "<TOKEN>"}
response = requests.patch(url, 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/non_work_time_annual_request/42/decide?decision=APPROVED', [
'headers' => [
'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/non_work_time_annual_request/42/decide?decision=APPROVED"),
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/non_work_time_annual_request/42/decide?decision=APPROVED")
.patch(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/non_work_time_annual_request/42/decide?decision=APPROVED"
req, _ := http.NewRequest("PATCH", 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 package:http (no controller in the iw_erp_api package)
import 'package:http/http.dart' as http;
final response = await http.patch(
Uri.parse('https://your-instance.iw-erp.de/api/time/non_work_time_annual_request/42/decide').replace(queryParameters: {'decision': 'APPROVED'}),
headers: {'x-iw-jwt-token': '<TOKEN>'},
);
print(response.body);{
"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"
},
"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"
},
"contract": {
"id": 42,
"description": "Text",
"staged_absence_approval": true,
"token": "string",
"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"
},
"week_total_hours": 1.5,
"week_total_days": 1.5,
"reserved_hours_preparation": 1.5,
"reserved_hours_follow_up": 1.5,
"reserved_hours_travel": 1.5
},
"created_by_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"
},
"year": 1,
"content_type": 1,
"status": "string",
"requests": [
{
"id": 42,
"description": "Text",
"overdue": true,
"approval_version": 1,
"change_mode": "string",
"balance_override_reason": "string",
"coverage_override_reason": "string",
"coverage_hint": true,
"sick_during_vacation": true,
"consultation_note": "string"
}
]
}