curl --request POST \
--url https://{organization}.rescueconsole.com/api/shifts/schedules \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "Contoso Adoption Day",
"event_kind": "adoption",
"starts_at": "2026-10-03T10:00:00Z",
"ends_at": "2026-10-03T16:00:00Z",
"location_unit_id": "6d1a9f3c-8e5b-4b2d-a7c9-4e1f6b3d8a52",
"description": "Adoption day at the Contoso pet store on Main Street."
}
'const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: 'Contoso Adoption Day',
event_kind: 'adoption',
starts_at: '2026-10-03T10:00:00Z',
ends_at: '2026-10-03T16:00:00Z',
location_unit_id: '6d1a9f3c-8e5b-4b2d-a7c9-4e1f6b3d8a52',
description: 'Adoption day at the Contoso pet store on Main Street.'
})
};
fetch('https://{organization}.rescueconsole.com/api/shifts/schedules', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://{organization}.rescueconsole.com/api/shifts/schedules"
payload = {
"name": "Contoso Adoption Day",
"event_kind": "adoption",
"starts_at": "2026-10-03T10:00:00Z",
"ends_at": "2026-10-03T16:00:00Z",
"location_unit_id": "6d1a9f3c-8e5b-4b2d-a7c9-4e1f6b3d8a52",
"description": "Adoption day at the Contoso pet store on Main Street."
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"name": "<string>",
"starts_at": "<string>",
"status": "draft",
"all_day": true,
"id": "<string>",
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z",
"description": "<string>",
"location_unit_id": "<string>",
"ends_at": "<string>",
"event_kind": "adoption",
"signup_form_config": {},
"metadata": {},
"custom_fields": {},
"tenant_id": "<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)"
}Create a schedule
Creates a schedule. Only name and starts_at are required. An all-day schedule takes dates in starts_at and ends_at; any other takes dates and times. Any of your schedule fields marked required must be sent in custom_fields. 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/schedules \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "Contoso Adoption Day",
"event_kind": "adoption",
"starts_at": "2026-10-03T10:00:00Z",
"ends_at": "2026-10-03T16:00:00Z",
"location_unit_id": "6d1a9f3c-8e5b-4b2d-a7c9-4e1f6b3d8a52",
"description": "Adoption day at the Contoso pet store on Main Street."
}
'const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: 'Contoso Adoption Day',
event_kind: 'adoption',
starts_at: '2026-10-03T10:00:00Z',
ends_at: '2026-10-03T16:00:00Z',
location_unit_id: '6d1a9f3c-8e5b-4b2d-a7c9-4e1f6b3d8a52',
description: 'Adoption day at the Contoso pet store on Main Street.'
})
};
fetch('https://{organization}.rescueconsole.com/api/shifts/schedules', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://{organization}.rescueconsole.com/api/shifts/schedules"
payload = {
"name": "Contoso Adoption Day",
"event_kind": "adoption",
"starts_at": "2026-10-03T10:00:00Z",
"ends_at": "2026-10-03T16:00:00Z",
"location_unit_id": "6d1a9f3c-8e5b-4b2d-a7c9-4e1f6b3d8a52",
"description": "Adoption day at the Contoso pet store on Main Street."
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"name": "<string>",
"starts_at": "<string>",
"status": "draft",
"all_day": true,
"id": "<string>",
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z",
"description": "<string>",
"location_unit_id": "<string>",
"ends_at": "<string>",
"event_kind": "adoption",
"signup_form_config": {},
"metadata": {},
"custom_fields": {},
"tenant_id": "<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
For an all-day schedule, a date (YYYY-MM-DD). Otherwise a date and time (2026-10-03T09:00:00Z).
One of your locations.
The same shape as starts_at, and not before it. For an all-day schedule, the last day it runs.
A draft schedule is not shown on the calendar.
draft, scheduled, active, completed, cancelled What kind of occasion it is. Null means not said.
adoption, fundraiser, clinic, transport, training, meeting, events, other, null Whether the schedule runs whole days rather than set hours.
An object kept with the schedule and returned as sent.
An object kept with the schedule and returned as sent.
Your own schedule fields, by key. See Shift custom fields.
Response
The schedule, as it was created.
For an all-day schedule, a date (YYYY-MM-DD). Otherwise a date and time (2026-10-03T09:00:00Z).
A draft schedule is not shown on the calendar.
draft, scheduled, active, completed, cancelled Whether the schedule runs whole days rather than set hours.
One of your locations.
The same shape as starts_at, and not before it. For an all-day schedule, the last day it runs.
What kind of occasion it is. Null means not said.
adoption, fundraiser, clinic, transport, training, meeting, events, other, null An object kept with the schedule and returned as sent.
An object kept with the schedule and returned as sent.
Your own schedule fields, by key. See Shift custom fields.
Your organization's ID.