curl --request PATCH \
--url https://{organization}.rescueconsole.com/api/shifts/windows/{id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"starts_at": "2026-10-03T10:00:00Z",
"ends_at": "2026-10-03T17:00:00Z"
}
'const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({starts_at: '2026-10-03T10:00:00Z', ends_at: '2026-10-03T17:00:00Z'})
};
fetch('https://{organization}.rescueconsole.com/api/shifts/windows/{id}', 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/{id}"
payload = {
"starts_at": "2026-10-03T10:00:00Z",
"ends_at": "2026-10-03T17:00:00Z"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(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)"
}{
"error": "house_trained must be 1, 0 or null (not assessed)"
}{
"error": "house_trained must be 1, 0 or null (not assessed)"
}Change a shift
Moves, closes, cancels or re-opens a shift, or changes its notes. Send only what changes. Moving a shift carries its whole-shift sign-ups to the new hours; it is refused while any part-shift sign-up would fall outside them, so give those up first. A closed or cancelled shift takes no new sign-ups; the sign-ups already on it stay. 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 PATCH \
--url https://{organization}.rescueconsole.com/api/shifts/windows/{id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"starts_at": "2026-10-03T10:00:00Z",
"ends_at": "2026-10-03T17:00:00Z"
}
'const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({starts_at: '2026-10-03T10:00:00Z', ends_at: '2026-10-03T17:00:00Z'})
};
fetch('https://{organization}.rescueconsole.com/api/shifts/windows/{id}', 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/{id}"
payload = {
"starts_at": "2026-10-03T10:00:00Z",
"ends_at": "2026-10-03T17:00:00Z"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(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)"
}{
"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_.
Path Parameters
The shift's ID.
Body
Response
The shift, as it now is.
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.