AppointmentDeletedEventData
This is an object representing data for the appointment deleted event.
This is an object representing data for the appointment deleted event.
Example
{ "object": { "add_to_calendar_url": "https://book.acme.com/c/appointments/appt_a1b2c3d4e5f6/add_to_calendar", "appointment_type": "in_person", "buffer_policy": { "after_duration": "PT1H", "before_duration": "PT15M", "enabled": true }, "buffered_end_at": { "local": "2025-03-01T12:00:00-05:00", "object": "zoned_date_time", "time_zone": "America/New_York", "unix_ts": 1736468400, "utc": "2025-03-01T05:00:00Z" }, "buffered_start_at": { "local": "2025-03-01T09:45:00-05:00", "object": "zoned_date_time", "time_zone": "America/New_York", "unix_ts": 1736460300, "utc": "2025-03-01T02:45:00Z" }, "cancel_url": "https://book.acme.com/c/appointments/appt_a1b2c3d4e5f6/cancel", "cancellation_events": [ { "actor": null, "cancellation_reason": { "id": "cr_a1b2c3d4e5f6", "name": "Distance too far", "object": "cancellation_reason", "sort_order": 1 }, "custom_reason_text": "I'm sick", "initiated_by": "client", "object": "cancellation_event", "occurred_at": "2023-01-01T03:00:00Z", "source": "client_ui" } ], "client": { "created_at": "2025-01-15T14:30:00Z", "email": "jane.smith@example.com", "first_name": "Jane", "id": "clnt_a1b2c3d4e5f6", "last_name": "Smith", "locale": "en-US", "metadata": { "external_id": "123" }, "object": "client", "phone": "+15551234567", "reference_id": "ext_12345", "time_zone": "America/Chicago", "updated_at": "2025-03-10T09:45:00Z" }, "client_data": { "email": "jane.smith@example.com", "fields": { "age": 30 }, "first_name": "Jane", "last_name": "Smith", "locale": "en-US", "phone": "+15551234567", "reference_id": "ext_12345", "time_zone": "America/Chicago" }, "confirm_url": "https://book.acme.com/c/appointments/appt_a1b2c3d4e5f6/confirm", "confirmation_events": [ { "actor": null, "end_at": { "local": "2023-01-01T01:00:00-05:00", "object": "zoned_date_time", "time_zone": "America/New_York", "unix_ts": 1736464800, "utc": "2023-01-01T04:00:00Z" }, "initiated_by": "client", "object": "confirmation_event", "occurred_at": "2023-01-01T03:00:00Z", "source": "client_ui", "start_at": { "local": "2023-01-01T00:00:00-05:00", "object": "zoned_date_time", "time_zone": "America/New_York", "unix_ts": 1736461200, "utc": "2023-01-01T03:00:00Z" } } ], "confirmed_at": "2025-03-10T15:30:00Z", "created_at": "2025-03-10T14:30:00Z", "end_at": { "local": "2025-03-01T11:00:00-05:00", "object": "zoned_date_time", "time_zone": "America/New_York", "unix_ts": 1736464800, "utc": "2025-03-01T04:00:00Z" }, "ics_url": "https://book.acme.com/c/appointments/appt_a1b2c3d4e5f6/ics", "id": "appt_a1b2c3d4e5f6", "join_url": "https://book.acme.com/c/appointments/appt_a1b2c3d4e5f6/join", "meeting": { "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" }, "object": "appointment", "provider": { "created_at": "2017-09-12T12:34:55Z", "display_name": "John Smith", "email": "john@example.com", "first_name": "John", "id": "prov_d025a96ac0c6", "last_name": "Smith", "metadata": { "external_id": "123" }, "object": "provider", "time_zone": "America/New_York", "updated_at": "2017-09-13T10:11:12Z" }, "providers": [ { "created_at": "2017-09-12T12:34:55Z", "display_name": "John Smith", "email": "john@example.com", "first_name": "John", "id": "prov_d025a96ac0c6", "last_name": "Smith", "metadata": { "external_id": "123" }, "object": "provider", "role": "primary", "time_zone": "America/New_York", "updated_at": "2017-09-13T10:11:12Z" } ], "reschedule_events": [ { "actor": null, "initiated_by": "client", "new_end_at": { "local": "2023-01-01T01:00:00-05:00", "object": "zoned_date_time", "time_zone": "America/New_York", "unix_ts": 1736464800, "utc": "2023-01-01T04:00:00Z" }, "new_start_at": { "local": "2023-01-01T00:00:00-05:00", "object": "zoned_date_time", "time_zone": "America/New_York", "unix_ts": 1736461200, "utc": "2023-01-01T03:00:00Z" }, "object": "reschedule_event", "occurred_at": "2023-01-01T03:00:00Z", "previous_end_at": { "local": "2023-01-01T01:00:00-05:00", "object": "zoned_date_time", "time_zone": "America/New_York", "unix_ts": 1736464800, "utc": "2023-01-01T04:00:00Z" }, "previous_start_at": { "local": "2023-01-01T00:00:00-05:00", "object": "zoned_date_time", "time_zone": "America/New_York", "unix_ts": 1736461200, "utc": "2023-01-01T03:00:00Z" }, "source": "client_ui" } ], "reschedule_url": "https://book.acme.com/c/appointments/appt_a1b2c3d4e5f6/reschedule", "service": { "appointment_type": "in_person", "booking_policy": { "advance_notice": { "enabled": true, "minimum_duration": "PT1H" }, "allow_booking": true, "disabled_message": "Booking is disabled for this service.", "hold": { "duration": "PT10M", "enabled": true }, "maximize_utilization": { "enabled": true } }, "buffer_policy": { "after_duration": "PT1H", "before_duration": "PT15M", "enabled": true }, "cancellation_policy": { "advance_notice": { "enabled": true, "minimum_duration": "PT1H" }, "allow_cancellation": true, "disabled_message": "Cancellation is disabled for this service." }, "change_policy_text": "Appointments within 48 hours cannot be canceled or rescheduled online. Please call our office.", "created_at": "2025-02-17T17:49:19Z", "duration": "PT1H30M", "forms": [ { "created_at": "2025-02-17T17:49:19Z", "form_id": "frm_d025a96ac0c6", "form_name": "Intake Form", "id": "sf_d025a96ac0c6", "object": "service_form", "sort_order": 1, "updated_at": "2025-02-17T17:49:19Z" } ], "id": "srv_d025a96ac0c6", "internal_name": null, "metadata": { "external_id": "123" }, "name": "Initial Consult", "object": "service", "provider_notifications": { "additional_recipients": [ "admin@example.com" ], "notify_provider": true, "types": [ { "type": "new_appointment" } ] }, "rescheduling_policy": { "advance_notice": { "enabled": true, "minimum_duration": "PT1H" }, "allow_rescheduling": true, "disabled_message": "Rescheduling is disabled for this service." }, "slot_rules": [ { "recurrence_rule": { "byday": [ "mo", "we", "fr" ], "freq": "weekly" }, "start_times": [ "09:00", "10:00" ] } ], "updated_at": "2025-02-17T17:49:19Z" }, "start_at": { "local": "2025-03-01T10:00:00-05:00", "object": "zoned_date_time", "time_zone": "America/New_York", "unix_ts": 1736461200, "utc": "2025-03-01T03:00:00Z" }, "status": "scheduled", "updated_at": "2025-03-10T14:30:00Z", "urls": { "add_to_calendar": [ "https://book.acme.com/c/appointments/appt_a1b2c3d4e5f6/add_to_calendar" ], "add_to_google_calendar": [ "https://book.acme.com/c/appointments/appt_a1b2c3d4e5f6/add_to_google_calendar" ], "cancel": [ "https://book.acme.com/c/appointments/appt_a1b2c3d4e5f6/cancel" ], "confirm": [ "https://book.acme.com/c/appointments/appt_a1b2c3d4e5f6/confirm" ], "ics": [ "https://book.acme.com/c/appointments/appt_a1b2c3d4e5f6/ics" ], "join": [ "https://book.acme.com/c/appointments/appt_a1b2c3d4e5f6/join" ], "reschedule": [ "https://book.acme.com/c/appointments/appt_a1b2c3d4e5f6/reschedule" ] } }, "type": "appointment.deleted"}AppointmentCreatedEventData
This is an object representing data for the appointment created event.
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).