A valid request URL is required to generate request examples{
"id": "appt-ok",
"associateId": "user-julie",
"customerId": "cust-1",
"storeId": "store-rivoli",
"startsAt": "2030-01-02T14:00:00.000Z",
"endsAt": "2030-01-02T15:00:00.000Z",
"status": "requested",
"actorId": "user-julie",
"bookedAt": "2026-07-28T09:00:00.000Z"
}{
"error": {
"code": "VALIDATION_FAILED",
"message": "<string>",
"statusCode": 123,
"fieldErrors": [
{
"field": "<string>",
"message": "<string>"
}
]
}
}{
"error": {
"code": "VALIDATION_FAILED",
"message": "<string>",
"statusCode": 123
}
}{
"error": {
"code": "VALIDATION_FAILED",
"message": "<string>",
"statusCode": 123
}
}{
"error": {
"code": "VALIDATION_FAILED",
"message": "<string>",
"statusCode": 123
}
}{
"error": {
"code": "VALIDATION_FAILED",
"message": "<string>",
"statusCode": 123
}
}{
"error": {
"code": "VALIDATION_FAILED",
"message": "<string>",
"statusCode": 123
}
}{
"error": {
"code": "VALIDATION_FAILED",
"message": "<string>",
"statusCode": 123
}
}Reschedule an appointment (RDV)
MOVES an existing booking onto a new half-open [startsAt, endsAt) slot (ISO 8601 instants the server coerces), KEEPING its identity, its status and its attribution — this is what to reach for instead of cancelling and re-booking, which loses the history and hands the customer a new rendez-vous number. The appointment is addressed by the PATH id; the body carries the new slot only. Only a still-active booking can move: a requested or confirmed one, which stays in that same status afterwards. 404s for an unknown appointment; 422s for a terminal booking (completed / cancelled / no-show) or a slot already in the past; 409s when the new slot overlaps ANOTHER active booking for the same associate — the appointment being moved is excluded, so re-posting its current slot is a no-op, not a self-conflict.
A valid request URL is required to generate request examples{
"id": "appt-ok",
"associateId": "user-julie",
"customerId": "cust-1",
"storeId": "store-rivoli",
"startsAt": "2030-01-02T14:00:00.000Z",
"endsAt": "2030-01-02T15:00:00.000Z",
"status": "requested",
"actorId": "user-julie",
"bookedAt": "2026-07-28T09:00:00.000Z"
}{
"error": {
"code": "VALIDATION_FAILED",
"message": "<string>",
"statusCode": 123,
"fieldErrors": [
{
"field": "<string>",
"message": "<string>"
}
]
}
}{
"error": {
"code": "VALIDATION_FAILED",
"message": "<string>",
"statusCode": 123
}
}{
"error": {
"code": "VALIDATION_FAILED",
"message": "<string>",
"statusCode": 123
}
}{
"error": {
"code": "VALIDATION_FAILED",
"message": "<string>",
"statusCode": 123
}
}{
"error": {
"code": "VALIDATION_FAILED",
"message": "<string>",
"statusCode": 123
}
}{
"error": {
"code": "VALIDATION_FAILED",
"message": "<string>",
"statusCode": 123
}
}{
"error": {
"code": "VALIDATION_FAILED",
"message": "<string>",
"statusCode": 123
}
}Authorizations
Authorization: Bearer <token>. Accepts EITHER a Keycloak access token (scopes-in-token) OR an opaque POS session token; both resolve to the same pos.* scope vocabulary the route guards enforce.
Path Parameters
Id of the appointment (RDV) to read or transition.
1Body
ISO 8601 inclusive start of the NEW slot; must be future.
^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$ISO 8601 exclusive end of the NEW slot; must be after start.
^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$Response
The appointment on its new slot, status and attribution unchanged.
The appointment on its new slot, status and attribution unchanged.

