Reschedule
Move an existing appointment to a new slot.
POST /v1/appointments/:appointmentId/rescheduleMoves a booking to a different time. The patient, the charge and the payment state travel with it — only the slot changes, plus an optional edit to the discount.
Not OTP-gated: the appointment already exists and you are addressing it by its own id.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
appointmentId | number | Yes | The numeric appointment id. |
Body
Three fields identify the target slot and are lifted out of the body into the upstream query; the rest describe the new time.
| Field | Type | Required | Description |
|---|---|---|---|
addressId | number | Yes | The location of the new slot. workspaceAddressId is accepted as an alias. |
doctorId | number | Yes | The doctor of the new slot — this is how you move a patient onto a different practitioner. |
fromDateTimeIso | string | Yes* | New start, ISO 8601 with an offset. |
toDateTimeIso | string | Yes* | New end, same form. |
appointmentDate | string | Conditional | YYYY-MM-DD. Required only with the legacy HH:mm pair. |
fromDateTimeTs | string | * | Legacy HH:mm start. Deprecated — carries no timezone. |
toDateTimeTs | string | * | Legacy HH:mm end. |
discountAmount | number | No | Edit the discount while moving. Omit to leave it untouched; 0 removes it. Must not exceed the appointment's consultationCharge. |
discountReason | string | No | Up to 200 characters. Omit to leave the existing reason. |
* Send either the ISO pair or appointmentDate plus the HH:mm pair. If
both arrive, the ISO form wins.
Try it
/v1/appointments/:appointmentId/reschedulePath
Body
POST /v1/appointments//reschedule{
"addressId": "1",
"doctorId": "4"
}https://api.medos.oneUse a dedicated test key, and put your browser's address on its allowlist
A Developer API key authenticates on its own, so it only works from the addresses registered against it — and this page calls from your browser, not your servers. Unless your own public address is on the list you get a 403 naming it, which is the allowlist doing its job. Your browser may also reach us over IPv6 even when your server does not, so the address in the error is often not the one you expected. The key here is kept in memory only and never written to storage, but create a test key for it and deactivate that key when you are done.
Request
curl -sX POST "https://api.medos.one/v1/appointments/9182/reschedule" \
-H "x-api-key: $MEDOS_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"addressId": 1,
"doctorId": 4,
"fromDateTimeIso": "2026-09-22T11:00:00+05:30",
"toDateTimeIso": "2026-09-22T11:30:00+05:30"
}'Response
{
"appointment": {
"id": 9182,
"workspaceId": 1,
"addressId": 1,
"doctorId": 4,
"patientId": 774,
"bookingReference": "MED-9182-AK",
"appointmentDate": "2026-09-22"
},
"fromDateTimeTs": "2026-09-22T11:00:00+05:30",
"toDateTimeTs": "2026-09-22T11:30:00+05:30",
"appointmentTimezone": "Asia/Kolkata",
"discountAmount": 0,
"discountReason": null
}The top-level fromDateTimeTs / toDateTimeTs are the authoritative new times,
already rendered in the clinic's zone. appointment is the stored record.
This is where a numeric appointment id shows up
appointment.id here is the same id this route takes in its path — useful if
you are reconciling records rather than tracking bookings by
bookingReference.
Common failures
| Status | Cause |
|---|---|
400 | Neither timing form is complete: no ISO pair, and no appointmentDate plus HH:mm pair. |
400 | discountAmount above the appointment's charge. |
404 | No appointment with that id in your workspace. |
5xx | A target slot taken in the meantime surfaces here rather than as a clean conflict. Re-read available slots before retrying. |
Check the new slot first
Rescheduling does not search for a free time — it takes the one you name. Read
the slot grid for the target date and pick from slots[].