Fixed
OnSched 3.9.0 - reschedule controls, booking retention, and availability timezones
23 days ago by ReadMe GitHub Action
API
- Silent reschedules:
PUT /v3/appointment/{id}/reschedulenow acceptsskip_notifications: truein the request body. Use it for provider-only or other operational changes that should not send email or SMS to the customer, company, or assigned resources. - Integrations stay synchronized: Silent reschedules still emit the
APPOINTMENT_RESCHEDULEDwebhook and refresh Google Calendar or Outlook events. - Backward compatible: Omitting the flag, or setting it to
false, keeps existing reschedule notification behavior.
Appointment retention
- Booked records cannot be permanently deleted:
DELETE /v3/appointment/{id}rejectsBK,CN, andREappointments. Cancel booked appointments withPUT /v3/appointment/{id}/cancelso billing and lifecycle history remain available. - Hold cleanup remains available: Initial (
IN) and reserved (RS) holds may still be permanently deleted.
Availability fix
- Held slots stay out of availability: Holds created at a location without a booking timer were stored as already expired, so
GET /v3/availabilitykept returning the held slot and a second hold or booking on that slot could succeed. Those holds now protect their slot. - No timer means no expiry: When a location has no positive
expirationDelay, a hold does not expire on its own; book it or delete it to release the slot. Set a positiveexpirationDelayto keep automatic release for abandoned checkouts.
Availability timezones
- Location wins for weekly hours:
GET /v3/availabilityconverts weekly schedule and allocation wall-clock times using the request location timezone (and resource timezone when applicable), not a frozenianastamped when the schedule was saved under a different company or sibling location timezone. - Multi-location company-scoped services: An
08:00–20:00weekly allocation at a Pacific location now opens at15:00Zduring PDT even when company timezone or saved schedule rows are Eastern.
Clearer errors
- Resource problems say so: Booking, holding, reserving, rescheduling, or validating resources with a
ResourceIdsentry that is not one of your resources — or is not linked to the requested location and service — now returns400with a message naming that resource id. These requests previously reported the time slot as unavailable. POST /v3/customervalidatesLocationId: An unknown location returns400naming the id instead of500 Something went wrong.- Missing path ids are rejected as bad requests:
DELETE /v3/customer/with no id returns400 Customer id is required. 400for payload ids,404for path ids: An unknownLocationIdorServiceIdsent to the appointment create endpoints, and an unknownLocationIdfilter onGET /v3/customers, now return400instead of404.404means the record addressed in the URL path does not exist. Update any integration branching on404for those payload errors.- Unmatched routes return JSON: A request to an unknown path returns the standard
{ "success": false, "message": ..., "errors": [] }body instead of an HTML page. - No
422responses: The error reference previously listed422 Unprocessable Entityfor slot conflicts and unlinked resources. The API has always returned400for those; the documentation now matches. See Error Codes.
