Update Booking Option
Rename a way of booking, change how it is priced, or change the party size it takes.
Endpointโ
PATCH /v1/experiences/{id}/booking-options/{optionId}
Authenticationโ
Requires an API key with the experiences:write scope. There is no separate booking-options scope.
Path Parametersโ
| Parameter | Type | Description |
|---|---|---|
id | integer | Experience ID |
optionId | integer | Booking option ID |
Request Bodyโ
Every field is optional. Only send what you want to change.
| Field | Type | Description |
|---|---|---|
name | string | What the shop calls this way of booking. 1 to 120 characters |
price_structure | string | participant (a price per person) or group (one price for the whole party) |
exclusive | boolean | true when booking this takes the whole session |
min_people | integer | Smallest party this option takes, at least 1. Send null to clear it |
max_people | integer | Largest party this option takes, at least 1. Send null to clear it |
default_groups_capacity | integer | How many groups one session sells under this option, at least 1. Send null to go back to the experience's own number |
unit_name | string | What each group is under this option, for example canoe. Up to 40 characters. Send null to follow the experience's unit_name again |
unit_name_plural | string | The plural, when the worked-out one is wrong. Up to 40 characters |
duration_value | number | This option's own length, greater than zero |
duration_unit | string | minutes, hours or days |
An empty body returns the option unchanged.
To move an option up or down the list, use Reorder booking options. To stop offering it, use Archive or restore.
Example Requestโ
curl -X PATCH "https://app.equipdash.com/api/v1/experiences/1234567/booking-options/4322" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Private session (up to 6)",
"max_people": 6
}'
Responseโ
Success (200 OK)โ
{
"data": {
"id": 4322,
"experience_id": 1234567,
"name": "Private session (up to 6)",
"price_structure": "group",
"exclusive": true,
"unit_name": null,
"unit_name_plural": null,
"min_people": 1,
"max_people": 6,
"default_groups_capacity": null,
"duration": {
"value": 90,
"unit": "minutes"
},
"sort_order": 1,
"archived": false,
"archived_at": null,
"created_at": "2026-01-15T10:05:00+00:00",
"updated_at": "2026-02-01T10:00:00+00:00"
},
"meta": {
"request_id": "req_abc123",
"timestamp": "2026-02-01T10:00:00+00:00"
}
}
Errorsโ
| Status | Code | Description |
|---|---|---|
| 401 | authentication_required | No API key provided |
| 401 | invalid_api_key | Invalid API key |
| 403 | insufficient_scope | API key lacks experiences:write scope |
| 403 | forbidden | Experience belongs to a different supplier |
| 404 | resource_not_found | Experience does not exist, or the option does not belong to it |
| 422 | validation_error | Invalid request body |
Validation Rulesโ
The rules match Create booking option, and they are checked against the option as it will be after your change. Raising min_people past the max_people already on the option is refused even when you only sent one of them.
Messages from those rules come back under the field name in error.details, whatever the field actually at fault was.
Notesโ
- Renaming an option never rewrites what an existing booking says. Each booking line keeps the label as it read when the booking was taken.