ShiftPlanTemplate
Publishes a whole week in one transaction - all or nothing
POST/api/time/shift_plan_template/publish_week
Query parameters
idinteger | |
startDatestring | |
startMonthstring | |
startYearstring | |
employmentContractGroupstring | Planning container - mandatory even when a person of another group helps out. |
personstring | |
userstring | |
shiftTypestring | Origin type - times were copied, the reference is informational. |
statusstring | |
contractstring | |
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
200Returns the published ShiftPlanEntry objectsarray<ShiftPlanEntry>
Show fields (23)
idintegerPrimary key of the shift plan entry. Internal ID.
userUser14Login user assigned to the shift.
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 assigned to the shift.
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
employment_contract_groupEmploymentContractGroupPlanning container - mandatory even when a person of another group helps out.
Show fields (25)
staged_absence_approvalbooleannull inherits the organization; false explicitly disables staged approval.
shift_booking_syncbooleanL35: shifts as availabilities / appointments in the booking area; null inherits the organisation, false switches it off for this group.
idintegerPrimary key of the contract group. Internal ID.
week_total_hoursnumber (float)Total working hours per week.
week_total_daysnumber (float)Working days per week.
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.
allow_app_time_trackingbooleanWhether time tracking in the app is allowed.
allow_scanner_time_trackingbooleanWhether time tracking with a scanner is allowed.
allow_app_non_work_time_managementbooleanWhether non-work time can be managed in the app.
request_lead_time_daysintegerDays an absence request of this group has to be handed in ahead of its first day. null falls back to the installation wide setting - an existing group therefore behaves exactly as before.
school_holiday_regionSchoolHolidayRegionU09: the school calendar of this group when it differs from the organisation's (apprentices attending school in another Bundesland). null = the organisation's.
search_stringstringText that the entity can be searched by.
deletedbooleanThis property is used to mark an entity as deleted / archived
namestringName of the entity.
shift_typeShiftType4Origin type - times were copied, the reference is informational.
Show fields (17)
idintegerPrimary key of the shift type. Internal ID.
employment_contract_groupEmploymentContractGroupGroup this type belongs to (null = available for the whole organization / installation).
employment_organizationEmploymentOrganization5Organization the shift type belongs to.
short_namestringShort code for grids and print ("F", "S", "N").
start_timestringDefault start time as HH:MM.
end_timestringDefault end time as HH:MM - an end time before the start time means the shift ends on the following day (night shift).
break_duration_secondsintegerBreak duration of the shift in seconds.
colorstringColor of the shift type in the shift plan, as hex code.
required_qualificationEmploymentQualification3Default qualification requirement for shifts of this type.
qualification_match_modestringL18: EXACT demands the required qualification itself; EQUIVALENT (default, previous behaviour) also accepts linked or same-group qualifications with sufficient ranking.
default_staff_countintegerDefault number of staff needed for the shift.
sort_orderintegerSort order of the shift type in lists.
search_stringstringText that the entity can be searched by.
deletedbooleanThis property is used to mark an entity as deleted / archived
namestringName of the entity.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
startstring (date-time)Start of the shift.
endstring (date-time)End of the shift.
start_datestringStart date of the shift as text.
start_monthintegerMonth of the shift.
start_yearintegerYear of the shift.
break_duration_secondsintegerBreak duration of the shift in seconds.
durationintegerTarget seconds: (end - start) - break, maintained by recalculate().
required_qualificationEmploymentQualification3Qualification required for the shift.
Show fields (7)
idintegerPrimary key of the employment qualification. Internal ID.
rankingintegerRanking within an equivalence network - a linked qualification with a higher or equal ranking also satisfies requirements for this qualification.
equivalent_qualificationsarray<EmploymentQualification3>Linked ("equivalent") qualifications. Kept symmetric by the controller: every link A->B is mirrored as B->A, the ranking decides which direction actually covers which.
qualification_groupEmploymentQualificationGroupL17/A06: the "drawer" this qualification belongs to. Members of one group cover each other's requirements within their ranking, like a direct link would.
search_stringstringText that the entity can be searched by.
deletedbooleanThis property is used to mark an entity as deleted / archived
namestringName of the entity.
qualification_match_modestringL18: EXACT demands the required qualification itself; EQUIVALENT (default, previous behaviour) also accepts linked or same-group qualifications with sufficient ranking.
statusstringStatus of the shift, for example planned or published.
published_atstring (date-time)Time the shift was published.
descriptionstringDescription of the shift.
has_warningbooleanPersisted conflict flag for list badges - the concrete warnings are computed on demand (ShiftPlanHelper) and returned transiently.
availability_bookingBaseBooking13L35: the availability the published shift stands for in the booking area (kept in step by ShiftBookingSyncHelper while the sync is switched on for the contract).
Show fields (17)
idintegerPrimary key of the booking. Internal ID.
start_timestring (date-time)Start of the booking.
end_timestring (date-time)End of the booking.
booking_typestringType of the booking, for example normal or substitution.
booking_statusstringStatus of the booking, for example planned, done or cancelled.
externalbooleanThe booking was made by an external party.
modified_timebooleanThe time of the booking was changed after it was created.
modified_locationbooleanThe location of the booking was changed after it was created.
modified_bookablebooleanThe bookable of the booking was changed after it was created.
modified_performing_personbooleanThe leader of the booking was changed after it was created.
searching_for_performing_personbooleanA leader for the booking is still being searched for.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
namestringName of the entity.
deletedbooleanThis property is used to mark an entity as deleted / archived
colorstringBackground color as hex value.
fg_colorstringForeground color as hex value.
bookingBaseBooking13L35: the appointment created from this shift, if any.
Show fields (17)
idintegerPrimary key of the booking. Internal ID.
start_timestring (date-time)Start of the booking.
end_timestring (date-time)End of the booking.
booking_typestringType of the booking, for example normal or substitution.
booking_statusstringStatus of the booking, for example planned, done or cancelled.
externalbooleanThe booking was made by an external party.
modified_timebooleanThe time of the booking was changed after it was created.
modified_locationbooleanThe location of the booking was changed after it was created.
modified_bookablebooleanThe bookable of the booking was changed after it was created.
modified_performing_personbooleanThe leader of the booking was changed after it was created.
searching_for_performing_personbooleanA leader for the booking is still being searched for.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
namestringName of the entity.
deletedbooleanThis property is used to mark an entity as deleted / archived
colorstringBackground color as hex value.
fg_colorstringForeground color as hex value.
lock_versionintegerOptimistic lock. Two planners editing the same shift, or publishing a week while someone else moves a shift inside it, would otherwise silently overwrite each other - the loser now gets a 409 instead. Read only: Doctrine owns the value, the client echoes the one it last saw back as the lock_version query parameter.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
curl --request POST \
--url https://your-instance.iw-erp.de/api/time/shift_plan_template/publish_week \
--header 'x-iw-jwt-token: <TOKEN>'const options = {method: 'POST', headers: {'x-iw-jwt-token': '<TOKEN>'}};
fetch('https://your-instance.iw-erp.de/api/time/shift_plan_template/publish_week', 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/shift_plan_template/publish_week"
headers = {"x-iw-jwt-token": "<TOKEN>"}
response = requests.post(url, 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/shift_plan_template/publish_week', [
'headers' => [
'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/shift_plan_template/publish_week"),
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/shift_plan_template/publish_week")
.post(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/shift_plan_template/publish_week"
req, _ := http.NewRequest("POST", 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/shift_plan_template_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 ShiftPlanTemplateController.publishWeek(weekStart: '…');
if (result.success) {
print(result.data);
}[
{
"id": 42,
"description": "Text",
"user": {
"id": 42,
"name": "Beispiel",
"username": "lena.hartmann@example.org",
"email": "lena.hartmann@example.org",
"profile_picture_url": "https://vynst.de",
"positioningeneral": "string",
"archived": true,
"require2fa": true,
"search_string": "string"
},
"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"
},
"employment_contract_group": {
"id": 42,
"name": "Beispiel",
"staged_absence_approval": true,
"shift_booking_sync": true,
"week_total_hours": 1.5,
"week_total_days": 1.5,
"year_vacation_days": 1.5,
"month_vacation_days": 1.5,
"year_vacation_weeks": 1.5,
"monday_hours": 1.5
},
"shift_type": {
"id": 42,
"short_name": "Beispiel",
"color": "#3f5efb",
"name": "Beispiel",
"start_time": "string",
"end_time": "string",
"break_duration_seconds": 1,
"qualification_match_mode": "string",
"default_staff_count": 1,
"sort_order": 1
},
"start": "2026-10-15T09:30:00+02:00",
"end": "2026-10-15T09:30:00+02:00",
"start_date": "2026-10-15T09:30:00+02:00",
"start_month": 1
}
]Copies all shifts of one week into another week as DRAFT shifts
POST/api/time/shift_plan_template/copy_week
Query parameters
idinteger | |
startDatestring | |
startMonthstring | |
startYearstring | |
employmentContractGroupstring | Planning container - mandatory even when a person of another group helps out. |
personstring | |
userstring | |
shiftTypestring | Origin type - times were copied, the reference is informational. |
statusstring | |
contractstring | |
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
200Returns the created ShiftPlanEntry objectsarray<ShiftPlanEntry>
Show fields (23)
idintegerPrimary key of the shift plan entry. Internal ID.
userUser14Login user assigned to the shift.
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 assigned to the shift.
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
employment_contract_groupEmploymentContractGroupPlanning container - mandatory even when a person of another group helps out.
Show fields (25)
staged_absence_approvalbooleannull inherits the organization; false explicitly disables staged approval.
shift_booking_syncbooleanL35: shifts as availabilities / appointments in the booking area; null inherits the organisation, false switches it off for this group.
idintegerPrimary key of the contract group. Internal ID.
week_total_hoursnumber (float)Total working hours per week.
week_total_daysnumber (float)Working days per week.
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.
allow_app_time_trackingbooleanWhether time tracking in the app is allowed.
allow_scanner_time_trackingbooleanWhether time tracking with a scanner is allowed.
allow_app_non_work_time_managementbooleanWhether non-work time can be managed in the app.
request_lead_time_daysintegerDays an absence request of this group has to be handed in ahead of its first day. null falls back to the installation wide setting - an existing group therefore behaves exactly as before.
school_holiday_regionSchoolHolidayRegionU09: the school calendar of this group when it differs from the organisation's (apprentices attending school in another Bundesland). null = the organisation's.
search_stringstringText that the entity can be searched by.
deletedbooleanThis property is used to mark an entity as deleted / archived
namestringName of the entity.
shift_typeShiftType4Origin type - times were copied, the reference is informational.
Show fields (17)
idintegerPrimary key of the shift type. Internal ID.
employment_contract_groupEmploymentContractGroupGroup this type belongs to (null = available for the whole organization / installation).
employment_organizationEmploymentOrganization5Organization the shift type belongs to.
short_namestringShort code for grids and print ("F", "S", "N").
start_timestringDefault start time as HH:MM.
end_timestringDefault end time as HH:MM - an end time before the start time means the shift ends on the following day (night shift).
break_duration_secondsintegerBreak duration of the shift in seconds.
colorstringColor of the shift type in the shift plan, as hex code.
required_qualificationEmploymentQualification3Default qualification requirement for shifts of this type.
qualification_match_modestringL18: EXACT demands the required qualification itself; EQUIVALENT (default, previous behaviour) also accepts linked or same-group qualifications with sufficient ranking.
default_staff_countintegerDefault number of staff needed for the shift.
sort_orderintegerSort order of the shift type in lists.
search_stringstringText that the entity can be searched by.
deletedbooleanThis property is used to mark an entity as deleted / archived
namestringName of the entity.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
startstring (date-time)Start of the shift.
endstring (date-time)End of the shift.
start_datestringStart date of the shift as text.
start_monthintegerMonth of the shift.
start_yearintegerYear of the shift.
break_duration_secondsintegerBreak duration of the shift in seconds.
durationintegerTarget seconds: (end - start) - break, maintained by recalculate().
required_qualificationEmploymentQualification3Qualification required for the shift.
Show fields (7)
idintegerPrimary key of the employment qualification. Internal ID.
rankingintegerRanking within an equivalence network - a linked qualification with a higher or equal ranking also satisfies requirements for this qualification.
equivalent_qualificationsarray<EmploymentQualification3>Linked ("equivalent") qualifications. Kept symmetric by the controller: every link A->B is mirrored as B->A, the ranking decides which direction actually covers which.
qualification_groupEmploymentQualificationGroupL17/A06: the "drawer" this qualification belongs to. Members of one group cover each other's requirements within their ranking, like a direct link would.
search_stringstringText that the entity can be searched by.
deletedbooleanThis property is used to mark an entity as deleted / archived
namestringName of the entity.
qualification_match_modestringL18: EXACT demands the required qualification itself; EQUIVALENT (default, previous behaviour) also accepts linked or same-group qualifications with sufficient ranking.
statusstringStatus of the shift, for example planned or published.
published_atstring (date-time)Time the shift was published.
descriptionstringDescription of the shift.
has_warningbooleanPersisted conflict flag for list badges - the concrete warnings are computed on demand (ShiftPlanHelper) and returned transiently.
availability_bookingBaseBooking13L35: the availability the published shift stands for in the booking area (kept in step by ShiftBookingSyncHelper while the sync is switched on for the contract).
Show fields (17)
idintegerPrimary key of the booking. Internal ID.
start_timestring (date-time)Start of the booking.
end_timestring (date-time)End of the booking.
booking_typestringType of the booking, for example normal or substitution.
booking_statusstringStatus of the booking, for example planned, done or cancelled.
externalbooleanThe booking was made by an external party.
modified_timebooleanThe time of the booking was changed after it was created.
modified_locationbooleanThe location of the booking was changed after it was created.
modified_bookablebooleanThe bookable of the booking was changed after it was created.
modified_performing_personbooleanThe leader of the booking was changed after it was created.
searching_for_performing_personbooleanA leader for the booking is still being searched for.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
namestringName of the entity.
deletedbooleanThis property is used to mark an entity as deleted / archived
colorstringBackground color as hex value.
fg_colorstringForeground color as hex value.
bookingBaseBooking13L35: the appointment created from this shift, if any.
Show fields (17)
idintegerPrimary key of the booking. Internal ID.
start_timestring (date-time)Start of the booking.
end_timestring (date-time)End of the booking.
booking_typestringType of the booking, for example normal or substitution.
booking_statusstringStatus of the booking, for example planned, done or cancelled.
externalbooleanThe booking was made by an external party.
modified_timebooleanThe time of the booking was changed after it was created.
modified_locationbooleanThe location of the booking was changed after it was created.
modified_bookablebooleanThe bookable of the booking was changed after it was created.
modified_performing_personbooleanThe leader of the booking was changed after it was created.
searching_for_performing_personbooleanA leader for the booking is still being searched for.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
namestringName of the entity.
deletedbooleanThis property is used to mark an entity as deleted / archived
colorstringBackground color as hex value.
fg_colorstringForeground color as hex value.
lock_versionintegerOptimistic lock. Two planners editing the same shift, or publishing a week while someone else moves a shift inside it, would otherwise silently overwrite each other - the loser now gets a 409 instead. Read only: Doctrine owns the value, the client echoes the one it last saw back as the lock_version query parameter.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
curl --request POST \
--url https://your-instance.iw-erp.de/api/time/shift_plan_template/copy_week \
--header 'x-iw-jwt-token: <TOKEN>'const options = {method: 'POST', headers: {'x-iw-jwt-token': '<TOKEN>'}};
fetch('https://your-instance.iw-erp.de/api/time/shift_plan_template/copy_week', 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/shift_plan_template/copy_week"
headers = {"x-iw-jwt-token": "<TOKEN>"}
response = requests.post(url, 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/shift_plan_template/copy_week', [
'headers' => [
'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/shift_plan_template/copy_week"),
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/shift_plan_template/copy_week")
.post(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/shift_plan_template/copy_week"
req, _ := http.NewRequest("POST", 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/shift_plan_template_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 ShiftPlanTemplateController.copyWeek(sourceWeekStart: '…', targetWeekStart: '…');
if (result.success) {
print(result.data);
}[
{
"id": 42,
"description": "Text",
"user": {
"id": 42,
"name": "Beispiel",
"username": "lena.hartmann@example.org",
"email": "lena.hartmann@example.org",
"profile_picture_url": "https://vynst.de",
"positioningeneral": "string",
"archived": true,
"require2fa": true,
"search_string": "string"
},
"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"
},
"employment_contract_group": {
"id": 42,
"name": "Beispiel",
"staged_absence_approval": true,
"shift_booking_sync": true,
"week_total_hours": 1.5,
"week_total_days": 1.5,
"year_vacation_days": 1.5,
"month_vacation_days": 1.5,
"year_vacation_weeks": 1.5,
"monday_hours": 1.5
},
"shift_type": {
"id": 42,
"short_name": "Beispiel",
"color": "#3f5efb",
"name": "Beispiel",
"start_time": "string",
"end_time": "string",
"break_duration_seconds": 1,
"qualification_match_mode": "string",
"default_staff_count": 1,
"sort_order": 1
},
"start": "2026-10-15T09:30:00+02:00",
"end": "2026-10-15T09:30:00+02:00",
"start_date": "2026-10-15T09:30:00+02:00",
"start_month": 1
}
]Applies a week template to a week - creates open DRAFT shifts, never touches existing ones
POST/api/time/shift_plan_template/{id}/apply
Path parameters
idrequiredstring |
Query parameters
idinteger | |
startDatestring | |
startMonthstring | |
startYearstring | |
employmentContractGroupstring | Planning container - mandatory even when a person of another group helps out. |
personstring | |
userstring | |
shiftTypestring | Origin type - times were copied, the reference is informational. |
statusstring | |
contractstring | |
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
200Returns the created ShiftPlanEntry objectsarray<ShiftPlanEntry>
Show fields (23)
idintegerPrimary key of the shift plan entry. Internal ID.
userUser14Login user assigned to the shift.
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 assigned to the shift.
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
employment_contract_groupEmploymentContractGroupPlanning container - mandatory even when a person of another group helps out.
Show fields (25)
staged_absence_approvalbooleannull inherits the organization; false explicitly disables staged approval.
shift_booking_syncbooleanL35: shifts as availabilities / appointments in the booking area; null inherits the organisation, false switches it off for this group.
idintegerPrimary key of the contract group. Internal ID.
week_total_hoursnumber (float)Total working hours per week.
week_total_daysnumber (float)Working days per week.
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.
allow_app_time_trackingbooleanWhether time tracking in the app is allowed.
allow_scanner_time_trackingbooleanWhether time tracking with a scanner is allowed.
allow_app_non_work_time_managementbooleanWhether non-work time can be managed in the app.
request_lead_time_daysintegerDays an absence request of this group has to be handed in ahead of its first day. null falls back to the installation wide setting - an existing group therefore behaves exactly as before.
school_holiday_regionSchoolHolidayRegionU09: the school calendar of this group when it differs from the organisation's (apprentices attending school in another Bundesland). null = the organisation's.
search_stringstringText that the entity can be searched by.
deletedbooleanThis property is used to mark an entity as deleted / archived
namestringName of the entity.
shift_typeShiftType4Origin type - times were copied, the reference is informational.
Show fields (17)
idintegerPrimary key of the shift type. Internal ID.
employment_contract_groupEmploymentContractGroupGroup this type belongs to (null = available for the whole organization / installation).
employment_organizationEmploymentOrganization5Organization the shift type belongs to.
short_namestringShort code for grids and print ("F", "S", "N").
start_timestringDefault start time as HH:MM.
end_timestringDefault end time as HH:MM - an end time before the start time means the shift ends on the following day (night shift).
break_duration_secondsintegerBreak duration of the shift in seconds.
colorstringColor of the shift type in the shift plan, as hex code.
required_qualificationEmploymentQualification3Default qualification requirement for shifts of this type.
qualification_match_modestringL18: EXACT demands the required qualification itself; EQUIVALENT (default, previous behaviour) also accepts linked or same-group qualifications with sufficient ranking.
default_staff_countintegerDefault number of staff needed for the shift.
sort_orderintegerSort order of the shift type in lists.
search_stringstringText that the entity can be searched by.
deletedbooleanThis property is used to mark an entity as deleted / archived
namestringName of the entity.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
startstring (date-time)Start of the shift.
endstring (date-time)End of the shift.
start_datestringStart date of the shift as text.
start_monthintegerMonth of the shift.
start_yearintegerYear of the shift.
break_duration_secondsintegerBreak duration of the shift in seconds.
durationintegerTarget seconds: (end - start) - break, maintained by recalculate().
required_qualificationEmploymentQualification3Qualification required for the shift.
Show fields (7)
idintegerPrimary key of the employment qualification. Internal ID.
rankingintegerRanking within an equivalence network - a linked qualification with a higher or equal ranking also satisfies requirements for this qualification.
equivalent_qualificationsarray<EmploymentQualification3>Linked ("equivalent") qualifications. Kept symmetric by the controller: every link A->B is mirrored as B->A, the ranking decides which direction actually covers which.
qualification_groupEmploymentQualificationGroupL17/A06: the "drawer" this qualification belongs to. Members of one group cover each other's requirements within their ranking, like a direct link would.
search_stringstringText that the entity can be searched by.
deletedbooleanThis property is used to mark an entity as deleted / archived
namestringName of the entity.
qualification_match_modestringL18: EXACT demands the required qualification itself; EQUIVALENT (default, previous behaviour) also accepts linked or same-group qualifications with sufficient ranking.
statusstringStatus of the shift, for example planned or published.
published_atstring (date-time)Time the shift was published.
descriptionstringDescription of the shift.
has_warningbooleanPersisted conflict flag for list badges - the concrete warnings are computed on demand (ShiftPlanHelper) and returned transiently.
availability_bookingBaseBooking13L35: the availability the published shift stands for in the booking area (kept in step by ShiftBookingSyncHelper while the sync is switched on for the contract).
Show fields (17)
idintegerPrimary key of the booking. Internal ID.
start_timestring (date-time)Start of the booking.
end_timestring (date-time)End of the booking.
booking_typestringType of the booking, for example normal or substitution.
booking_statusstringStatus of the booking, for example planned, done or cancelled.
externalbooleanThe booking was made by an external party.
modified_timebooleanThe time of the booking was changed after it was created.
modified_locationbooleanThe location of the booking was changed after it was created.
modified_bookablebooleanThe bookable of the booking was changed after it was created.
modified_performing_personbooleanThe leader of the booking was changed after it was created.
searching_for_performing_personbooleanA leader for the booking is still being searched for.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
namestringName of the entity.
deletedbooleanThis property is used to mark an entity as deleted / archived
colorstringBackground color as hex value.
fg_colorstringForeground color as hex value.
bookingBaseBooking13L35: the appointment created from this shift, if any.
Show fields (17)
idintegerPrimary key of the booking. Internal ID.
start_timestring (date-time)Start of the booking.
end_timestring (date-time)End of the booking.
booking_typestringType of the booking, for example normal or substitution.
booking_statusstringStatus of the booking, for example planned, done or cancelled.
externalbooleanThe booking was made by an external party.
modified_timebooleanThe time of the booking was changed after it was created.
modified_locationbooleanThe location of the booking was changed after it was created.
modified_bookablebooleanThe bookable of the booking was changed after it was created.
modified_performing_personbooleanThe leader of the booking was changed after it was created.
searching_for_performing_personbooleanA leader for the booking is still being searched for.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
namestringName of the entity.
deletedbooleanThis property is used to mark an entity as deleted / archived
colorstringBackground color as hex value.
fg_colorstringForeground color as hex value.
lock_versionintegerOptimistic lock. Two planners editing the same shift, or publishing a week while someone else moves a shift inside it, would otherwise silently overwrite each other - the loser now gets a 409 instead. Read only: Doctrine owns the value, the client echoes the one it last saw back as the lock_version query parameter.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
curl --request POST \
--url https://your-instance.iw-erp.de/api/time/shift_plan_template/42/apply \
--header 'x-iw-jwt-token: <TOKEN>'const options = {method: 'POST', headers: {'x-iw-jwt-token': '<TOKEN>'}};
fetch('https://your-instance.iw-erp.de/api/time/shift_plan_template/42/apply', 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/shift_plan_template/42/apply"
headers = {"x-iw-jwt-token": "<TOKEN>"}
response = requests.post(url, 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/shift_plan_template/42/apply', [
'headers' => [
'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/shift_plan_template/42/apply"),
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/shift_plan_template/42/apply")
.post(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/shift_plan_template/42/apply"
req, _ := http.NewRequest("POST", 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/shift_plan_template_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 ShiftPlanTemplateController.applyToWeek(42, weekStart: '…');
if (result.success) {
print(result.data);
}[
{
"id": 42,
"description": "Text",
"user": {
"id": 42,
"name": "Beispiel",
"username": "lena.hartmann@example.org",
"email": "lena.hartmann@example.org",
"profile_picture_url": "https://vynst.de",
"positioningeneral": "string",
"archived": true,
"require2fa": true,
"search_string": "string"
},
"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"
},
"employment_contract_group": {
"id": 42,
"name": "Beispiel",
"staged_absence_approval": true,
"shift_booking_sync": true,
"week_total_hours": 1.5,
"week_total_days": 1.5,
"year_vacation_days": 1.5,
"month_vacation_days": 1.5,
"year_vacation_weeks": 1.5,
"monday_hours": 1.5
},
"shift_type": {
"id": 42,
"short_name": "Beispiel",
"color": "#3f5efb",
"name": "Beispiel",
"start_time": "string",
"end_time": "string",
"break_duration_seconds": 1,
"qualification_match_mode": "string",
"default_staff_count": 1,
"sort_order": 1
},
"start": "2026-10-15T09:30:00+02:00",
"end": "2026-10-15T09:30:00+02:00",
"start_date": "2026-10-15T09:30:00+02:00",
"start_month": 1
}
]This method will get all ShiftPlanTemplate Objects
GET/api/time/shift_plan_template
Query parameters
idinteger | |
deletedboolean | This property is used to mark an entity as deleted / archived | Default value: false |
namestring | |
employmentContractGroupstring | |
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
200Returns a list of ShiftPlanTemplate objectsarray<ShiftPlanTemplate>
Show fields (7)
idintegerPrimary key of the shift plan template. Internal ID.
employment_contract_groupEmploymentContractGroupContract group the template is for.
Show fields (25)
staged_absence_approvalbooleannull inherits the organization; false explicitly disables staged approval.
shift_booking_syncbooleanL35: shifts as availabilities / appointments in the booking area; null inherits the organisation, false switches it off for this group.
idintegerPrimary key of the contract group. Internal ID.
week_total_hoursnumber (float)Total working hours per week.
week_total_daysnumber (float)Working days per week.
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.
allow_app_time_trackingbooleanWhether time tracking in the app is allowed.
allow_scanner_time_trackingbooleanWhether time tracking with a scanner is allowed.
allow_app_non_work_time_managementbooleanWhether non-work time can be managed in the app.
request_lead_time_daysintegerDays an absence request of this group has to be handed in ahead of its first day. null falls back to the installation wide setting - an existing group therefore behaves exactly as before.
school_holiday_regionSchoolHolidayRegionU09: the school calendar of this group when it differs from the organisation's (apprentices attending school in another Bundesland). null = the organisation's.
search_stringstringText that the entity can be searched by.
deletedbooleanThis property is used to mark an entity as deleted / archived
namestringName of the entity.
search_stringstringText that the entity can be searched by.
deletedbooleanThis property is used to mark an entity as deleted / archived
namestringName of the entity.
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/shift_plan_template \
--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/shift_plan_template', 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/shift_plan_template"
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/shift_plan_template', [
'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/shift_plan_template"),
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/shift_plan_template")
.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/shift_plan_template"
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/shift_plan_template_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 ShiftPlanTemplateController.getAll();
if (result.success) {
print(result.data);
}[
{
"id": 42,
"name": "Beispiel",
"employment_contract_group": {
"id": 42,
"name": "Beispiel",
"staged_absence_approval": true,
"shift_booking_sync": true,
"week_total_hours": 1.5,
"week_total_days": 1.5,
"year_vacation_days": 1.5,
"month_vacation_days": 1.5,
"year_vacation_weeks": 1.5,
"monday_hours": 1.5
},
"search_string": "string",
"deleted": true,
"created": "2026-10-15T09:30:00+02:00",
"updated": "2026-10-15T09:30:00+02:00"
}
]Add a new ShiftPlanTemplate
POST/api/time/shift_plan_template
Request body application/json
dataShiftPlanTemplate2Show fields (2)
deletedbooleanThis property is used to mark an entity as deleted / archived
namestringName of the entity.
Responses
200Add a new ShiftPlanTemplateShiftPlanTemplate3
Show fields (8)
idintegerPrimary key of the shift plan template. Internal ID.
employment_contract_groupEmploymentContractGroupContract group the template is for.
Show fields (25)
staged_absence_approvalbooleannull inherits the organization; false explicitly disables staged approval.
shift_booking_syncbooleanL35: shifts as availabilities / appointments in the booking area; null inherits the organisation, false switches it off for this group.
idintegerPrimary key of the contract group. Internal ID.
week_total_hoursnumber (float)Total working hours per week.
week_total_daysnumber (float)Working days per week.
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.
allow_app_time_trackingbooleanWhether time tracking in the app is allowed.
allow_scanner_time_trackingbooleanWhether time tracking with a scanner is allowed.
allow_app_non_work_time_managementbooleanWhether non-work time can be managed in the app.
request_lead_time_daysintegerDays an absence request of this group has to be handed in ahead of its first day. null falls back to the installation wide setting - an existing group therefore behaves exactly as before.
school_holiday_regionSchoolHolidayRegionU09: the school calendar of this group when it differs from the organisation's (apprentices attending school in another Bundesland). null = the organisation's.
search_stringstringText that the entity can be searched by.
deletedbooleanThis property is used to mark an entity as deleted / archived
namestringName of the entity.
entriesarray<ShiftPlanTemplateEntry>Entries of the template.
Show fields (9)
idintegerPrimary key of the shift plan template entry. Internal ID.
iso_weekdayintegerISO weekday, 1 = Monday ... 7 = Sunday.
shift_typeShiftType3Shift type of the entry.
start_timestringStart time of the shift in HH:MM.
end_timestringEnd time of the shift in HH:MM.
break_duration_secondsintegerBreak duration of the shift in seconds.
staff_countintegerNumber of staff needed for the shift.
required_qualificationEmploymentQualificationQualification required for the shift.
qualification_match_modestringL18: EXACT demands the required qualification itself; EQUIVALENT (default, previous behaviour) also accepts linked or same-group qualifications with sufficient ranking.
search_stringstringText that the entity can be searched by.
deletedbooleanThis property is used to mark an entity as deleted / archived
namestringName of the entity.
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/shift_plan_template \
--header 'content-type: application/json' \
--header 'x-iw-jwt-token: <TOKEN>' \
--data '
{
"data": {
"name": "Beispiel",
"deleted": true
}
}
'const options = {
method: 'POST',
headers: {'x-iw-jwt-token': '<TOKEN>', 'content-type': 'application/json'},
body: JSON.stringify({data: {name: 'Beispiel', deleted: true}})
};
fetch('https://your-instance.iw-erp.de/api/time/shift_plan_template', 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/shift_plan_template"
payload = { "data": {
"name": "Beispiel",
"deleted": True
} }
headers = {
"x-iw-jwt-token": "<TOKEN>",
"content-type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)<?php
require_once('vendor/autoload.php');
$client = new \GuzzleHttp\Client();
$response = $client->request('POST', 'https://your-instance.iw-erp.de/api/time/shift_plan_template', [
'body' => '{"data":{"name":"Beispiel","deleted":true}}',
'headers' => [
'content-type' => 'application/json',
'x-iw-jwt-token' => '<TOKEN>',
],
]);
echo $response->getBody();using System.Net.Http.Headers;
var client = new HttpClient();
var request = new HttpRequestMessage
{
Method = HttpMethod.Post,
RequestUri = new Uri("https://your-instance.iw-erp.de/api/time/shift_plan_template"),
Headers =
{
{ "x-iw-jwt-token", "<TOKEN>" },
},
Content = new StringContent("{\"data\":{\"name\":\"Beispiel\",\"deleted\":true}}")
{
Headers =
{
ContentType = new MediaTypeHeaderValue("application/json")
}
}
};
using (var response = await client.SendAsync(request))
{
response.EnsureSuccessStatusCode();
var body = await response.Content.ReadAsStringAsync();
Console.WriteLine(body);
}OkHttpClient client = new OkHttpClient();
MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{\"data\":{\"name\":\"Beispiel\",\"deleted\":true}}");
Request request = new Request.Builder()
.url("https://your-instance.iw-erp.de/api/time/shift_plan_template")
.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/shift_plan_template"
payload := strings.NewReader("{\"data\":{\"name\":\"Beispiel\",\"deleted\":true}}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-iw-jwt-token", "<TOKEN>")
req.Header.Add("content-type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}Dart with the iw_erp_api package
import 'package:iw_erp_api/clients/shift_plan_template_controller.dart';
import 'package:iw_erp_api/logic/iw_api_state.dart';
import 'package:iw_erp_api/model/shift_plan_template.dart';
IwApiState().host = 'your-instance.iw-erp.de';
IwApiState().currentJwtApiToken = '<TOKEN>';
final result = await ShiftPlanTemplateController.post(ShiftPlanTemplate.fromJson({
"name": "Beispiel",
"deleted": true
}));
if (result.success) {
print(result.data);
}{
"id": 42,
"name": "Beispiel",
"employment_contract_group": {
"id": 42,
"name": "Beispiel",
"staged_absence_approval": true,
"shift_booking_sync": true,
"week_total_hours": 1.5,
"week_total_days": 1.5,
"year_vacation_days": 1.5,
"month_vacation_days": 1.5,
"year_vacation_weeks": 1.5,
"monday_hours": 1.5
},
"entries": [
{
"id": 42,
"iso_weekday": 1,
"start_time": "string",
"end_time": "string",
"break_duration_seconds": 1,
"staff_count": 1,
"qualification_match_mode": "string"
}
],
"search_string": "string",
"deleted": true,
"created": "2026-10-15T09:30:00+02:00",
"updated": "2026-10-15T09:30:00+02:00"
}This method will get a single ShiftPlanTemplate with the given id
GET/api/time/shift_plan_template/{id}
Path parameters
idrequiredstring |
Responses
200Returns a single ShiftPlanTemplateShiftPlanTemplate3
Show fields (8)
idintegerPrimary key of the shift plan template. Internal ID.
employment_contract_groupEmploymentContractGroupContract group the template is for.
Show fields (25)
staged_absence_approvalbooleannull inherits the organization; false explicitly disables staged approval.
shift_booking_syncbooleanL35: shifts as availabilities / appointments in the booking area; null inherits the organisation, false switches it off for this group.
idintegerPrimary key of the contract group. Internal ID.
week_total_hoursnumber (float)Total working hours per week.
week_total_daysnumber (float)Working days per week.
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.
allow_app_time_trackingbooleanWhether time tracking in the app is allowed.
allow_scanner_time_trackingbooleanWhether time tracking with a scanner is allowed.
allow_app_non_work_time_managementbooleanWhether non-work time can be managed in the app.
request_lead_time_daysintegerDays an absence request of this group has to be handed in ahead of its first day. null falls back to the installation wide setting - an existing group therefore behaves exactly as before.
school_holiday_regionSchoolHolidayRegionU09: the school calendar of this group when it differs from the organisation's (apprentices attending school in another Bundesland). null = the organisation's.
search_stringstringText that the entity can be searched by.
deletedbooleanThis property is used to mark an entity as deleted / archived
namestringName of the entity.
entriesarray<ShiftPlanTemplateEntry>Entries of the template.
Show fields (9)
idintegerPrimary key of the shift plan template entry. Internal ID.
iso_weekdayintegerISO weekday, 1 = Monday ... 7 = Sunday.
shift_typeShiftType3Shift type of the entry.
start_timestringStart time of the shift in HH:MM.
end_timestringEnd time of the shift in HH:MM.
break_duration_secondsintegerBreak duration of the shift in seconds.
staff_countintegerNumber of staff needed for the shift.
required_qualificationEmploymentQualificationQualification required for the shift.
qualification_match_modestringL18: EXACT demands the required qualification itself; EQUIVALENT (default, previous behaviour) also accepts linked or same-group qualifications with sufficient ranking.
search_stringstringText that the entity can be searched by.
deletedbooleanThis property is used to mark an entity as deleted / archived
namestringName of the entity.
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/shift_plan_template/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/shift_plan_template/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/shift_plan_template/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/shift_plan_template/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/shift_plan_template/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/shift_plan_template/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/shift_plan_template/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/shift_plan_template_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 ShiftPlanTemplateController.get('42');
if (result.success) {
print(result.data);
}{
"id": 42,
"name": "Beispiel",
"employment_contract_group": {
"id": 42,
"name": "Beispiel",
"staged_absence_approval": true,
"shift_booking_sync": true,
"week_total_hours": 1.5,
"week_total_days": 1.5,
"year_vacation_days": 1.5,
"month_vacation_days": 1.5,
"year_vacation_weeks": 1.5,
"monday_hours": 1.5
},
"entries": [
{
"id": 42,
"iso_weekday": 1,
"start_time": "string",
"end_time": "string",
"break_duration_seconds": 1,
"staff_count": 1,
"qualification_match_mode": "string"
}
],
"search_string": "string",
"deleted": true,
"created": "2026-10-15T09:30:00+02:00",
"updated": "2026-10-15T09:30:00+02:00"
}Update a ShiftPlanTemplate
PUT/api/time/shift_plan_template/{id}
Path parameters
idrequiredstring |
Request body application/json
dataShiftPlanTemplate2Show fields (2)
deletedbooleanThis property is used to mark an entity as deleted / archived
namestringName of the entity.
Responses
200Update a ShiftPlanTemplateShiftPlanTemplate3
Show fields (8)
idintegerPrimary key of the shift plan template. Internal ID.
employment_contract_groupEmploymentContractGroupContract group the template is for.
Show fields (25)
staged_absence_approvalbooleannull inherits the organization; false explicitly disables staged approval.
shift_booking_syncbooleanL35: shifts as availabilities / appointments in the booking area; null inherits the organisation, false switches it off for this group.
idintegerPrimary key of the contract group. Internal ID.
week_total_hoursnumber (float)Total working hours per week.
week_total_daysnumber (float)Working days per week.
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.
allow_app_time_trackingbooleanWhether time tracking in the app is allowed.
allow_scanner_time_trackingbooleanWhether time tracking with a scanner is allowed.
allow_app_non_work_time_managementbooleanWhether non-work time can be managed in the app.
request_lead_time_daysintegerDays an absence request of this group has to be handed in ahead of its first day. null falls back to the installation wide setting - an existing group therefore behaves exactly as before.
school_holiday_regionSchoolHolidayRegionU09: the school calendar of this group when it differs from the organisation's (apprentices attending school in another Bundesland). null = the organisation's.
search_stringstringText that the entity can be searched by.
deletedbooleanThis property is used to mark an entity as deleted / archived
namestringName of the entity.
entriesarray<ShiftPlanTemplateEntry>Entries of the template.
Show fields (9)
idintegerPrimary key of the shift plan template entry. Internal ID.
iso_weekdayintegerISO weekday, 1 = Monday ... 7 = Sunday.
shift_typeShiftType3Shift type of the entry.
start_timestringStart time of the shift in HH:MM.
end_timestringEnd time of the shift in HH:MM.
break_duration_secondsintegerBreak duration of the shift in seconds.
staff_countintegerNumber of staff needed for the shift.
required_qualificationEmploymentQualificationQualification required for the shift.
qualification_match_modestringL18: EXACT demands the required qualification itself; EQUIVALENT (default, previous behaviour) also accepts linked or same-group qualifications with sufficient ranking.
search_stringstringText that the entity can be searched by.
deletedbooleanThis property is used to mark an entity as deleted / archived
namestringName of the entity.
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/shift_plan_template/42 \
--header 'content-type: application/json' \
--header 'x-iw-jwt-token: <TOKEN>' \
--data '
{
"data": {
"name": "Beispiel",
"deleted": true
}
}
'const options = {
method: 'PUT',
headers: {'x-iw-jwt-token': '<TOKEN>', 'content-type': 'application/json'},
body: JSON.stringify({data: {name: 'Beispiel', deleted: true}})
};
fetch('https://your-instance.iw-erp.de/api/time/shift_plan_template/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/shift_plan_template/42"
payload = { "data": {
"name": "Beispiel",
"deleted": True
} }
headers = {
"x-iw-jwt-token": "<TOKEN>",
"content-type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)<?php
require_once('vendor/autoload.php');
$client = new \GuzzleHttp\Client();
$response = $client->request('PUT', 'https://your-instance.iw-erp.de/api/time/shift_plan_template/42', [
'body' => '{"data":{"name":"Beispiel","deleted":true}}',
'headers' => [
'content-type' => 'application/json',
'x-iw-jwt-token' => '<TOKEN>',
],
]);
echo $response->getBody();using System.Net.Http.Headers;
var client = new HttpClient();
var request = new HttpRequestMessage
{
Method = HttpMethod.Put,
RequestUri = new Uri("https://your-instance.iw-erp.de/api/time/shift_plan_template/42"),
Headers =
{
{ "x-iw-jwt-token", "<TOKEN>" },
},
Content = new StringContent("{\"data\":{\"name\":\"Beispiel\",\"deleted\":true}}")
{
Headers =
{
ContentType = new MediaTypeHeaderValue("application/json")
}
}
};
using (var response = await client.SendAsync(request))
{
response.EnsureSuccessStatusCode();
var body = await response.Content.ReadAsStringAsync();
Console.WriteLine(body);
}OkHttpClient client = new OkHttpClient();
MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{\"data\":{\"name\":\"Beispiel\",\"deleted\":true}}");
Request request = new Request.Builder()
.url("https://your-instance.iw-erp.de/api/time/shift_plan_template/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/shift_plan_template/42"
payload := strings.NewReader("{\"data\":{\"name\":\"Beispiel\",\"deleted\":true}}")
req, _ := http.NewRequest("PUT", url, payload)
req.Header.Add("x-iw-jwt-token", "<TOKEN>")
req.Header.Add("content-type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}Dart with the iw_erp_api package
import 'package:iw_erp_api/clients/shift_plan_template_controller.dart';
import 'package:iw_erp_api/logic/iw_api_state.dart';
import 'package:iw_erp_api/model/shift_plan_template.dart';
IwApiState().host = 'your-instance.iw-erp.de';
IwApiState().currentJwtApiToken = '<TOKEN>';
final result = await ShiftPlanTemplateController.put(ShiftPlanTemplate.fromJson({
"name": "Beispiel",
"deleted": true
}));
if (result.success) {
print(result.data);
}{
"id": 42,
"name": "Beispiel",
"employment_contract_group": {
"id": 42,
"name": "Beispiel",
"staged_absence_approval": true,
"shift_booking_sync": true,
"week_total_hours": 1.5,
"week_total_days": 1.5,
"year_vacation_days": 1.5,
"month_vacation_days": 1.5,
"year_vacation_weeks": 1.5,
"monday_hours": 1.5
},
"entries": [
{
"id": 42,
"iso_weekday": 1,
"start_time": "string",
"end_time": "string",
"break_duration_seconds": 1,
"staff_count": 1,
"qualification_match_mode": "string"
}
],
"search_string": "string",
"deleted": true,
"created": "2026-10-15T09:30:00+02:00",
"updated": "2026-10-15T09:30:00+02:00"
}Update a ShiftPlanTemplate
PATCH/api/time/shift_plan_template/{id}
Path parameters
idrequiredstring |
Request body application/json
dataShiftPlanTemplate2Show fields (2)
deletedbooleanThis property is used to mark an entity as deleted / archived
namestringName of the entity.
Responses
200Update a ShiftPlanTemplateShiftPlanTemplate3
Show fields (8)
idintegerPrimary key of the shift plan template. Internal ID.
employment_contract_groupEmploymentContractGroupContract group the template is for.
Show fields (25)
staged_absence_approvalbooleannull inherits the organization; false explicitly disables staged approval.
shift_booking_syncbooleanL35: shifts as availabilities / appointments in the booking area; null inherits the organisation, false switches it off for this group.
idintegerPrimary key of the contract group. Internal ID.
week_total_hoursnumber (float)Total working hours per week.
week_total_daysnumber (float)Working days per week.
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.
allow_app_time_trackingbooleanWhether time tracking in the app is allowed.
allow_scanner_time_trackingbooleanWhether time tracking with a scanner is allowed.
allow_app_non_work_time_managementbooleanWhether non-work time can be managed in the app.
request_lead_time_daysintegerDays an absence request of this group has to be handed in ahead of its first day. null falls back to the installation wide setting - an existing group therefore behaves exactly as before.
school_holiday_regionSchoolHolidayRegionU09: the school calendar of this group when it differs from the organisation's (apprentices attending school in another Bundesland). null = the organisation's.
search_stringstringText that the entity can be searched by.
deletedbooleanThis property is used to mark an entity as deleted / archived
namestringName of the entity.
entriesarray<ShiftPlanTemplateEntry>Entries of the template.
Show fields (9)
idintegerPrimary key of the shift plan template entry. Internal ID.
iso_weekdayintegerISO weekday, 1 = Monday ... 7 = Sunday.
shift_typeShiftType3Shift type of the entry.
start_timestringStart time of the shift in HH:MM.
end_timestringEnd time of the shift in HH:MM.
break_duration_secondsintegerBreak duration of the shift in seconds.
staff_countintegerNumber of staff needed for the shift.
required_qualificationEmploymentQualificationQualification required for the shift.
qualification_match_modestringL18: EXACT demands the required qualification itself; EQUIVALENT (default, previous behaviour) also accepts linked or same-group qualifications with sufficient ranking.
search_stringstringText that the entity can be searched by.
deletedbooleanThis property is used to mark an entity as deleted / archived
namestringName of the entity.
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/shift_plan_template/42 \
--header 'content-type: application/json' \
--header 'x-iw-jwt-token: <TOKEN>' \
--data '
{
"data": {
"name": "Beispiel",
"deleted": true
}
}
'const options = {
method: 'PATCH',
headers: {'x-iw-jwt-token': '<TOKEN>', 'content-type': 'application/json'},
body: JSON.stringify({data: {name: 'Beispiel', deleted: true}})
};
fetch('https://your-instance.iw-erp.de/api/time/shift_plan_template/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/shift_plan_template/42"
payload = { "data": {
"name": "Beispiel",
"deleted": True
} }
headers = {
"x-iw-jwt-token": "<TOKEN>",
"content-type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)<?php
require_once('vendor/autoload.php');
$client = new \GuzzleHttp\Client();
$response = $client->request('PATCH', 'https://your-instance.iw-erp.de/api/time/shift_plan_template/42', [
'body' => '{"data":{"name":"Beispiel","deleted":true}}',
'headers' => [
'content-type' => 'application/json',
'x-iw-jwt-token' => '<TOKEN>',
],
]);
echo $response->getBody();using System.Net.Http.Headers;
var client = new HttpClient();
var request = new HttpRequestMessage
{
Method = HttpMethod.Patch,
RequestUri = new Uri("https://your-instance.iw-erp.de/api/time/shift_plan_template/42"),
Headers =
{
{ "x-iw-jwt-token", "<TOKEN>" },
},
Content = new StringContent("{\"data\":{\"name\":\"Beispiel\",\"deleted\":true}}")
{
Headers =
{
ContentType = new MediaTypeHeaderValue("application/json")
}
}
};
using (var response = await client.SendAsync(request))
{
response.EnsureSuccessStatusCode();
var body = await response.Content.ReadAsStringAsync();
Console.WriteLine(body);
}OkHttpClient client = new OkHttpClient();
MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{\"data\":{\"name\":\"Beispiel\",\"deleted\":true}}");
Request request = new Request.Builder()
.url("https://your-instance.iw-erp.de/api/time/shift_plan_template/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/shift_plan_template/42"
payload := strings.NewReader("{\"data\":{\"name\":\"Beispiel\",\"deleted\":true}}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("x-iw-jwt-token", "<TOKEN>")
req.Header.Add("content-type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}Dart with 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/shift_plan_template/42'),
headers: {'x-iw-jwt-token': '<TOKEN>', 'content-type': 'application/json'},
body: jsonEncode({
"data": {
"name": "Beispiel",
"deleted": true
}
}),
);
print(response.body);{
"id": 42,
"name": "Beispiel",
"employment_contract_group": {
"id": 42,
"name": "Beispiel",
"staged_absence_approval": true,
"shift_booking_sync": true,
"week_total_hours": 1.5,
"week_total_days": 1.5,
"year_vacation_days": 1.5,
"month_vacation_days": 1.5,
"year_vacation_weeks": 1.5,
"monday_hours": 1.5
},
"entries": [
{
"id": 42,
"iso_weekday": 1,
"start_time": "string",
"end_time": "string",
"break_duration_seconds": 1,
"staff_count": 1,
"qualification_match_mode": "string"
}
],
"search_string": "string",
"deleted": true,
"created": "2026-10-15T09:30:00+02:00",
"updated": "2026-10-15T09:30:00+02:00"
}