curl --request POST \
--url https://{organization}.rescueconsole.com/api/shifts/qualifications \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"person_id": "4f8b2d6a-9e1c-4a3f-8b7d-5c2e6a9f1b04",
"role_id": "9a7c3e5f-1d2b-4c8a-b6e4-3f9d1a5c7e28",
"location_unit_id": "6d1a9f3c-8e5b-4b2d-a7c9-4e1f6b3d8a52",
"expires_at": "2027-10-31",
"notes": "Completed kennel safety training on 12 September."
}
'const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
person_id: '4f8b2d6a-9e1c-4a3f-8b7d-5c2e6a9f1b04',
role_id: '9a7c3e5f-1d2b-4c8a-b6e4-3f9d1a5c7e28',
location_unit_id: '6d1a9f3c-8e5b-4b2d-a7c9-4e1f6b3d8a52',
expires_at: '2027-10-31',
notes: 'Completed kennel safety training on 12 September.'
})
};
fetch('https://{organization}.rescueconsole.com/api/shifts/qualifications', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://{organization}.rescueconsole.com/api/shifts/qualifications"
payload = {
"person_id": "4f8b2d6a-9e1c-4a3f-8b7d-5c2e6a9f1b04",
"role_id": "9a7c3e5f-1d2b-4c8a-b6e4-3f9d1a5c7e28",
"location_unit_id": "6d1a9f3c-8e5b-4b2d-a7c9-4e1f6b3d8a52",
"expires_at": "2027-10-31",
"notes": "Completed kennel safety training on 12 September."
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"id": "<string>",
"person_id": "<string>",
"role_id": "<string>",
"approved_at": "2023-11-07T05:31:56Z",
"is_live": true,
"role_key": "<string>",
"role_label": "<string>",
"location_unit_id": "<string>",
"location_name": "<string>",
"approved_by": "<string>",
"expires_at": "2023-12-25",
"revoked_at": "2023-11-07T05:31:56Z",
"notes": "<string>",
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z"
}{
"id": "<string>",
"person_id": "<string>",
"role_id": "<string>",
"approved_at": "2023-11-07T05:31:56Z",
"is_live": true,
"role_key": "<string>",
"role_label": "<string>",
"location_unit_id": "<string>",
"location_name": "<string>",
"approved_by": "<string>",
"expires_at": "2023-12-25",
"revoked_at": "2023-11-07T05:31:56Z",
"notes": "<string>",
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z"
}{
"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)"
}Approve a volunteer
Approves a person for a role, or renews the approval they hold: the same person, role and location again updates that approval, with the new expiry and notes, rather than adding a second. The approval is recorded as given by the person who created the key. A new approval, though not a renewal, starts any workflow set to run “when they are approved as a volunteer”. 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/qualifications \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"person_id": "4f8b2d6a-9e1c-4a3f-8b7d-5c2e6a9f1b04",
"role_id": "9a7c3e5f-1d2b-4c8a-b6e4-3f9d1a5c7e28",
"location_unit_id": "6d1a9f3c-8e5b-4b2d-a7c9-4e1f6b3d8a52",
"expires_at": "2027-10-31",
"notes": "Completed kennel safety training on 12 September."
}
'const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
person_id: '4f8b2d6a-9e1c-4a3f-8b7d-5c2e6a9f1b04',
role_id: '9a7c3e5f-1d2b-4c8a-b6e4-3f9d1a5c7e28',
location_unit_id: '6d1a9f3c-8e5b-4b2d-a7c9-4e1f6b3d8a52',
expires_at: '2027-10-31',
notes: 'Completed kennel safety training on 12 September.'
})
};
fetch('https://{organization}.rescueconsole.com/api/shifts/qualifications', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://{organization}.rescueconsole.com/api/shifts/qualifications"
payload = {
"person_id": "4f8b2d6a-9e1c-4a3f-8b7d-5c2e6a9f1b04",
"role_id": "9a7c3e5f-1d2b-4c8a-b6e4-3f9d1a5c7e28",
"location_unit_id": "6d1a9f3c-8e5b-4b2d-a7c9-4e1f6b3d8a52",
"expires_at": "2027-10-31",
"notes": "Completed kennel safety training on 12 September."
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"id": "<string>",
"person_id": "<string>",
"role_id": "<string>",
"approved_at": "2023-11-07T05:31:56Z",
"is_live": true,
"role_key": "<string>",
"role_label": "<string>",
"location_unit_id": "<string>",
"location_name": "<string>",
"approved_by": "<string>",
"expires_at": "2023-12-25",
"revoked_at": "2023-11-07T05:31:56Z",
"notes": "<string>",
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z"
}{
"id": "<string>",
"person_id": "<string>",
"role_id": "<string>",
"approved_at": "2023-11-07T05:31:56Z",
"is_live": true,
"role_key": "<string>",
"role_label": "<string>",
"location_unit_id": "<string>",
"location_name": "<string>",
"approved_by": "<string>",
"expires_at": "2023-12-25",
"revoked_at": "2023-11-07T05:31:56Z",
"notes": "<string>",
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z"
}{
"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
Response
The approval, renewed.
When it was given, or last renewed.
Whether it is in force today: not withdrawn and not past its last day.
Where the approval holds, for a location-scoped role.
Who approved it: a person's record ID.
The last day it holds (YYYY-MM-DD). Null means it does not expire.
When it was withdrawn.