Skip to main content

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
FieldTypeRequiredDescription
schedule_idsarrayYesSession ids to change
capacityintegerConditionalThe new capacity. Required unless unlimited is true
unlimitedbooleanNoRemove 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
FieldTypeRequiredDescription
schedule_idsarrayYesSession ids to move
start_timestringYesNew 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
FieldTypeRequiredDescription
schedule_idsarrayYesTimed session ids to change
duration_valuenumberYesA number greater than zero
duration_unitstringYesMinutes, 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
FieldTypeRequiredDescription
schedule_idsarrayYesSession ids to staff
staff_idsarrayYesStaff to put on
replacebooleanNoClear whoever is currently on those sessions first. Default false (add alongside)
notifybooleanNoEmail 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
FieldTypeRequiredDescription
schedule_idsarrayYesSession 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
FieldTypeRequiredDescription
datestringYesThe 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.