VolunteerHourEntry
List volunteer hour entries
GET/api/time/volunteer_hour_entry
Query parameters
idinteger | |
personstring | |
statusstring | |
workDatestring | Day the work was done. |
eventstring | |
settlementstring | The settlement that consumed this entry. A settled entry can no longer be changed. |
createdstring | |
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 VolunteerHourEntry objectsarray<VolunteerHourEntry>
Show fields (15)
shift_assignment_idintegersettlement_idintegeris_settledbooleanapproved_by_namestringidintegerPrimary key of the volunteer hour entry. Internal ID.
personCRMPerson27Volunteer who worked the hours.
Show fields (11)
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.
nicknamestringNickname of the person.
preferred_color_hexstringPreferred color of the person as hex value.
avatar_tokenstringToken of the avatar image.
work_datestring (date-time)Day the work was done.
duration_minutesintegerDuration of the work in minutes.
descriptionstringDescription of the work.
statusstringStatus of the entry, for example pending, approved or rejected.
rejection_reasonstringReason the entry was rejected.
eventBaseEvent10Event the hours were worked for.
Show fields (45)
ticketSeatingPlanIdintegerId of the seating plan, also for the public and the customer serialization.
bib_numbers_enabledbooleantiming_enabledbooleanidintegerPrimary key of the event. Internal ID.
public_subtitlestringSubtitle shown in the public event listing.
event_typestringType of the event, for example course, trip or tournament.
event_people_limitintegermaximum number of people that can attend the event
event_people_min_limitintegerminimum number of people that must attend the event
hide_event_people_limitbooleana setting to hide the event people limit in the frontend ui
has_wait_listbooleanThe event has a waiting list once it is full.
wait_list_confirmation_requiredbooleanParticipants from the waiting list must confirm their place.
trial_enabledbooleanTrial sessions (Schnuppern) are offered for this event. Off by default: the event has to opt in, the rule comes from trialPolicy, the event's category or the default rule.
can_sign_up_for_main_eventbooleanParticipants may sign up for the main event.
only_sign_up_for_main_eventbooleanParticipants may only sign up for the main event, not for sub-events.
start_timestring (date-time)Start of the event.
end_timestring (date-time)End of the event.
require_addressbooleanParticipants must enter an address when signing up.
require_contactbooleanParticipants must enter contact details when signing up.
require_billingbooleanParticipants must enter billing details when signing up.
allow_direct_billingbooleanrequire_direct_billingbooleanallow_budget_sign_upbooleanrequire_agebooleanParticipants must enter their age when signing up.
require_grade_levelbooleanParticipants must enter their school grade level when signing up.
require_free_note_field_idsstringIDs of the free note fields that participants must fill in.
generate_new_bookingsbooleanBookings are generated automatically for the event schedule.
generate_new_bookings_v2booleanBookings are generated with the second version of the schedule generator.
generate_ignore_sys_calendarbooleanGenerated bookings ignore the holidays of the system calendar.
generate_hour_startstring (date-time)Start time of the day for generated bookings.
generate_hour_endstring (date-time)End time of the day for generated bookings.
generate_day_of_weekintegerWeekday for generated bookings.
bitmask_days_of_weekintegerThis is a bitmask value of the days of the week the event occurs on
bitmask_hours_startintegerThis is a bitmask value of the hours an event starts on
summarized_date_timesstringThis is a string with the days and hours an event starts on
customer_detail_ctastringCall-to-action text shown in the customer app on the event detail page.
customer_badgestringBadge text shown on the event in the customer app.
bib_number_modestringVergabeart der Startnummern: OFF, MANUAL, AUTOMATIC oder BATCH. Greift nur, wenn der Event-Typ Startnummern hat (enableBibNumbers).
timing_gun_startstring (date-time)Startschuss; ohne Wert gilt startTime.
timing_public_livebooleanLive timing results are public.
timing_gps_trackingbooleanGPS tracking of participants is enabled for timing.
timing_self_check_inbooleanParticipants can check in themselves for timing.
ticket_sales_enabledbooleanTicketverkauf statt Anmeldung: Teilnehmer kaufen Tickets (Ticketarten = Event-Preise mit Kontingent und Verkaufszeitraum), jedes Ticket bekommt einen Code für den Check-in. Greift nur mit der Einstellung event_ticket_sales_enabled.
ticket_max_per_orderintegerHöchstzahl Tickets je Bestellung; ohne Wert gilt event_ticket_max_per_order_default.
ticket_personalizedbooleanPersonalisierte Tickets: jedes Ticket braucht den Namen des Teilnehmers. Sonst laufen alle Tickets einer Bestellung auf den Namen des Käufers.
ticket_seatingbooleanPlatzwahl beim Ticketverkauf: jedes Ticket bekommt einen freien Platz aus dem Saalplan des Raums (BaseBookable::ticketSeatingPlan); die Ticketart kann auf eine Zone (ticketSeatZone) beschränkt sein. Greift nur mit der Einstellung event_ticket_seating_enabled.
approved_atstring (date-time)Time the entry was approved.
createdstring (date-time)Time the entry was created.
updatedstring (date-time)Time the entry was last changed.
curl --request GET \
--url https://your-instance.iw-erp.de/api/time/volunteer_hour_entry \
--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/volunteer_hour_entry', 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/volunteer_hour_entry"
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/volunteer_hour_entry', [
'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/volunteer_hour_entry"),
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/volunteer_hour_entry")
.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/volunteer_hour_entry"
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/volunteer_hour_entry_controller.dart';
import 'package:iw_erp_api/logic/iw_api_state.dart';
IwApiState().host = 'your-instance.iw-erp.de';
IwApiState().currentJwtApiToken = '<TOKEN>';
final result = await VolunteerHourEntryController.getAll();
if (result.success) {
print(result.data);
}[
{
"approved_by_name": "Beispiel",
"id": 42,
"description": "Text",
"shift_assignment_id": 42,
"settlement_id": 42,
"is_settled": true,
"person": {
"id": 42,
"first_name": "Lena",
"last_name": "Hartmann",
"title": "Beispiel",
"number": 1,
"manual_number": 1,
"number_string": "string",
"gender": "string",
"nickname": "string",
"preferred_color_hex": "string"
},
"work_date": "2026-10-15T09:30:00+02:00",
"duration_minutes": 1,
"status": "string"
}
]Record volunteer hours for a member. Entries of the administration are approved at once.
POST/api/time/volunteer_hour_entry
Request body application/json
dataVolunteerHourEntry2Show fields (5)
personCRMPerson33Volunteer who worked the hours.
work_datestring (date-time)Day the work was done.
duration_minutesintegerDuration of the work in minutes.
descriptionstringDescription of the work.
eventBaseEvent11Event the hours were worked for.
Responses
200Add a new VolunteerHourEntryVolunteerHourEntry
Show fields (15)
shift_assignment_idintegersettlement_idintegeris_settledbooleanapproved_by_namestringidintegerPrimary key of the volunteer hour entry. Internal ID.
personCRMPerson27Volunteer who worked the hours.
Show fields (11)
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.
nicknamestringNickname of the person.
preferred_color_hexstringPreferred color of the person as hex value.
avatar_tokenstringToken of the avatar image.
work_datestring (date-time)Day the work was done.
duration_minutesintegerDuration of the work in minutes.
descriptionstringDescription of the work.
statusstringStatus of the entry, for example pending, approved or rejected.
rejection_reasonstringReason the entry was rejected.
eventBaseEvent10Event the hours were worked for.
Show fields (45)
ticketSeatingPlanIdintegerId of the seating plan, also for the public and the customer serialization.
bib_numbers_enabledbooleantiming_enabledbooleanidintegerPrimary key of the event. Internal ID.
public_subtitlestringSubtitle shown in the public event listing.
event_typestringType of the event, for example course, trip or tournament.
event_people_limitintegermaximum number of people that can attend the event
event_people_min_limitintegerminimum number of people that must attend the event
hide_event_people_limitbooleana setting to hide the event people limit in the frontend ui
has_wait_listbooleanThe event has a waiting list once it is full.
wait_list_confirmation_requiredbooleanParticipants from the waiting list must confirm their place.
trial_enabledbooleanTrial sessions (Schnuppern) are offered for this event. Off by default: the event has to opt in, the rule comes from trialPolicy, the event's category or the default rule.
can_sign_up_for_main_eventbooleanParticipants may sign up for the main event.
only_sign_up_for_main_eventbooleanParticipants may only sign up for the main event, not for sub-events.
start_timestring (date-time)Start of the event.
end_timestring (date-time)End of the event.
require_addressbooleanParticipants must enter an address when signing up.
require_contactbooleanParticipants must enter contact details when signing up.
require_billingbooleanParticipants must enter billing details when signing up.
allow_direct_billingbooleanrequire_direct_billingbooleanallow_budget_sign_upbooleanrequire_agebooleanParticipants must enter their age when signing up.
require_grade_levelbooleanParticipants must enter their school grade level when signing up.
require_free_note_field_idsstringIDs of the free note fields that participants must fill in.
generate_new_bookingsbooleanBookings are generated automatically for the event schedule.
generate_new_bookings_v2booleanBookings are generated with the second version of the schedule generator.
generate_ignore_sys_calendarbooleanGenerated bookings ignore the holidays of the system calendar.
generate_hour_startstring (date-time)Start time of the day for generated bookings.
generate_hour_endstring (date-time)End time of the day for generated bookings.
generate_day_of_weekintegerWeekday for generated bookings.
bitmask_days_of_weekintegerThis is a bitmask value of the days of the week the event occurs on
bitmask_hours_startintegerThis is a bitmask value of the hours an event starts on
summarized_date_timesstringThis is a string with the days and hours an event starts on
customer_detail_ctastringCall-to-action text shown in the customer app on the event detail page.
customer_badgestringBadge text shown on the event in the customer app.
bib_number_modestringVergabeart der Startnummern: OFF, MANUAL, AUTOMATIC oder BATCH. Greift nur, wenn der Event-Typ Startnummern hat (enableBibNumbers).
timing_gun_startstring (date-time)Startschuss; ohne Wert gilt startTime.
timing_public_livebooleanLive timing results are public.
timing_gps_trackingbooleanGPS tracking of participants is enabled for timing.
timing_self_check_inbooleanParticipants can check in themselves for timing.
ticket_sales_enabledbooleanTicketverkauf statt Anmeldung: Teilnehmer kaufen Tickets (Ticketarten = Event-Preise mit Kontingent und Verkaufszeitraum), jedes Ticket bekommt einen Code für den Check-in. Greift nur mit der Einstellung event_ticket_sales_enabled.
ticket_max_per_orderintegerHöchstzahl Tickets je Bestellung; ohne Wert gilt event_ticket_max_per_order_default.
ticket_personalizedbooleanPersonalisierte Tickets: jedes Ticket braucht den Namen des Teilnehmers. Sonst laufen alle Tickets einer Bestellung auf den Namen des Käufers.
ticket_seatingbooleanPlatzwahl beim Ticketverkauf: jedes Ticket bekommt einen freien Platz aus dem Saalplan des Raums (BaseBookable::ticketSeatingPlan); die Ticketart kann auf eine Zone (ticketSeatZone) beschränkt sein. Greift nur mit der Einstellung event_ticket_seating_enabled.
approved_atstring (date-time)Time the entry was approved.
createdstring (date-time)Time the entry was created.
updatedstring (date-time)Time the entry was last changed.
curl --request POST \
--url https://your-instance.iw-erp.de/api/time/volunteer_hour_entry \
--header 'content-type: application/json' \
--header 'x-iw-jwt-token: <TOKEN>' \
--data '
{
"data": {
"description": "Text",
"work_date": "2026-10-15T09:30:00+02:00",
"duration_minutes": 1
}
}
'const options = {
method: 'POST',
headers: {'x-iw-jwt-token': '<TOKEN>', 'content-type': 'application/json'},
body: JSON.stringify({
data: {
description: 'Text',
work_date: '2026-10-15T09:30:00+02:00',
duration_minutes: 1
}
})
};
fetch('https://your-instance.iw-erp.de/api/time/volunteer_hour_entry', 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/volunteer_hour_entry"
payload = { "data": {
"description": "Text",
"work_date": "2026-10-15T09:30:00+02:00",
"duration_minutes": 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/volunteer_hour_entry', [
'body' => '{"data":{"description":"Text","work_date":"2026-10-15T09:30:00+02:00","duration_minutes":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/volunteer_hour_entry"),
Headers =
{
{ "x-iw-jwt-token", "<TOKEN>" },
},
Content = new StringContent("{\"data\":{\"description\":\"Text\",\"work_date\":\"2026-10-15T09:30:00+02:00\",\"duration_minutes\":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\",\"work_date\":\"2026-10-15T09:30:00+02:00\",\"duration_minutes\":1}}");
Request request = new Request.Builder()
.url("https://your-instance.iw-erp.de/api/time/volunteer_hour_entry")
.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/volunteer_hour_entry"
payload := strings.NewReader("{\"data\":{\"description\":\"Text\",\"work_date\":\"2026-10-15T09:30:00+02:00\",\"duration_minutes\":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/volunteer_hour_entry_controller.dart';
import 'package:iw_erp_api/logic/iw_api_state.dart';
import 'package:iw_erp_api/model/volunteer_hour_entry.dart';
IwApiState().host = 'your-instance.iw-erp.de';
IwApiState().currentJwtApiToken = '<TOKEN>';
final result = await VolunteerHourEntryController.post(VolunteerHourEntry.fromJson({
"description": "Text",
"work_date": "2026-10-15T09:30:00+02:00",
"duration_minutes": 1
}));
if (result.success) {
print(result.data);
}{
"approved_by_name": "Beispiel",
"id": 42,
"description": "Text",
"shift_assignment_id": 42,
"settlement_id": 42,
"is_settled": true,
"person": {
"id": 42,
"first_name": "Lena",
"last_name": "Hartmann",
"title": "Beispiel",
"number": 1,
"manual_number": 1,
"number_string": "string",
"gender": "string",
"nickname": "string",
"preferred_color_hex": "string"
},
"work_date": "2026-10-15T09:30:00+02:00",
"duration_minutes": 1,
"status": "string"
}Get a single volunteer hour entry
GET/api/time/volunteer_hour_entry/{id}
Path parameters
idrequiredstring |
Responses
200Returns a single VolunteerHourEntryVolunteerHourEntry
Show fields (15)
shift_assignment_idintegersettlement_idintegeris_settledbooleanapproved_by_namestringidintegerPrimary key of the volunteer hour entry. Internal ID.
personCRMPerson27Volunteer who worked the hours.
Show fields (11)
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.
nicknamestringNickname of the person.
preferred_color_hexstringPreferred color of the person as hex value.
avatar_tokenstringToken of the avatar image.
work_datestring (date-time)Day the work was done.
duration_minutesintegerDuration of the work in minutes.
descriptionstringDescription of the work.
statusstringStatus of the entry, for example pending, approved or rejected.
rejection_reasonstringReason the entry was rejected.
eventBaseEvent10Event the hours were worked for.
Show fields (45)
ticketSeatingPlanIdintegerId of the seating plan, also for the public and the customer serialization.
bib_numbers_enabledbooleantiming_enabledbooleanidintegerPrimary key of the event. Internal ID.
public_subtitlestringSubtitle shown in the public event listing.
event_typestringType of the event, for example course, trip or tournament.
event_people_limitintegermaximum number of people that can attend the event
event_people_min_limitintegerminimum number of people that must attend the event
hide_event_people_limitbooleana setting to hide the event people limit in the frontend ui
has_wait_listbooleanThe event has a waiting list once it is full.
wait_list_confirmation_requiredbooleanParticipants from the waiting list must confirm their place.
trial_enabledbooleanTrial sessions (Schnuppern) are offered for this event. Off by default: the event has to opt in, the rule comes from trialPolicy, the event's category or the default rule.
can_sign_up_for_main_eventbooleanParticipants may sign up for the main event.
only_sign_up_for_main_eventbooleanParticipants may only sign up for the main event, not for sub-events.
start_timestring (date-time)Start of the event.
end_timestring (date-time)End of the event.
require_addressbooleanParticipants must enter an address when signing up.
require_contactbooleanParticipants must enter contact details when signing up.
require_billingbooleanParticipants must enter billing details when signing up.
allow_direct_billingbooleanrequire_direct_billingbooleanallow_budget_sign_upbooleanrequire_agebooleanParticipants must enter their age when signing up.
require_grade_levelbooleanParticipants must enter their school grade level when signing up.
require_free_note_field_idsstringIDs of the free note fields that participants must fill in.
generate_new_bookingsbooleanBookings are generated automatically for the event schedule.
generate_new_bookings_v2booleanBookings are generated with the second version of the schedule generator.
generate_ignore_sys_calendarbooleanGenerated bookings ignore the holidays of the system calendar.
generate_hour_startstring (date-time)Start time of the day for generated bookings.
generate_hour_endstring (date-time)End time of the day for generated bookings.
generate_day_of_weekintegerWeekday for generated bookings.
bitmask_days_of_weekintegerThis is a bitmask value of the days of the week the event occurs on
bitmask_hours_startintegerThis is a bitmask value of the hours an event starts on
summarized_date_timesstringThis is a string with the days and hours an event starts on
customer_detail_ctastringCall-to-action text shown in the customer app on the event detail page.
customer_badgestringBadge text shown on the event in the customer app.
bib_number_modestringVergabeart der Startnummern: OFF, MANUAL, AUTOMATIC oder BATCH. Greift nur, wenn der Event-Typ Startnummern hat (enableBibNumbers).
timing_gun_startstring (date-time)Startschuss; ohne Wert gilt startTime.
timing_public_livebooleanLive timing results are public.
timing_gps_trackingbooleanGPS tracking of participants is enabled for timing.
timing_self_check_inbooleanParticipants can check in themselves for timing.
ticket_sales_enabledbooleanTicketverkauf statt Anmeldung: Teilnehmer kaufen Tickets (Ticketarten = Event-Preise mit Kontingent und Verkaufszeitraum), jedes Ticket bekommt einen Code für den Check-in. Greift nur mit der Einstellung event_ticket_sales_enabled.
ticket_max_per_orderintegerHöchstzahl Tickets je Bestellung; ohne Wert gilt event_ticket_max_per_order_default.
ticket_personalizedbooleanPersonalisierte Tickets: jedes Ticket braucht den Namen des Teilnehmers. Sonst laufen alle Tickets einer Bestellung auf den Namen des Käufers.
ticket_seatingbooleanPlatzwahl beim Ticketverkauf: jedes Ticket bekommt einen freien Platz aus dem Saalplan des Raums (BaseBookable::ticketSeatingPlan); die Ticketart kann auf eine Zone (ticketSeatZone) beschränkt sein. Greift nur mit der Einstellung event_ticket_seating_enabled.
approved_atstring (date-time)Time the entry was approved.
createdstring (date-time)Time the entry was created.
updatedstring (date-time)Time the entry was last changed.
curl --request GET \
--url https://your-instance.iw-erp.de/api/time/volunteer_hour_entry/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/volunteer_hour_entry/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/volunteer_hour_entry/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/volunteer_hour_entry/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/volunteer_hour_entry/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/volunteer_hour_entry/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/volunteer_hour_entry/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/volunteer_hour_entry_controller.dart';
import 'package:iw_erp_api/logic/iw_api_state.dart';
IwApiState().host = 'your-instance.iw-erp.de';
IwApiState().currentJwtApiToken = '<TOKEN>';
final result = await VolunteerHourEntryController.get('42');
if (result.success) {
print(result.data);
}{
"approved_by_name": "Beispiel",
"id": 42,
"description": "Text",
"shift_assignment_id": 42,
"settlement_id": 42,
"is_settled": true,
"person": {
"id": 42,
"first_name": "Lena",
"last_name": "Hartmann",
"title": "Beispiel",
"number": 1,
"manual_number": 1,
"number_string": "string",
"gender": "string",
"nickname": "string",
"preferred_color_hex": "string"
},
"work_date": "2026-10-15T09:30:00+02:00",
"duration_minutes": 1,
"status": "string"
}Update a volunteer hour entry that is not settled yet
PUT/api/time/volunteer_hour_entry/{id}
Path parameters
idrequiredstring |
Request body application/json
dataVolunteerHourEntry2Show fields (5)
personCRMPerson33Volunteer who worked the hours.
work_datestring (date-time)Day the work was done.
duration_minutesintegerDuration of the work in minutes.
descriptionstringDescription of the work.
eventBaseEvent11Event the hours were worked for.
Responses
200Update a VolunteerHourEntryVolunteerHourEntry
Show fields (15)
shift_assignment_idintegersettlement_idintegeris_settledbooleanapproved_by_namestringidintegerPrimary key of the volunteer hour entry. Internal ID.
personCRMPerson27Volunteer who worked the hours.
Show fields (11)
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.
nicknamestringNickname of the person.
preferred_color_hexstringPreferred color of the person as hex value.
avatar_tokenstringToken of the avatar image.
work_datestring (date-time)Day the work was done.
duration_minutesintegerDuration of the work in minutes.
descriptionstringDescription of the work.
statusstringStatus of the entry, for example pending, approved or rejected.
rejection_reasonstringReason the entry was rejected.
eventBaseEvent10Event the hours were worked for.
Show fields (45)
ticketSeatingPlanIdintegerId of the seating plan, also for the public and the customer serialization.
bib_numbers_enabledbooleantiming_enabledbooleanidintegerPrimary key of the event. Internal ID.
public_subtitlestringSubtitle shown in the public event listing.
event_typestringType of the event, for example course, trip or tournament.
event_people_limitintegermaximum number of people that can attend the event
event_people_min_limitintegerminimum number of people that must attend the event
hide_event_people_limitbooleana setting to hide the event people limit in the frontend ui
has_wait_listbooleanThe event has a waiting list once it is full.
wait_list_confirmation_requiredbooleanParticipants from the waiting list must confirm their place.
trial_enabledbooleanTrial sessions (Schnuppern) are offered for this event. Off by default: the event has to opt in, the rule comes from trialPolicy, the event's category or the default rule.
can_sign_up_for_main_eventbooleanParticipants may sign up for the main event.
only_sign_up_for_main_eventbooleanParticipants may only sign up for the main event, not for sub-events.
start_timestring (date-time)Start of the event.
end_timestring (date-time)End of the event.
require_addressbooleanParticipants must enter an address when signing up.
require_contactbooleanParticipants must enter contact details when signing up.
require_billingbooleanParticipants must enter billing details when signing up.
allow_direct_billingbooleanrequire_direct_billingbooleanallow_budget_sign_upbooleanrequire_agebooleanParticipants must enter their age when signing up.
require_grade_levelbooleanParticipants must enter their school grade level when signing up.
require_free_note_field_idsstringIDs of the free note fields that participants must fill in.
generate_new_bookingsbooleanBookings are generated automatically for the event schedule.
generate_new_bookings_v2booleanBookings are generated with the second version of the schedule generator.
generate_ignore_sys_calendarbooleanGenerated bookings ignore the holidays of the system calendar.
generate_hour_startstring (date-time)Start time of the day for generated bookings.
generate_hour_endstring (date-time)End time of the day for generated bookings.
generate_day_of_weekintegerWeekday for generated bookings.
bitmask_days_of_weekintegerThis is a bitmask value of the days of the week the event occurs on
bitmask_hours_startintegerThis is a bitmask value of the hours an event starts on
summarized_date_timesstringThis is a string with the days and hours an event starts on
customer_detail_ctastringCall-to-action text shown in the customer app on the event detail page.
customer_badgestringBadge text shown on the event in the customer app.
bib_number_modestringVergabeart der Startnummern: OFF, MANUAL, AUTOMATIC oder BATCH. Greift nur, wenn der Event-Typ Startnummern hat (enableBibNumbers).
timing_gun_startstring (date-time)Startschuss; ohne Wert gilt startTime.
timing_public_livebooleanLive timing results are public.
timing_gps_trackingbooleanGPS tracking of participants is enabled for timing.
timing_self_check_inbooleanParticipants can check in themselves for timing.
ticket_sales_enabledbooleanTicketverkauf statt Anmeldung: Teilnehmer kaufen Tickets (Ticketarten = Event-Preise mit Kontingent und Verkaufszeitraum), jedes Ticket bekommt einen Code für den Check-in. Greift nur mit der Einstellung event_ticket_sales_enabled.
ticket_max_per_orderintegerHöchstzahl Tickets je Bestellung; ohne Wert gilt event_ticket_max_per_order_default.
ticket_personalizedbooleanPersonalisierte Tickets: jedes Ticket braucht den Namen des Teilnehmers. Sonst laufen alle Tickets einer Bestellung auf den Namen des Käufers.
ticket_seatingbooleanPlatzwahl beim Ticketverkauf: jedes Ticket bekommt einen freien Platz aus dem Saalplan des Raums (BaseBookable::ticketSeatingPlan); die Ticketart kann auf eine Zone (ticketSeatZone) beschränkt sein. Greift nur mit der Einstellung event_ticket_seating_enabled.
approved_atstring (date-time)Time the entry was approved.
createdstring (date-time)Time the entry was created.
updatedstring (date-time)Time the entry was last changed.
curl --request PUT \
--url https://your-instance.iw-erp.de/api/time/volunteer_hour_entry/42 \
--header 'content-type: application/json' \
--header 'x-iw-jwt-token: <TOKEN>' \
--data '
{
"data": {
"description": "Text",
"work_date": "2026-10-15T09:30:00+02:00",
"duration_minutes": 1
}
}
'const options = {
method: 'PUT',
headers: {'x-iw-jwt-token': '<TOKEN>', 'content-type': 'application/json'},
body: JSON.stringify({
data: {
description: 'Text',
work_date: '2026-10-15T09:30:00+02:00',
duration_minutes: 1
}
})
};
fetch('https://your-instance.iw-erp.de/api/time/volunteer_hour_entry/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/volunteer_hour_entry/42"
payload = { "data": {
"description": "Text",
"work_date": "2026-10-15T09:30:00+02:00",
"duration_minutes": 1
} }
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/volunteer_hour_entry/42', [
'body' => '{"data":{"description":"Text","work_date":"2026-10-15T09:30:00+02:00","duration_minutes":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.Put,
RequestUri = new Uri("https://your-instance.iw-erp.de/api/time/volunteer_hour_entry/42"),
Headers =
{
{ "x-iw-jwt-token", "<TOKEN>" },
},
Content = new StringContent("{\"data\":{\"description\":\"Text\",\"work_date\":\"2026-10-15T09:30:00+02:00\",\"duration_minutes\":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\",\"work_date\":\"2026-10-15T09:30:00+02:00\",\"duration_minutes\":1}}");
Request request = new Request.Builder()
.url("https://your-instance.iw-erp.de/api/time/volunteer_hour_entry/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/volunteer_hour_entry/42"
payload := strings.NewReader("{\"data\":{\"description\":\"Text\",\"work_date\":\"2026-10-15T09:30:00+02:00\",\"duration_minutes\":1}}")
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/volunteer_hour_entry_controller.dart';
import 'package:iw_erp_api/logic/iw_api_state.dart';
import 'package:iw_erp_api/model/volunteer_hour_entry.dart';
IwApiState().host = 'your-instance.iw-erp.de';
IwApiState().currentJwtApiToken = '<TOKEN>';
final result = await VolunteerHourEntryController.put(VolunteerHourEntry.fromJson({
"description": "Text",
"work_date": "2026-10-15T09:30:00+02:00",
"duration_minutes": 1
}));
if (result.success) {
print(result.data);
}{
"approved_by_name": "Beispiel",
"id": 42,
"description": "Text",
"shift_assignment_id": 42,
"settlement_id": 42,
"is_settled": true,
"person": {
"id": 42,
"first_name": "Lena",
"last_name": "Hartmann",
"title": "Beispiel",
"number": 1,
"manual_number": 1,
"number_string": "string",
"gender": "string",
"nickname": "string",
"preferred_color_hex": "string"
},
"work_date": "2026-10-15T09:30:00+02:00",
"duration_minutes": 1,
"status": "string"
}Update a volunteer hour entry that is not settled yet
PATCH/api/time/volunteer_hour_entry/{id}
Path parameters
idrequiredstring |
Request body application/json
dataVolunteerHourEntry2Show fields (5)
personCRMPerson33Volunteer who worked the hours.
work_datestring (date-time)Day the work was done.
duration_minutesintegerDuration of the work in minutes.
descriptionstringDescription of the work.
eventBaseEvent11Event the hours were worked for.
Responses
200Update a VolunteerHourEntryVolunteerHourEntry
Show fields (15)
shift_assignment_idintegersettlement_idintegeris_settledbooleanapproved_by_namestringidintegerPrimary key of the volunteer hour entry. Internal ID.
personCRMPerson27Volunteer who worked the hours.
Show fields (11)
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.
nicknamestringNickname of the person.
preferred_color_hexstringPreferred color of the person as hex value.
avatar_tokenstringToken of the avatar image.
work_datestring (date-time)Day the work was done.
duration_minutesintegerDuration of the work in minutes.
descriptionstringDescription of the work.
statusstringStatus of the entry, for example pending, approved or rejected.
rejection_reasonstringReason the entry was rejected.
eventBaseEvent10Event the hours were worked for.
Show fields (45)
ticketSeatingPlanIdintegerId of the seating plan, also for the public and the customer serialization.
bib_numbers_enabledbooleantiming_enabledbooleanidintegerPrimary key of the event. Internal ID.
public_subtitlestringSubtitle shown in the public event listing.
event_typestringType of the event, for example course, trip or tournament.
event_people_limitintegermaximum number of people that can attend the event
event_people_min_limitintegerminimum number of people that must attend the event
hide_event_people_limitbooleana setting to hide the event people limit in the frontend ui
has_wait_listbooleanThe event has a waiting list once it is full.
wait_list_confirmation_requiredbooleanParticipants from the waiting list must confirm their place.
trial_enabledbooleanTrial sessions (Schnuppern) are offered for this event. Off by default: the event has to opt in, the rule comes from trialPolicy, the event's category or the default rule.
can_sign_up_for_main_eventbooleanParticipants may sign up for the main event.
only_sign_up_for_main_eventbooleanParticipants may only sign up for the main event, not for sub-events.
start_timestring (date-time)Start of the event.
end_timestring (date-time)End of the event.
require_addressbooleanParticipants must enter an address when signing up.
require_contactbooleanParticipants must enter contact details when signing up.
require_billingbooleanParticipants must enter billing details when signing up.
allow_direct_billingbooleanrequire_direct_billingbooleanallow_budget_sign_upbooleanrequire_agebooleanParticipants must enter their age when signing up.
require_grade_levelbooleanParticipants must enter their school grade level when signing up.
require_free_note_field_idsstringIDs of the free note fields that participants must fill in.
generate_new_bookingsbooleanBookings are generated automatically for the event schedule.
generate_new_bookings_v2booleanBookings are generated with the second version of the schedule generator.
generate_ignore_sys_calendarbooleanGenerated bookings ignore the holidays of the system calendar.
generate_hour_startstring (date-time)Start time of the day for generated bookings.
generate_hour_endstring (date-time)End time of the day for generated bookings.
generate_day_of_weekintegerWeekday for generated bookings.
bitmask_days_of_weekintegerThis is a bitmask value of the days of the week the event occurs on
bitmask_hours_startintegerThis is a bitmask value of the hours an event starts on
summarized_date_timesstringThis is a string with the days and hours an event starts on
customer_detail_ctastringCall-to-action text shown in the customer app on the event detail page.
customer_badgestringBadge text shown on the event in the customer app.
bib_number_modestringVergabeart der Startnummern: OFF, MANUAL, AUTOMATIC oder BATCH. Greift nur, wenn der Event-Typ Startnummern hat (enableBibNumbers).
timing_gun_startstring (date-time)Startschuss; ohne Wert gilt startTime.
timing_public_livebooleanLive timing results are public.
timing_gps_trackingbooleanGPS tracking of participants is enabled for timing.
timing_self_check_inbooleanParticipants can check in themselves for timing.
ticket_sales_enabledbooleanTicketverkauf statt Anmeldung: Teilnehmer kaufen Tickets (Ticketarten = Event-Preise mit Kontingent und Verkaufszeitraum), jedes Ticket bekommt einen Code für den Check-in. Greift nur mit der Einstellung event_ticket_sales_enabled.
ticket_max_per_orderintegerHöchstzahl Tickets je Bestellung; ohne Wert gilt event_ticket_max_per_order_default.
ticket_personalizedbooleanPersonalisierte Tickets: jedes Ticket braucht den Namen des Teilnehmers. Sonst laufen alle Tickets einer Bestellung auf den Namen des Käufers.
ticket_seatingbooleanPlatzwahl beim Ticketverkauf: jedes Ticket bekommt einen freien Platz aus dem Saalplan des Raums (BaseBookable::ticketSeatingPlan); die Ticketart kann auf eine Zone (ticketSeatZone) beschränkt sein. Greift nur mit der Einstellung event_ticket_seating_enabled.
approved_atstring (date-time)Time the entry was approved.
createdstring (date-time)Time the entry was created.
updatedstring (date-time)Time the entry was last changed.
curl --request PATCH \
--url https://your-instance.iw-erp.de/api/time/volunteer_hour_entry/42 \
--header 'content-type: application/json' \
--header 'x-iw-jwt-token: <TOKEN>' \
--data '
{
"data": {
"description": "Text",
"work_date": "2026-10-15T09:30:00+02:00",
"duration_minutes": 1
}
}
'const options = {
method: 'PATCH',
headers: {'x-iw-jwt-token': '<TOKEN>', 'content-type': 'application/json'},
body: JSON.stringify({
data: {
description: 'Text',
work_date: '2026-10-15T09:30:00+02:00',
duration_minutes: 1
}
})
};
fetch('https://your-instance.iw-erp.de/api/time/volunteer_hour_entry/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/volunteer_hour_entry/42"
payload = { "data": {
"description": "Text",
"work_date": "2026-10-15T09:30:00+02:00",
"duration_minutes": 1
} }
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/volunteer_hour_entry/42', [
'body' => '{"data":{"description":"Text","work_date":"2026-10-15T09:30:00+02:00","duration_minutes":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.Patch,
RequestUri = new Uri("https://your-instance.iw-erp.de/api/time/volunteer_hour_entry/42"),
Headers =
{
{ "x-iw-jwt-token", "<TOKEN>" },
},
Content = new StringContent("{\"data\":{\"description\":\"Text\",\"work_date\":\"2026-10-15T09:30:00+02:00\",\"duration_minutes\":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\",\"work_date\":\"2026-10-15T09:30:00+02:00\",\"duration_minutes\":1}}");
Request request = new Request.Builder()
.url("https://your-instance.iw-erp.de/api/time/volunteer_hour_entry/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/volunteer_hour_entry/42"
payload := strings.NewReader("{\"data\":{\"description\":\"Text\",\"work_date\":\"2026-10-15T09:30:00+02:00\",\"duration_minutes\":1}}")
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/volunteer_hour_entry/42'),
headers: {'x-iw-jwt-token': '<TOKEN>', 'content-type': 'application/json'},
body: jsonEncode({
"data": {
"description": "Text",
"work_date": "2026-10-15T09:30:00+02:00",
"duration_minutes": 1
}
}),
);
print(response.body);{
"approved_by_name": "Beispiel",
"id": 42,
"description": "Text",
"shift_assignment_id": 42,
"settlement_id": 42,
"is_settled": true,
"person": {
"id": 42,
"first_name": "Lena",
"last_name": "Hartmann",
"title": "Beispiel",
"number": 1,
"manual_number": 1,
"number_string": "string",
"gender": "string",
"nickname": "string",
"preferred_color_hex": "string"
},
"work_date": "2026-10-15T09:30:00+02:00",
"duration_minutes": 1,
"status": "string"
}Delete a volunteer hour entry that is not settled yet
DELETE/api/time/volunteer_hour_entry/{id}
Path parameters
idrequiredstring |
Responses
default
curl --request DELETE \
--url https://your-instance.iw-erp.de/api/time/volunteer_hour_entry/42 \
--header 'x-iw-jwt-token: <TOKEN>'const options = {method: 'DELETE', headers: {'x-iw-jwt-token': '<TOKEN>'}};
fetch('https://your-instance.iw-erp.de/api/time/volunteer_hour_entry/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/volunteer_hour_entry/42"
headers = {"x-iw-jwt-token": "<TOKEN>"}
response = requests.delete(url, headers=headers)
print(response.text)<?php
require_once('vendor/autoload.php');
$client = new \GuzzleHttp\Client();
$response = $client->request('DELETE', 'https://your-instance.iw-erp.de/api/time/volunteer_hour_entry/42', [
'headers' => [
'x-iw-jwt-token' => '<TOKEN>',
],
]);
echo $response->getBody();using System.Net.Http.Headers;
var client = new HttpClient();
var request = new HttpRequestMessage
{
Method = HttpMethod.Delete,
RequestUri = new Uri("https://your-instance.iw-erp.de/api/time/volunteer_hour_entry/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/volunteer_hour_entry/42")
.delete(null)
.addHeader("x-iw-jwt-token", "<TOKEN>")
.build();
Response response = client.newCall(request).execute();package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://your-instance.iw-erp.de/api/time/volunteer_hour_entry/42"
req, _ := http.NewRequest("DELETE", url, nil)
req.Header.Add("x-iw-jwt-token", "<TOKEN>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}Dart with the iw_erp_api package
import 'package:iw_erp_api/clients/volunteer_hour_entry_controller.dart';
import 'package:iw_erp_api/logic/iw_api_state.dart';
IwApiState().host = 'your-instance.iw-erp.de';
IwApiState().currentJwtApiToken = '<TOKEN>';
final result = await VolunteerHourEntryController.delete('42');
if (result.success) {
print(result.data);
}Approve a volunteer hour entry - only approved entries count towards the required hours
POST/api/time/volunteer_hour_entry/{id}/approve
Path parameters
idrequiredstring |
Responses
200Approve a VolunteerHourEntryVolunteerHourEntry
Show fields (15)
shift_assignment_idintegersettlement_idintegeris_settledbooleanapproved_by_namestringidintegerPrimary key of the volunteer hour entry. Internal ID.
personCRMPerson27Volunteer who worked the hours.
Show fields (11)
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.
nicknamestringNickname of the person.
preferred_color_hexstringPreferred color of the person as hex value.
avatar_tokenstringToken of the avatar image.
work_datestring (date-time)Day the work was done.
duration_minutesintegerDuration of the work in minutes.
descriptionstringDescription of the work.
statusstringStatus of the entry, for example pending, approved or rejected.
rejection_reasonstringReason the entry was rejected.
eventBaseEvent10Event the hours were worked for.
Show fields (45)
ticketSeatingPlanIdintegerId of the seating plan, also for the public and the customer serialization.
bib_numbers_enabledbooleantiming_enabledbooleanidintegerPrimary key of the event. Internal ID.
public_subtitlestringSubtitle shown in the public event listing.
event_typestringType of the event, for example course, trip or tournament.
event_people_limitintegermaximum number of people that can attend the event
event_people_min_limitintegerminimum number of people that must attend the event
hide_event_people_limitbooleana setting to hide the event people limit in the frontend ui
has_wait_listbooleanThe event has a waiting list once it is full.
wait_list_confirmation_requiredbooleanParticipants from the waiting list must confirm their place.
trial_enabledbooleanTrial sessions (Schnuppern) are offered for this event. Off by default: the event has to opt in, the rule comes from trialPolicy, the event's category or the default rule.
can_sign_up_for_main_eventbooleanParticipants may sign up for the main event.
only_sign_up_for_main_eventbooleanParticipants may only sign up for the main event, not for sub-events.
start_timestring (date-time)Start of the event.
end_timestring (date-time)End of the event.
require_addressbooleanParticipants must enter an address when signing up.
require_contactbooleanParticipants must enter contact details when signing up.
require_billingbooleanParticipants must enter billing details when signing up.
allow_direct_billingbooleanrequire_direct_billingbooleanallow_budget_sign_upbooleanrequire_agebooleanParticipants must enter their age when signing up.
require_grade_levelbooleanParticipants must enter their school grade level when signing up.
require_free_note_field_idsstringIDs of the free note fields that participants must fill in.
generate_new_bookingsbooleanBookings are generated automatically for the event schedule.
generate_new_bookings_v2booleanBookings are generated with the second version of the schedule generator.
generate_ignore_sys_calendarbooleanGenerated bookings ignore the holidays of the system calendar.
generate_hour_startstring (date-time)Start time of the day for generated bookings.
generate_hour_endstring (date-time)End time of the day for generated bookings.
generate_day_of_weekintegerWeekday for generated bookings.
bitmask_days_of_weekintegerThis is a bitmask value of the days of the week the event occurs on
bitmask_hours_startintegerThis is a bitmask value of the hours an event starts on
summarized_date_timesstringThis is a string with the days and hours an event starts on
customer_detail_ctastringCall-to-action text shown in the customer app on the event detail page.
customer_badgestringBadge text shown on the event in the customer app.
bib_number_modestringVergabeart der Startnummern: OFF, MANUAL, AUTOMATIC oder BATCH. Greift nur, wenn der Event-Typ Startnummern hat (enableBibNumbers).
timing_gun_startstring (date-time)Startschuss; ohne Wert gilt startTime.
timing_public_livebooleanLive timing results are public.
timing_gps_trackingbooleanGPS tracking of participants is enabled for timing.
timing_self_check_inbooleanParticipants can check in themselves for timing.
ticket_sales_enabledbooleanTicketverkauf statt Anmeldung: Teilnehmer kaufen Tickets (Ticketarten = Event-Preise mit Kontingent und Verkaufszeitraum), jedes Ticket bekommt einen Code für den Check-in. Greift nur mit der Einstellung event_ticket_sales_enabled.
ticket_max_per_orderintegerHöchstzahl Tickets je Bestellung; ohne Wert gilt event_ticket_max_per_order_default.
ticket_personalizedbooleanPersonalisierte Tickets: jedes Ticket braucht den Namen des Teilnehmers. Sonst laufen alle Tickets einer Bestellung auf den Namen des Käufers.
ticket_seatingbooleanPlatzwahl beim Ticketverkauf: jedes Ticket bekommt einen freien Platz aus dem Saalplan des Raums (BaseBookable::ticketSeatingPlan); die Ticketart kann auf eine Zone (ticketSeatZone) beschränkt sein. Greift nur mit der Einstellung event_ticket_seating_enabled.
approved_atstring (date-time)Time the entry was approved.
createdstring (date-time)Time the entry was created.
updatedstring (date-time)Time the entry was last changed.
curl --request POST \
--url https://your-instance.iw-erp.de/api/time/volunteer_hour_entry/42/approve \
--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/volunteer_hour_entry/42/approve', 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/volunteer_hour_entry/42/approve"
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/volunteer_hour_entry/42/approve', [
'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/volunteer_hour_entry/42/approve"),
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/volunteer_hour_entry/42/approve")
.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/volunteer_hour_entry/42/approve"
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/volunteer_hour_entry_controller.dart';
import 'package:iw_erp_api/logic/iw_api_state.dart';
IwApiState().host = 'your-instance.iw-erp.de';
IwApiState().currentJwtApiToken = '<TOKEN>';
final result = await VolunteerHourEntryController.postApprove('42');
if (result.success) {
print(result.data);
}{
"approved_by_name": "Beispiel",
"id": 42,
"description": "Text",
"shift_assignment_id": 42,
"settlement_id": 42,
"is_settled": true,
"person": {
"id": 42,
"first_name": "Lena",
"last_name": "Hartmann",
"title": "Beispiel",
"number": 1,
"manual_number": 1,
"number_string": "string",
"gender": "string",
"nickname": "string",
"preferred_color_hex": "string"
},
"work_date": "2026-10-15T09:30:00+02:00",
"duration_minutes": 1,
"status": "string"
}Reject a volunteer hour entry, optionally with a reason (`reason`) shown to the member
POST/api/time/volunteer_hour_entry/{id}/reject
Path parameters
idrequiredstring |
Responses
200Reject a VolunteerHourEntryVolunteerHourEntry
Show fields (15)
shift_assignment_idintegersettlement_idintegeris_settledbooleanapproved_by_namestringidintegerPrimary key of the volunteer hour entry. Internal ID.
personCRMPerson27Volunteer who worked the hours.
Show fields (11)
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.
nicknamestringNickname of the person.
preferred_color_hexstringPreferred color of the person as hex value.
avatar_tokenstringToken of the avatar image.
work_datestring (date-time)Day the work was done.
duration_minutesintegerDuration of the work in minutes.
descriptionstringDescription of the work.
statusstringStatus of the entry, for example pending, approved or rejected.
rejection_reasonstringReason the entry was rejected.
eventBaseEvent10Event the hours were worked for.
Show fields (45)
ticketSeatingPlanIdintegerId of the seating plan, also for the public and the customer serialization.
bib_numbers_enabledbooleantiming_enabledbooleanidintegerPrimary key of the event. Internal ID.
public_subtitlestringSubtitle shown in the public event listing.
event_typestringType of the event, for example course, trip or tournament.
event_people_limitintegermaximum number of people that can attend the event
event_people_min_limitintegerminimum number of people that must attend the event
hide_event_people_limitbooleana setting to hide the event people limit in the frontend ui
has_wait_listbooleanThe event has a waiting list once it is full.
wait_list_confirmation_requiredbooleanParticipants from the waiting list must confirm their place.
trial_enabledbooleanTrial sessions (Schnuppern) are offered for this event. Off by default: the event has to opt in, the rule comes from trialPolicy, the event's category or the default rule.
can_sign_up_for_main_eventbooleanParticipants may sign up for the main event.
only_sign_up_for_main_eventbooleanParticipants may only sign up for the main event, not for sub-events.
start_timestring (date-time)Start of the event.
end_timestring (date-time)End of the event.
require_addressbooleanParticipants must enter an address when signing up.
require_contactbooleanParticipants must enter contact details when signing up.
require_billingbooleanParticipants must enter billing details when signing up.
allow_direct_billingbooleanrequire_direct_billingbooleanallow_budget_sign_upbooleanrequire_agebooleanParticipants must enter their age when signing up.
require_grade_levelbooleanParticipants must enter their school grade level when signing up.
require_free_note_field_idsstringIDs of the free note fields that participants must fill in.
generate_new_bookingsbooleanBookings are generated automatically for the event schedule.
generate_new_bookings_v2booleanBookings are generated with the second version of the schedule generator.
generate_ignore_sys_calendarbooleanGenerated bookings ignore the holidays of the system calendar.
generate_hour_startstring (date-time)Start time of the day for generated bookings.
generate_hour_endstring (date-time)End time of the day for generated bookings.
generate_day_of_weekintegerWeekday for generated bookings.
bitmask_days_of_weekintegerThis is a bitmask value of the days of the week the event occurs on
bitmask_hours_startintegerThis is a bitmask value of the hours an event starts on
summarized_date_timesstringThis is a string with the days and hours an event starts on
customer_detail_ctastringCall-to-action text shown in the customer app on the event detail page.
customer_badgestringBadge text shown on the event in the customer app.
bib_number_modestringVergabeart der Startnummern: OFF, MANUAL, AUTOMATIC oder BATCH. Greift nur, wenn der Event-Typ Startnummern hat (enableBibNumbers).
timing_gun_startstring (date-time)Startschuss; ohne Wert gilt startTime.
timing_public_livebooleanLive timing results are public.
timing_gps_trackingbooleanGPS tracking of participants is enabled for timing.
timing_self_check_inbooleanParticipants can check in themselves for timing.
ticket_sales_enabledbooleanTicketverkauf statt Anmeldung: Teilnehmer kaufen Tickets (Ticketarten = Event-Preise mit Kontingent und Verkaufszeitraum), jedes Ticket bekommt einen Code für den Check-in. Greift nur mit der Einstellung event_ticket_sales_enabled.
ticket_max_per_orderintegerHöchstzahl Tickets je Bestellung; ohne Wert gilt event_ticket_max_per_order_default.
ticket_personalizedbooleanPersonalisierte Tickets: jedes Ticket braucht den Namen des Teilnehmers. Sonst laufen alle Tickets einer Bestellung auf den Namen des Käufers.
ticket_seatingbooleanPlatzwahl beim Ticketverkauf: jedes Ticket bekommt einen freien Platz aus dem Saalplan des Raums (BaseBookable::ticketSeatingPlan); die Ticketart kann auf eine Zone (ticketSeatZone) beschränkt sein. Greift nur mit der Einstellung event_ticket_seating_enabled.
approved_atstring (date-time)Time the entry was approved.
createdstring (date-time)Time the entry was created.
updatedstring (date-time)Time the entry was last changed.
curl --request POST \
--url https://your-instance.iw-erp.de/api/time/volunteer_hour_entry/42/reject \
--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/volunteer_hour_entry/42/reject', 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/volunteer_hour_entry/42/reject"
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/volunteer_hour_entry/42/reject', [
'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/volunteer_hour_entry/42/reject"),
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/volunteer_hour_entry/42/reject")
.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/volunteer_hour_entry/42/reject"
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/volunteer_hour_entry_controller.dart';
import 'package:iw_erp_api/logic/iw_api_state.dart';
IwApiState().host = 'your-instance.iw-erp.de';
IwApiState().currentJwtApiToken = '<TOKEN>';
final result = await VolunteerHourEntryController.postReject('42');
if (result.success) {
print(result.data);
}{
"approved_by_name": "Beispiel",
"id": 42,
"description": "Text",
"shift_assignment_id": 42,
"settlement_id": 42,
"is_settled": true,
"person": {
"id": 42,
"first_name": "Lena",
"last_name": "Hartmann",
"title": "Beispiel",
"number": 1,
"manual_number": 1,
"number_string": "string",
"gender": "string",
"nickname": "string",
"preferred_color_hex": "string"
},
"work_date": "2026-10-15T09:30:00+02:00",
"duration_minutes": 1,
"status": "string"
}