POST /api/v1/bookings/{bookingId}/reschedule
Moves a booking: villa, day, start time, duration.
The price survives. priceAmount absent from the body is not written — the frozen price stays.
Sending it is an explicit renegotiation.
The booking is excluded from its own collision check: moving it by one hour on the same villa is not a conflict. Moving into the past is allowed — recording a slot that shifted yesterday is real work — and opening hours and collisions still apply.
| Role in the organization | This endpoint |
|---|---|
owner | Allowed |
admin | Allowed |
member | Allowed |
| Field | Type | Required | Description |
|---|---|---|---|
propertyId | uuid | yes | Target villa, active, in the same organization |
date | string | yes | Local day YYYY-MM-DD |
startMinute | integer | yes | Minutes from local midnight |
durationMinutes | integer | yes | Must be priced for the target villa |
priceAmount | integer | no | Only if the price is renegotiated |
curl -X POST -H "x-api-key: $VILLASLOT_API_KEY" -H "content-type: application/json" \
-d '{"propertyId":"1f0a…","date":"2026-09-13","startMinute":600,"durationMinutes":120}' \
"https://villaslot.app/api/v1/bookings/5b2c…/reschedule"200 OK — the moved booking.409 Conflict — the target slot, or its buffer, is taken; detail names what blocks.422 Unprocessable Entity — the booking is neither a hold nor confirmed, the target villa is
not bookable, or the duration has no rate on it.401 Unauthorized — missing or invalid key, or a key whose bearer left the organization.404 Not Found — unknown id, or an id belonging to another organization. The two are
deliberately indistinguishable.429 Too Many Requests — over 120 requests in a minute for this key.