Update (reschedule) a contact's appointment
Finds the contact by contact_id or phone_number, then updates their
appointment to the new date/time. Both the appointments table row
(source of truth — calendar links regenerate automatically) and the
contact's appointment_date, appointment_time, and
appointment_date_display columns are updated together, so the contact
record always matches the appointment.
Which appointment is updated: the contact's next upcoming
appointment; if none is upcoming, their most recent one. If the contact
has no appointments at all, a new one is created
(created_new_appointment: true in the response).
Unlike POST, this endpoint does NOT fire "Appointment Booked" flow triggers or stop sequences — safe to call from a flow's Run API Request action without causing trigger loops. It also never creates a contact: an unknown identifier returns 404.
Required fields: adate, atime, and one of contact_id / phone_number.
Timezone resolution priority (to convert adate+atime to UTC):
- Caller-provided
timezone(IANA name or abbreviation like "PST") - Contact's
timezonecolumn - Phone area code → IANA timezone (US numbers)
- Caller-provided
adate_utc(used as-is) - UTC (last resort)
https://api.channelautomation.com/api/appointmentsAuthorization
Request body JSON required
Returns
200
Appointment updated (or created when the contact had none).
400
Invalid request payload (missing identifier or datetime)
- reasonoptionalstring
Short error code for programmatic handling. Possible values:
missing_phonemissing_adatemissing_atimemissing_workspacemissing_workspace_contextcontact_upsert_failedcontact_upsert_exceptiondatetime_resolution_failedappointment_insert_failedappointment_insert_exceptionunhandled_exception
Additional values returned by PUT /api/appointments:
missing_identifier(neither contact_id nor phone_number provided)invalid_contact_id(contact_id is not a valid UUID)contact_not_foundcontact_lookup_failedappointment_lookup_failedappointment_update_failedfeature_disabled(APPOINTMENT_UPDATE_API flag is off for the workspace)
403
API key lacks contacts.write permission
404
No contact found for the provided identifier in this workspace
- reasonoptionalstring
Short error code for programmatic handling. Possible values:
missing_phonemissing_adatemissing_atimemissing_workspacemissing_workspace_contextcontact_upsert_failedcontact_upsert_exceptiondatetime_resolution_failedappointment_insert_failedappointment_insert_exceptionunhandled_exception
Additional values returned by PUT /api/appointments:
missing_identifier(neither contact_id nor phone_number provided)invalid_contact_id(contact_id is not a valid UUID)contact_not_foundcontact_lookup_failedappointment_lookup_failedappointment_update_failedfeature_disabled(APPOINTMENT_UPDATE_API flag is off for the workspace)
500
Appointment update failed (DB error)
- reasonoptionalstring
Short error code for programmatic handling. Possible values:
missing_phonemissing_adatemissing_atimemissing_workspacemissing_workspace_contextcontact_upsert_failedcontact_upsert_exceptiondatetime_resolution_failedappointment_insert_failedappointment_insert_exceptionunhandled_exception
Additional values returned by PUT /api/appointments:
missing_identifier(neither contact_id nor phone_number provided)invalid_contact_id(contact_id is not a valid UUID)contact_not_foundcontact_lookup_failedappointment_lookup_failedappointment_update_failedfeature_disabled(APPOINTMENT_UPDATE_API flag is off for the workspace)
