curl --request POST \
--url https://{organization}.rescueconsole.com/api/shifts/bookings \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"window_role_id": "e5a2c8d1-3f7b-4a6e-9c4d-8b1f2a7e5c93",
"person_id": "4f8b2d6a-9e1c-4a3f-8b7d-5c2e6a9f1b04",
"starts_at": "2026-10-03T09:00:00Z",
"ends_at": "2026-10-03T12:00:00Z",
"companions": [
{
"person_id": "c2e6a9f1-7b3d-4e8a-9f5c-1d4b8e2a6c71",
"relationship": "guardian"
}
]
}
'const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
window_role_id: 'e5a2c8d1-3f7b-4a6e-9c4d-8b1f2a7e5c93',
person_id: '4f8b2d6a-9e1c-4a3f-8b7d-5c2e6a9f1b04',
starts_at: '2026-10-03T09:00:00Z',
ends_at: '2026-10-03T12:00:00Z',
companions: [{person_id: 'c2e6a9f1-7b3d-4e8a-9f5c-1d4b8e2a6c71', relationship: 'guardian'}]
})
};
fetch('https://{organization}.rescueconsole.com/api/shifts/bookings', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://{organization}.rescueconsole.com/api/shifts/bookings"
payload = {
"window_role_id": "e5a2c8d1-3f7b-4a6e-9c4d-8b1f2a7e5c93",
"person_id": "4f8b2d6a-9e1c-4a3f-8b7d-5c2e6a9f1b04",
"starts_at": "2026-10-03T09:00:00Z",
"ends_at": "2026-10-03T12:00:00Z",
"companions": [
{
"person_id": "c2e6a9f1-7b3d-4e8a-9f5c-1d4b8e2a6c71",
"relationship": "guardian"
}
]
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"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",
"companions": [
{
"person_id": "<string>",
"relationship": "companion"
}
],
"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>"
}{
"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)"
}Sign somebody up
Signs a person up for a role on a shift, for the stretch you give. Without person_id, the sign-up is for the person who created the key.
Companions share the person’s place: the adult with a volunteer under 18, or somebody doing the shift with them. They do not use up a place, but each must be approved for the role and free at that time.
Refused with 409 when the shift is closed or cancelled, the time is outside the shift or does not fit the role, the role is full for part of that time, anybody on the sign-up is already signed up for something then, the party breaks the role’s age or party-size rule, or one of your shift policies says no. Refused with 403 when anybody on it is not approved for the role, or the role is retired.
Everybody on the sign-up is given the volunteer role on their person record if they did not have it.
Needs write on Shifts. A key without read on People can sign up only the person who created the key, and bring only people that person has been on a sign-up with before or who share their address.
curl --request POST \
--url https://{organization}.rescueconsole.com/api/shifts/bookings \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"window_role_id": "e5a2c8d1-3f7b-4a6e-9c4d-8b1f2a7e5c93",
"person_id": "4f8b2d6a-9e1c-4a3f-8b7d-5c2e6a9f1b04",
"starts_at": "2026-10-03T09:00:00Z",
"ends_at": "2026-10-03T12:00:00Z",
"companions": [
{
"person_id": "c2e6a9f1-7b3d-4e8a-9f5c-1d4b8e2a6c71",
"relationship": "guardian"
}
]
}
'const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
window_role_id: 'e5a2c8d1-3f7b-4a6e-9c4d-8b1f2a7e5c93',
person_id: '4f8b2d6a-9e1c-4a3f-8b7d-5c2e6a9f1b04',
starts_at: '2026-10-03T09:00:00Z',
ends_at: '2026-10-03T12:00:00Z',
companions: [{person_id: 'c2e6a9f1-7b3d-4e8a-9f5c-1d4b8e2a6c71', relationship: 'guardian'}]
})
};
fetch('https://{organization}.rescueconsole.com/api/shifts/bookings', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://{organization}.rescueconsole.com/api/shifts/bookings"
payload = {
"window_role_id": "e5a2c8d1-3f7b-4a6e-9c4d-8b1f2a7e5c93",
"person_id": "4f8b2d6a-9e1c-4a3f-8b7d-5c2e6a9f1b04",
"starts_at": "2026-10-03T09:00:00Z",
"ends_at": "2026-10-03T12:00:00Z",
"companions": [
{
"person_id": "c2e6a9f1-7b3d-4e8a-9f5c-1d4b8e2a6c71",
"relationship": "guardian"
}
]
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"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",
"companions": [
{
"person_id": "<string>",
"relationship": "companion"
}
],
"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>"
}{
"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_.
Body
The role's place on the shift: a role's id in the shift's roles.
The stretch they are taking. For a whole-shift role, the shift's own start.
For a whole-shift role, the shift's own end.
Who is signing up. The person who created the key, unless you say.
People sharing this person's place. They do not use up a place of their own.
Show child attributes
Show child attributes
Response
The sign-up, as it was made.
The role on the shift this sign-up is for.
Who signed up.
The stretch of the shift they took.
booked: signed up. cancellation_requested: asked to be let off inside the notice period, waiting for a coordinator. cancelled: given up. attended and no_show: what happened on the day.
booked, cancellation_requested, cancelled, attended, no_show Show child attributes
Show child attributes
Your organization's ID.
The hours worked, once recorded.
x >= 0Who signed off the hours: a person's record ID.
When the hours were signed off. Null until they are.
When they asked to be let off inside the notice period.
The reason they gave for giving it up, if any.
A coordinator's answer to the latest request: released (let off) or kept (still expected).
released, kept, null Who answered: a person's record ID.
What the coordinator wrote with the answer.
Your own sign-up fields, as JSON text.