Skip to main content

API Changelog

A log of notable changes to the SavvyCal Appointments API.

May 18, 2026

  • Changed: -- The X-SavvyCal-Account header is no longer listed as a parameter on individual operations in the OpenAPI spec or API reference; it's now documented once on the Platforms and Authentication pages. The header is unchanged at the protocol level — it is still required when authenticating with a platform token to specify the target account.
  • New: -- The Create Provider and Update Provider endpoints now accept an optional time_zone field for setting the provider's preferred IANA time zone. When omitted on create, it defaults to the account location's time zone. See CreateProviderRequest and UpdateProviderRequest.

May 16, 2026

  • Changed: -- The start_date and end_date fields on Block, CreateBlockRequest, and UpdateBlockRequest have been consolidated into a single date field. The List Blocks endpoint's start_date, end_date, start_date_min, start_date_max, end_date_min, and end_date_max query parameters have likewise been replaced with date, date_min, and date_max, and results are now sorted by date.

May 15, 2026

  • New: -- Provider and AppointmentProvider responses now include a time_zone field — the provider's preferred IANA time zone, used as the default when authoring schedules.
  • New: -- Provider schedules now have a time_zone field. ProviderSchedule responses include the IANA time zone the schedule's weekly rules are authored in, and the Create Provider Schedule and Update Provider Schedule endpoints accept an optional time_zone to declare it; when omitted, it defaults to the provider's time zone.

May 12, 2026

  • New: -- AppointmentMeeting now includes a host_url field — a proxy URL on the account's booking domain that the meeting host follows to start the meeting. SavvyCal refreshes the underlying conferencing-provider URL behind the proxy transparently, so the proxy URL is generally stable across appointment.meeting.updated events, though it may change if SavvyCal rotates the underlying token. It always changes when the meeting is replaced (e.g. a reschedule routes the appointment to a different host on the account, producing a brand-new meeting with a new id). Treat as a credential — anyone with this URL can start the meeting as host. Valid through the appointment's end time + a 24h grace window, then returns 410 Gone. Listen for appointment.meeting.updated and appointment.meeting.replaced to keep stored copies fresh. null when the meeting is not yet created or when the conferencing provider has no distinct host start URL (e.g., Google Meet).
  • New: -- client_data on Appointment and BookingIntent now includes a fields map containing custom client field values, keyed by field slug. Values for fields flagged as sensitive are redacted unless include_sensitive is true.
  • Changed: -- The client_data input on appointment and booking intent endpoints is now exposed as named, reusable schemas: AppointmentClientDataInput (used by CreateAppointmentRequest and CreatePublicAppointmentRequest) and ClientDataInput (used by booking intent create/update requests). Shapes are unchanged; the fields description has been tightened to clarify that each key must correspond to a Client Field defined in the account — arbitrary key-value pairs are not accepted.

May 7, 2026

  • New: -- Appointment and PublicAppointment now expose individual top-level URL fields. Appointment exposes add_to_calendar_url, cancel_url, confirm_url, ics_url, join_url, and reschedule_url. PublicAppointment exposes add_to_calendar_url, cancel_url, ics_url, and reschedule_url. Each is a single canonical URL string that resolves to the account's active custom domain when configured. There is no top-level replacement for urls.add_to_google_calendar; use add_to_calendar_url instead.
  • Deprecated: -- The urls object on Appointment and PublicAppointment is deprecated in favor of the new top-level URL fields and will be removed in a future release.

April 30, 2026

March 25, 2026

  • New: -- Booking intents now include requirements and workflow fields. Requirements provides per-section completeness status for booking, info, and form submission steps. Workflow provides server-computed step routing, completability, and defunct state. See BookingIntentRequirements, BookingIntentWorkflow, and SubmissionRequirement.
  • Changed: -- The locked_fields field on BookingIntent, PublicBookingIntent, and related request schemas is now a typed enum array instead of a freeform string array.
  • Changed: -- The locked_fields enum values start_at, end_at, and time_zone have been consolidated into a single slot value on BookingIntent, PublicBookingIntent, and related request schemas.

March 23, 2026

March 21, 2026

  • New: -- Booking intents now include a submissions field for attaching form responses during the booking flow. See BookingIntent and IntentSubmissionInput.
  • New: -- The Get Client and List Clients endpoints now support an include_sensitive query parameter for controlling whether sensitive fields (name, email, phone) are included in the response.
  • New: -- Booking intents now include an errors field containing validation errors in JSON:API format. See BookingIntent and JsonError.
  • New: -- Added a JsonError schema representing a single validation error object.

March 20, 2026

March 10, 2026

  • Removed: -- The deprecated client_locale, client_reference_id, client_time_zone, and fields properties have been removed from the Appointment schema. Use client_data instead.

March 5, 2026

March 2, 2026

  • New: -- Services now include an optional internal_name field for setting an internal admin label. When set, this name is displayed in the admin UI instead of the public name. See Service.

March 1, 2026

February 27, 2026

  • New: -- PublicAppointment now includes a urls field containing client-facing action URLs for rescheduling, canceling, adding to calendar, downloading ICS files, and adding to Google Calendar.

February 26, 2026

  • New: -- Error responses now include an optional code field containing a machine-readable error code (e.g. slot_unavailable, no_available_provider). See GenericErrorResponse and JsonErrorResponse.

February 25, 2026

  • Changed: -- The from and until query parameters on the List available time slots and List public time slots endpoints are now optional. from defaults to today if not provided. Either until or limit must be provided.
  • New: -- Added a limit query parameter to the List available time slots and List public time slots endpoints as an alternative to until for controlling the number of aggregated slots returned.
  • New: -- Added webhook events for booking intents: booking_intent.created, booking_intent.updated, booking_intent.completed, and booking_intent.abandoned. See Webhooks.
  • New: -- Booking intent endpoints now accept an auto_assign_provider flag. When true, an available provider is automatically assigned for the selected time slot if no provider_id is specified. Supported on create, update, and complete operations for both authenticated and public booking intents.

February 24, 2026

  • New: Booking Intents -- Added 6 authenticated endpoints under /v1/booking_intents and 5 public endpoints under /v1/public/booking_intents for managing multi-step booking flows with time slot holding. See Booking Intents and Public Booking Intents.
  • New: Hold Policy -- Services now include a hold field within booking_policy for configuring time slot holds during the booking flow. See HoldPolicy and BookingPolicy.
  • New: Booking Intent schemas -- Added BookingIntent, PublicBookingIntent, HoldPolicy, and related request/response types.