curl --request POST \
--url https://{organization}.rescueconsole.com/api/shifts/windows \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"event_id": "3c9e7a12-4b6d-4f1e-8a2c-9d5b7e3f1a60",
"location_unit_id": "6d1a9f3c-8e5b-4b2d-a7c9-4e1f6b3d8a52",
"starts_at": "2026-10-03T09:00:00Z",
"ends_at": "2026-10-03T17:00:00Z",
"notes": "Meet at the side door.",
"roles": [
{
"role_id": "9a7c3e5f-1d2b-4c8a-b6e4-3f9d1a5c7e28",
"capacity": 2,
"booking_mode": "whole"
},
{
"role_id": "2b8e4f1a-7c3d-4e9b-a5f2-6d1c8b4e9a37",
"capacity": 3,
"booking_mode": "partial",
"min_minutes": 60,
"max_minutes": 240
}
]
}
'const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
event_id: '3c9e7a12-4b6d-4f1e-8a2c-9d5b7e3f1a60',
location_unit_id: '6d1a9f3c-8e5b-4b2d-a7c9-4e1f6b3d8a52',
starts_at: '2026-10-03T09:00:00Z',
ends_at: '2026-10-03T17:00:00Z',
notes: 'Meet at the side door.',
roles: [
{
role_id: '9a7c3e5f-1d2b-4c8a-b6e4-3f9d1a5c7e28',
capacity: 2,
booking_mode: 'whole'
},
{
role_id: '2b8e4f1a-7c3d-4e9b-a5f2-6d1c8b4e9a37',
capacity: 3,
booking_mode: 'partial',
min_minutes: 60,
max_minutes: 240
}
]
})
};
fetch('https://{organization}.rescueconsole.com/api/shifts/windows', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://{organization}.rescueconsole.com/api/shifts/windows"
payload = {
"event_id": "3c9e7a12-4b6d-4f1e-8a2c-9d5b7e3f1a60",
"location_unit_id": "6d1a9f3c-8e5b-4b2d-a7c9-4e1f6b3d8a52",
"starts_at": "2026-10-03T09:00:00Z",
"ends_at": "2026-10-03T17:00:00Z",
"notes": "Meet at the side door.",
"roles": [
{
"role_id": "9a7c3e5f-1d2b-4c8a-b6e4-3f9d1a5c7e28",
"capacity": 2,
"booking_mode": "whole"
},
{
"role_id": "2b8e4f1a-7c3d-4e9b-a5f2-6d1c8b4e9a37",
"capacity": 3,
"booking_mode": "partial",
"min_minutes": 60,
"max_minutes": 240
}
]
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"id": "<string>",
"starts_at": "2023-11-07T05:31:56Z",
"ends_at": "2023-11-07T05:31:56Z",
"status": "open",
"roles": [
{
"id": "<string>",
"window_id": "<string>",
"role_id": "<string>",
"capacity": 2,
"booking_mode": "whole",
"bookings": [
{
"id": "<string>",
"window_role_id": "<string>",
"person_id": "<string>",
"starts_at": "2023-11-07T05:31:56Z",
"ends_at": "2023-11-07T05:31:56Z",
"status": "booked",
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z",
"tenant_id": "<string>",
"hours_logged": 1,
"signed_off_by": "<string>",
"signed_off_at": "2023-11-07T05:31:56Z",
"notes": "<string>",
"cancellation_requested_at": "2023-11-07T05:31:56Z",
"cancellation_reason": "<string>",
"cancellation_decision": "released",
"cancellation_decided_by": "<string>",
"cancellation_decided_at": "2023-11-07T05:31:56Z",
"cancellation_decision_notes": "<string>",
"custom_fields": "<string>"
}
],
"tenant_id": "<string>",
"role_key": "<string>",
"role_label": "<string>",
"min_minutes": 123,
"max_minutes": 123,
"max_party_size": 123,
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z",
"for_me": {
"eligible": true,
"message": "<string>",
"free": [
{
"starts_at": "2023-11-07T05:31:56Z",
"ends_at": "2023-11-07T05:31:56Z"
}
]
}
}
],
"tenant_id": "<string>",
"event_id": "<string>",
"location_unit_id": "<string>",
"notes": "<string>",
"custom_fields": "<string>",
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z",
"deleted_at": "<string>"
}{
"error": "house_trained must be 1, 0 or null (not assessed)"
}{
"error": "house_trained must be 1, 0 or null (not assessed)"
}{
"error": "house_trained must be 1, 0 or null (not assessed)"
}Open a shift
Opens a shift with the roles it needs: at least one, and each role once. A role in whole mode is taken for the whole shift; in partial mode volunteers take part of it, within min_minutes and max_minutes when you set them. The roles a shift offers are set here and cannot be changed afterwards. Needs write on Shifts.
A coordinator’s: needs write on Shifts AND read on People. A key without read on People is refused (403) with “Only a coordinator can do this: it needs permission to see People.”
curl --request POST \
--url https://{organization}.rescueconsole.com/api/shifts/windows \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"event_id": "3c9e7a12-4b6d-4f1e-8a2c-9d5b7e3f1a60",
"location_unit_id": "6d1a9f3c-8e5b-4b2d-a7c9-4e1f6b3d8a52",
"starts_at": "2026-10-03T09:00:00Z",
"ends_at": "2026-10-03T17:00:00Z",
"notes": "Meet at the side door.",
"roles": [
{
"role_id": "9a7c3e5f-1d2b-4c8a-b6e4-3f9d1a5c7e28",
"capacity": 2,
"booking_mode": "whole"
},
{
"role_id": "2b8e4f1a-7c3d-4e9b-a5f2-6d1c8b4e9a37",
"capacity": 3,
"booking_mode": "partial",
"min_minutes": 60,
"max_minutes": 240
}
]
}
'const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
event_id: '3c9e7a12-4b6d-4f1e-8a2c-9d5b7e3f1a60',
location_unit_id: '6d1a9f3c-8e5b-4b2d-a7c9-4e1f6b3d8a52',
starts_at: '2026-10-03T09:00:00Z',
ends_at: '2026-10-03T17:00:00Z',
notes: 'Meet at the side door.',
roles: [
{
role_id: '9a7c3e5f-1d2b-4c8a-b6e4-3f9d1a5c7e28',
capacity: 2,
booking_mode: 'whole'
},
{
role_id: '2b8e4f1a-7c3d-4e9b-a5f2-6d1c8b4e9a37',
capacity: 3,
booking_mode: 'partial',
min_minutes: 60,
max_minutes: 240
}
]
})
};
fetch('https://{organization}.rescueconsole.com/api/shifts/windows', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://{organization}.rescueconsole.com/api/shifts/windows"
payload = {
"event_id": "3c9e7a12-4b6d-4f1e-8a2c-9d5b7e3f1a60",
"location_unit_id": "6d1a9f3c-8e5b-4b2d-a7c9-4e1f6b3d8a52",
"starts_at": "2026-10-03T09:00:00Z",
"ends_at": "2026-10-03T17:00:00Z",
"notes": "Meet at the side door.",
"roles": [
{
"role_id": "9a7c3e5f-1d2b-4c8a-b6e4-3f9d1a5c7e28",
"capacity": 2,
"booking_mode": "whole"
},
{
"role_id": "2b8e4f1a-7c3d-4e9b-a5f2-6d1c8b4e9a37",
"capacity": 3,
"booking_mode": "partial",
"min_minutes": 60,
"max_minutes": 240
}
]
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"id": "<string>",
"starts_at": "2023-11-07T05:31:56Z",
"ends_at": "2023-11-07T05:31:56Z",
"status": "open",
"roles": [
{
"id": "<string>",
"window_id": "<string>",
"role_id": "<string>",
"capacity": 2,
"booking_mode": "whole",
"bookings": [
{
"id": "<string>",
"window_role_id": "<string>",
"person_id": "<string>",
"starts_at": "2023-11-07T05:31:56Z",
"ends_at": "2023-11-07T05:31:56Z",
"status": "booked",
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z",
"tenant_id": "<string>",
"hours_logged": 1,
"signed_off_by": "<string>",
"signed_off_at": "2023-11-07T05:31:56Z",
"notes": "<string>",
"cancellation_requested_at": "2023-11-07T05:31:56Z",
"cancellation_reason": "<string>",
"cancellation_decision": "released",
"cancellation_decided_by": "<string>",
"cancellation_decided_at": "2023-11-07T05:31:56Z",
"cancellation_decision_notes": "<string>",
"custom_fields": "<string>"
}
],
"tenant_id": "<string>",
"role_key": "<string>",
"role_label": "<string>",
"min_minutes": 123,
"max_minutes": 123,
"max_party_size": 123,
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z",
"for_me": {
"eligible": true,
"message": "<string>",
"free": [
{
"starts_at": "2023-11-07T05:31:56Z",
"ends_at": "2023-11-07T05:31:56Z"
}
]
}
}
],
"tenant_id": "<string>",
"event_id": "<string>",
"location_unit_id": "<string>",
"notes": "<string>",
"custom_fields": "<string>",
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z",
"deleted_at": "<string>"
}{
"error": "house_trained must be 1, 0 or null (not assessed)"
}{
"error": "house_trained must be 1, 0 or null (not assessed)"
}{
"error": "house_trained must be 1, 0 or null (not assessed)"
}Authorizations
An API key from Settings, API keys. It starts with rc_live_.
Body
A date and time.
A date and time after starts_at.
At least one, and each role once.
Show child attributes
Show child attributes
The schedule to put it under.
One of your locations.
Response
The shift, as it was opened.
open takes sign-ups. closed and cancelled do not.
open, closed, cancelled Show child attributes
Show child attributes
Your organization's ID.
The schedule it belongs to, if any.
Where it happens: one of your locations.
Your own shift fields, as JSON text.
Always null: a deleted shift is not returned.