Bulk Schedule Actions
Change many of an experience's sessions in one request: capacity, time of day, duration, staffing, or removal. These are the API twin of the bulk bar on the experience's Availability tab, and they run the same code, so the outcome is identical whichever surface you use.
All five accept a list of session ids. Get them from List Schedules.
Authenticationโ
Requires an API key with the experiences:write scope.
Shared rulesโ
- A session id belonging to another experience or another account is ignored and counted in
errorsโ it is never modified. - A session that already has bookings is never silently oversold or removed. It is skipped and named in the response so you can act on it.
- Partial success is normal and is reported honestly: read the counts, don't assume the whole list was applied.
Set capacityโ
POST /v1/experiences/{id}/schedules/bulk-capacity
| Field | Type | Required | Description |
|---|---|---|---|
schedule_ids | array | Yes | Session ids to change |
capacity | integer | Conditional | The new capacity. Required unless unlimited is true |
unlimited | boolean | No | Remove the capacity limit on these sessions |
A session already holding more than the new capacity is skipped and appears in skipped with its
label and current booked count.
curl -X POST "https://app.equipdash.com/api/v1/experiences/1/schedules/bulk-capacity" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "schedule_ids": [4139, 4140, 4141], "capacity": 8 }'
{
"data": {
"experience_id": 1,
"updated": 2,
"skipped": [{ "label": "Sat 12 Sep, 11:00 AM", "booked": 10 }],
"errors": 0
}
}
Change the time of dayโ
POST /v1/experiences/{id}/schedules/bulk-time
| Field | Type | Required | Description |
|---|---|---|---|
schedule_ids | array | Yes | Session ids to move |
start_time | string | Yes | New start time, 24-hour HH:MM |
Each session keeps its own date and duration; only the time of day moves. Sessions that run across
more than one day carry an explicit return date and time, so they are skipped and counted in
skipped_multi_day. Change those individually.
{
"data": { "experience_id": 1, "updated": 6, "skipped_multi_day": 1, "errors": 0 }
}
Change durationโ
POST /v1/experiences/{id}/schedules/bulk-duration
| Field | Type | Required | Description |
|---|---|---|---|
schedule_ids | array | Yes | Timed session ids to change |
duration_value | number | Yes | A number greater than zero |
duration_unit | string | Yes | Minutes, Hours, or Days |
Each timed session keeps its start and gets a new finish. Date-only sessions are left unchanged and
counted in skipped_date_only. The experience's default duration and repeating schedule do not
change.
curl -X POST "https://app.equipdash.com/api/v1/experiences/1/schedules/bulk-duration" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "schedule_ids": [4139, 4140, 4141], "duration_value": 90, "duration_unit": "Minutes" }'
{
"data": {
"experience_id": 1,
"updated": 2,
"skipped_date_only": 1,
"errors": 0,
"duration_minutes": 90
}
}
Assign guidesโ
POST /v1/experiences/{id}/schedules/bulk-guides
| Field | Type | Required | Description |
|---|---|---|---|
schedule_ids | array | Yes | Session ids to staff |
staff_ids | array | Yes | Staff to put on |
replace | boolean | No | Clear whoever is currently on those sessions first. Default false (add alongside) |
notify | boolean | No | Email the staff about their new sessions. Default true |
Each staff member receives one email listing every session they were added to, not one per
session. Anyone who cannot work a session (approved time off, a clash) is skipped and named in
blocked; soft issues such as no rostered shift appear in warnings.
{
"data": {
"experience_id": 1,
"assigned": 6,
"sessions_affected": 6,
"duplicates": 0,
"blocked": [],
"warnings": ["Alex Green on Sat 12 Sep, 11:00 AM โ no shift covering this session"],
"errors": 0
}
}
Remove sessionsโ
POST /v1/experiences/{id}/schedules/bulk-delete
| Field | Type | Required | Description |
|---|---|---|---|
schedule_ids | array | Yes | Session ids to remove |
Sessions with bookings are kept and returned in kept_with_bookings. Cancel those bookings first
if the session really has to go.
{
"data": {
"experience_id": 1,
"deleted": 5,
"kept_with_bookings": ["Sat 12 Sep, 11:00 AM"],
"errors": 0
}
}
Copy a session to another dateโ
POST /v1/experiences/{id}/schedules/{scheduleId}/duplicate
| Field | Type | Required | Description |
|---|---|---|---|
date | string | Yes | The date for the copy (YYYY-MM-DD) |
Keeps the session's time, capacity and guide requirement. Guides are not copied โ who is
working a different day is a separate decision. Returns 201 with the new schedule, or 409 if a
session already exists at that date and time.