---
title: "Check whether an Appointment update would be allowed"
method: PUT
path: "/shop/appointments/{appointmentId}/check"
tags: ["Appointments"]
---

# Check whether an Appointment update would be allowed

`PUT /shop/appointments/{appointmentId}/check`

Dry-runs an `Appointment` update without persisting the change.
Reports whether the proposed assignment of practitioners, room
and time-of-day slot would succeed.

Note: this endpoint validates against time-of-day only — it
is NOT a full reschedule dry-run. The body is a strict subset
of `UpdateAppointment` (`practitioner_ids`, `room_id` and a
`HH:mm` `start_time`); other writable appointment fields (move,
stage, item_configuration, etc.) are not consulted here. Use
`PUT /shop/appointments/{appointmentId}` to actually persist
a reschedule.

Use this to surface conflicts (overlapping bookings, room
capacity, equipment availability, opening hours) to the operator
before they commit a drag-and-drop move on the calendar. The
response indicates whether the update is allowed, lists the
specific availability errors that would block it, and reports
whether the current user has the `reservations.override-rules`
permission to bypass them.

## Request body

- CheckAppointmentBody — The narrow set of `Appointment` fields the check endpoint validates against. Unlike the full `UpdateAppointment` body used by `PUT /shop/appointments/{appointmentId}`, the check route inspects only the practitioner, room and time-of-day slot — the rest of the update surface (move, stage, item_configuration, etc.) is not consulted by the dry-run.
  - `practitioner_ids` string[] — The practitioners that would be assigned to the appointment. Each entry must be a valid `Practitioner` ID; the check fails if any of the practitioners is unavailable or unqualified for the appointment type.
  - `room_id` string, nullable — The room the appointment would take place in. Pass `null` to check availability without a room constraint.
  - `start_time` string, time — Time-of-day the appointment would start, in `HH:mm` (24-hour) format. The check endpoint validates only the time-of-day slot — it does NOT accept a full RFC 3339 datetime; pass the date via the path/appointment context and the clock time here.

## Response `200`

The check was successfully carried out.

- object
  - `data` object, required
    - `allowed` boolean, required — Whether the proposed update would be allowed.
    - `errors` object[], required — If the update would not be allowed, the specific reasons why. Each entry has a `type` discriminator and a human-readable `message`.
      - `type` string, required — Identifier for the kind of error encountered.
      - `message` string, required — A message describing the specific reason the update would be blocked.
    - `user_can_override` boolean, required — Whether the current user holds the `reservations.override-rules` permission and can perform the update regardless of `allowed`.

## Other responses

- `401` — The user is unauthenticated
- `403` — The authenticated user does not have permission.
- `404` — The resource couldn't be found
- `422` — The request didn't pass validation

---

[API](https://skmtc.dev/try/apis/trybe-api.md) · [All operations](https://skmtc.dev/try/apis/trybe-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/try/trybe-api/revisions/f37f92702da5/schema)
