Skip to main content

AppointmentMeeting

An appointment meeting represents the conferencing details for an appointment. Meetings are created asynchronously after an appointment is scheduled, so the status field reflects where the meeting is in its lifecycle. Meeting details such as join_url are populated only once the status is created.

The host_url field is a proxy URL on the account's booking domain (the canonical SavvyCal host, or an active custom domain when one is configured) that the meeting host follows to start the meeting. Treat this URL as a credential — anyone with it can start the meeting as the host. It is valid through the appointment's end time + a 24h grace window, after which it returns 410 Gone.

SavvyCal refreshes the underlying conferencing-provider URL transparently behind the proxy, so the proxy URL generally remains stable across appointment.meeting.updated events. It may change if SavvyCal rotates the underlying token (e.g., for security reasons) or when the meeting is replaced — a brand-new meeting with a new id, which happens when a reschedule routes the appointment to a different host on the account. Listen for appointment.meeting.updated and appointment.meeting.replaced to keep stored copies fresh.

host_url is null when the meeting is not yet created or when the conferencing provider has no distinct host start URL (e.g., Google Meet uses a single shared URL).

conferencing_providerstringnullablerequired

The conferencing provider for the meeting.

Example: zoom_admin
error_messagestringnullablerequired

The most-recent failure reason, if the meeting is in a failed state.

external_meeting_idstringnullablerequired

The provider's identifier for the meeting.

Example: 82912345678
host_urlurinullablerequired

Proxy URL the host follows to start the meeting. Treat as a credential — anyone with this URL can start the meeting as host. Valid through the appointment's end time + 24h grace window, then returns 410 Gone. Generally stable, but may change across appointment.meeting.updated events (e.g., if SavvyCal rotates the token) and always changes when the meeting is replaced (appointment.meeting.replaced). Null when the meeting is not created or when the conferencing provider has no distinct host start URL.

idstringrequired

Unique identifier for the object.

Possible values: Value must match regular expression ^amtg_\w{12}$

join_urlurinullablerequired

The URL attendees use to join the meeting.

objectstringrequired

String representing the object's type.

Possible values: [appointment_meeting]

passwordstringnullablerequired

The meeting password, if any.

statusstringrequired

The current state of the meeting. Lifecycle:

  • pending — meeting creation has not yet been attempted
  • created — meeting was successfully created with the conferencing provider
  • failed — most-recent attempt failed; see error_message for details
  • skipped — meeting creation was skipped (no conferencing configured)
  • update_pending — meeting update is pending after a reschedule
  • cancel_pending — meeting cancellation is pending after appointment cancel
  • canceled — meeting was successfully canceled with the conferencing provider

Possible values: [pending, created, failed, skipped, update_pending, cancel_pending, canceled]

AppointmentMeeting
{
"conferencing_provider": "zoom_admin",
"error_message": null,
"external_meeting_id": "82912345678",
"host_url": "https://book.acme.com/p/appointments/appt_a1b2c3d4e5f6/host?token=An5thqO6Li9Dy9WXe3IsJQYDEXGjS70GjQIdNntKZgw",
"id": "amtg_a1b2c3d4e5f6",
"join_url": "https://zoom.us/j/82912345678",
"object": "appointment_meeting",
"password": "abc123",
"status": "created"
}