> ## Documentation Index
> Fetch the complete documentation index at: https://docs.morf.health/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Appointment

> Event payload details and trigger documentation for Appointment data from Boulevard

<img src="https://mintcdn.com/morfhealth/EU2WCxuXGIUQcziR/images/boulevard.svg?fit=max&auto=format&n=EU2WCxuXGIUQcziR&q=85&s=3132db68030a6f6a3810249eb938cae0" alt="images/boulevard.svg" width="24" height="24" data-path="images/boulevard.svg" />

# Events

## Triggering Webhook Types

The following event types are associated with the Appointment event payload from Boulevard.

* `Boulevard Appointment Active`
* `Boulevard Appointment Arrived`
* `Boulevard Appointment Cancelled`
* `Boulevard Appointment Completed`
* `Boulevard Appointment Confirmed`
* `Boulevard Appointment Created`
* `Boulevard Appointment Rescheduled`
* `Boulevard Appointment Updated`

<RequestExample>
  ```json Example theme={null}
  {
    "appointment_datetime": "2024-03-15T10:00:00Z",
    "appointment_ends_at_datetime": "2024-03-15T11:00:00Z",
    "appointment_id": "urn:blvd:Appointment:12345",
    "appointment_location": {
      "address": {
        "city": "San Francisco",
        "country": "US",
        "line1": "1 Acacia Ave.",
        "line2": "Apt 3a.",
        "province": "Alberta",
        "state": "CA",
        "zip_code": "94117"
      },
      "external_id": "LOC001",
      "id": "urn:blvd:Location:loc123",
      "is_remote": false,
      "name": "Downtown Spa",
      "timezone": "America/New_York"
    },
    "appointment_notes": "Client requested quiet room",
    "appointment_services": [
      {
        "duration_minutes": 60,
        "end_at": "2024-03-15T11:00:00Z",
        "id": "urn:blvd:AppointmentService:abc123",
        "price_cents": 15000,
        "service": {
          "category_name": "Massage Therapy",
          "name": "Deep Tissue Massage"
        },
        "staff": {
          "email_address": "sarah.johnson@spa.com",
          "first_name": "Sarah",
          "id": "urn:blvd:Staff:staff123",
          "last_name": "Johnson",
          "phone_number": "+15551234567",
          "role_name": "Massage Therapist"
        },
        "staff_requested": true,
        "start_at": "2024-03-15T10:00:00Z"
      }
    ],
    "appointment_status": "APPOINTMENT_STATE_BOOKED",
    "calendar_links": {
      "google_calendar": "https://calendar.google.com/calendar/event?action=TEMPLATE&tmeid=abc123",
      "ics_download": "https://boulevard.com/calendar/appointment.ics",
      "microsoft_office": "https://outlook.live.com/calendar/0/deeplink/compose?subject=Appointment",
      "microsoft_outlook": "https://outlook.office.com/calendar/0/deeplink/compose?subject=Appointment",
      "yahoo_calendar": "https://calendar.yahoo.com/?v=60&view=d&type=20&title=Appointment"
    },
    "client": {
      "email_address": "jane.smith@email.com",
      "first_name": "Jane",
      "id": "urn:blvd:Client:client123",
      "last_name": "Smith",
      "phone_number": "+15551234567"
    },
    "client_message": "Looking forward to my appointment!",
    "created_at": "2024-03-01T09:00:00Z",
    "duration_minutes": 60,
    "is_grouped_appointment": false,
    "is_recurring": false,
    "is_remote": false,
    "manage_url": "https://book.boulevard.com/manage/abc123",
    "order_id": "urn:blvd:Order:67890"
  }
  ```
</RequestExample>

<ResponseExample>
  ```json Description theme={null}
  {
    "appointment_datetime": "Start time for the appointment.",
    "appointment_ends_at_datetime": "End time for the appointment.",
    "appointment_id": "Unique identifier for the appointment in the Boulevard system.",
    "appointment_location": {
      "address": {
        "city": "City of the Address",
        "country": "Country for the Address.",
        "line1": "Line 1 of the Address",
        "line2": "Line 2 of the Address",
        "province": "Province of the Address.",
        "state": "State of the Address.",
        "zip_code": "Zip (postal) code for the Address."
      },
      "external_id": "External identifier for the location.",
      "id": "Unique identifier for the location.",
      "is_remote": "Indicates that the location is a remote location, and that appointments for this location are carried out remotely.",
      "name": "Name of the location.",
      "timezone": "Timezone associated with the location."
    },
    "appointment_notes": "Internal notes on the appointment.",
    "appointment_services": {
      "duration_minutes": "Duration for the service in minutes (including options).",
      "end_at": "The ISO time at which the appointment service is completely finished.",
      "id": "Unique identifier for the appointment service.",
      "price_cents": "Price of the service in cents, before any discounts or taxes are applied (including options).",
      "service": {
        "category_name": "Name of the Service Category",
        "name": "Name of the service."
      },
      "staff": {
        "email_address": "Email address of the staff member.",
        "first_name": "First name of the staff member.",
        "id": "Unique identifier for the staff member.",
        "last_name": "Last name of the staff member.",
        "phone_number": "Mobile phone number of the staff member.",
        "role_name": "Name of the staff member's role."
      },
      "staff_requested": "A boolean indicating whether the staff was specifically requested by the client.",
      "start_at": "The ISO time at which the appointment service begins."
    },
    "appointment_status": "The state of the appointment.",
    "calendar_links": {
      "google_calendar": "A deep link to add the appointment directly to Google Calendar.",
      "ics_download": "A downloadable ICS file to use for native calendar applications.",
      "microsoft_office": "A deep link to add the appointment directly to Microsoft Office 365.",
      "microsoft_outlook": "A deep link to add the appointment directly to Microsoft Outlook Online.",
      "yahoo_calendar": "A deep link to add the appointment directly to Yahoo Calendar."
    },
    "client": {
      "email_address": "Client's email address.",
      "first_name": "Client's first name.",
      "id": "Unique identifier for the client in the Boulevard system.",
      "last_name": "Client's last name.",
      "phone_number": "Client's mobile phone number."
    },
    "client_message": "Message provided by the client.",
    "created_at": "When the appointment was created (in Etc/UTC).",
    "duration_minutes": "The duration of the appointment in minutes.",
    "is_grouped_appointment": "Indicates whether the appointment is part of a group appointment.",
    "is_recurring": "Indicates if the appointment belongs to a recurring series.",
    "is_remote": "Indicates that the appointment is due to be carried out remotely.",
    "manage_url": "The URL at which a client can manage their own booking.",
    "order_id": "The id of the order that the appointment was checked out with."
  }
  ```
</ResponseExample>

### Payload Field Details

<ResponseField name="Appointment" type="Event Payload">
  <Expandable title="fields" defaultOpen="true">
    <ResponseField name="appointment_id" type="string" required>
      `ID` Unique identifier for the appointment in the Boulevard system.

      ```json CEL theme={null}
      appointment_id
      ```

      ```json Example theme={null}
      "urn:blvd:Appointment:12345"
      ```
    </ResponseField>

    <ResponseField name="appointment_notes" type="string">
      `HI` Internal notes on the appointment.

      ```json CEL theme={null}
      appointment_notes
      ```

      ```json Example theme={null}
      "Client requested quiet room"
      ```
    </ResponseField>

    <ResponseField name="appointment_datetime" type="timing.v1.Timestamp" required>
      Start time for the appointment.

      ```json CEL theme={null}
      appointment_datetime
      ```

      ```json Example theme={null}
      "2024-03-15T10:00:00Z"
      ```
    </ResponseField>

    <ResponseField name="appointment_ends_at_datetime" type="timing.v1.Timestamp" required>
      End time for the appointment.

      ```json CEL theme={null}
      appointment_ends_at_datetime
      ```

      ```json Example theme={null}
      "2024-03-15T11:00:00Z"
      ```
    </ResponseField>

    <ResponseField name="duration_minutes" type="uint64" required>
      The duration of the appointment in minutes.

      ```json CEL theme={null}
      duration_minutes
      ```

      ```json Example theme={null}
      60
      ```
    </ResponseField>

    <ResponseField name="appointment_status" type="boulevard.v1.AppointmentState" required>
      The state of the appointment.

      ```json CEL theme={null}
      appointment_status
      ```

      ```json Example theme={null}
      boulevard.v1.AppointmentState.APPOINTMENT_STATE_ACTIVE
      boulevard.v1.AppointmentState.APPOINTMENT_STATE_ARRIVED
      boulevard.v1.AppointmentState.APPOINTMENT_STATE_BOOKED
      boulevard.v1.AppointmentState.APPOINTMENT_STATE_CANCELLED
      boulevard.v1.AppointmentState.APPOINTMENT_STATE_CONFIRMED
      boulevard.v1.AppointmentState.APPOINTMENT_STATE_FINAL
      ```
    </ResponseField>

    <ResponseField name="client_message" type="string">
      `PII` Message provided by the client.

      ```json CEL theme={null}
      client_message
      ```

      ```json Example theme={null}
      "Looking forward to my appointment!"
      ```
    </ResponseField>

    <ResponseField name="client" type="object">
      The client of the appointment.

      ```json CEL theme={null}
      client
      ```

      ```json Example theme={null}
      {
      "email_address": "jane.smith@email.com",
      "first_name": "Jane",
      "id": "urn:blvd:Client:client123",
      "last_name": "Smith",
      "phone_number": "+15551234567"
      }
      ```
    </ResponseField>

    <ResponseField name="client.id" type="string">
      `ID` Unique identifier for the client in the Boulevard system.

      ```json CEL theme={null}
      client.id
      ```

      ```json Example theme={null}
      "urn:blvd:Client:client123"
      ```
    </ResponseField>

    <ResponseField name="client.first_name" type="string">
      `PII` Client's first name.

      ```json CEL theme={null}
      client.first_name
      ```

      ```json Example theme={null}
      "Jane"
      ```
    </ResponseField>

    <ResponseField name="client.last_name" type="string">
      `PII` Client's last name.

      ```json CEL theme={null}
      client.last_name
      ```

      ```json Example theme={null}
      "Smith"
      ```
    </ResponseField>

    <ResponseField name="client.email_address" type="string">
      `PII` Client's email address.

      ```json CEL theme={null}
      client.email_address
      ```

      ```json Example theme={null}
      "jane.smith@email.com"
      ```
    </ResponseField>

    <ResponseField name="client.phone_number" type="string">
      `PII` Client's mobile phone number.

      ```json CEL theme={null}
      client.phone_number
      ```

      ```json Example theme={null}
      "+15551234567"
      ```
    </ResponseField>

    <ResponseField name="appointment_services" type="[]object" required>
      A collection of appointment services.

      ```json CEL theme={null}
      appointment_services
      ```

      ```json Example theme={null}
      [
      {
      "duration_minutes": 60,
      "end_at": "2024-03-15T11:00:00Z",
      "id": "urn:blvd:AppointmentService:abc123",
      "price_cents": 15000,
      "service": {
      "category_name": "Massage Therapy",
      "name": "Deep Tissue Massage"
      },
      "staff": {
      "email_address": "sarah.johnson@spa.com",
      "first_name": "Sarah",
      "id": "urn:blvd:Staff:staff123",
      "last_name": "Johnson",
      "phone_number": "+15551234567",
      "role_name": "Massage Therapist"
      },
      "staff_requested": true,
      "start_at": "2024-03-15T10:00:00Z"
      }
      ]
      ```
    </ResponseField>

    <ResponseField name="appointment_services.map(x, x.id)" type="[]string" required>
      `ID` Mapped array of: Unique identifier for the appointment service.

      ```json CEL theme={null}
      appointment_services.map(x, x.id)
      ```

      ```json Example theme={null}
      [
      "urn:blvd:AppointmentService:abc123"
      ]
      ```
    </ResponseField>

    <ResponseField name="appointment_services.map(x, x.start_at)" type="[]timing.v1.Timestamp" required>
      Mapped array of: The ISO time at which the appointment service begins.

      ```json CEL theme={null}
      appointment_services.map(x, x.start_at)
      ```

      ```json Example theme={null}
      [
      "2024-03-15T10:00:00Z"
      ]
      ```
    </ResponseField>

    <ResponseField name="appointment_services.map(x, x.end_at)" type="[]timing.v1.Timestamp" required>
      Mapped array of: The ISO time at which the appointment service is completely finished.

      ```json CEL theme={null}
      appointment_services.map(x, x.end_at)
      ```

      ```json Example theme={null}
      [
      "2024-03-15T11:00:00Z"
      ]
      ```
    </ResponseField>

    <ResponseField name="appointment_services.map(x, x.price_cents)" type="[]int64" required>
      Mapped array of: Price of the service in cents, before any discounts or taxes are applied (including options).

      ```json CEL theme={null}
      appointment_services.map(x, x.price_cents)
      ```

      ```json Example theme={null}
      [
      15000
      ]
      ```
    </ResponseField>

    <ResponseField name="appointment_services.map(x, x.duration_minutes)" type="[]uint64" required>
      Mapped array of: Duration for the service in minutes (including options).

      ```json CEL theme={null}
      appointment_services.map(x, x.duration_minutes)
      ```

      ```json Example theme={null}
      [
      60
      ]
      ```
    </ResponseField>

    <ResponseField name="appointment_services.map(x, x.service)" type="[]bool" required>
      Mapped array of: The service.

      ```json CEL theme={null}
      appointment_services.map(x, x.service)
      ```

      ```json Example theme={null}
      [
      {
      "category_name": "Massage Therapy",
      "name": "Deep Tissue Massage"
      }
      ]
      ```
    </ResponseField>

    <ResponseField name="appointment_services.map(x, x.staff_requested)" type="[]bool" required>
      Mapped array of: A boolean indicating whether the staff was specifically requested by the client.

      ```json CEL theme={null}
      appointment_services.map(x, x.staff_requested)
      ```

      ```json Example theme={null}
      [
      true
      ]
      ```
    </ResponseField>

    <ResponseField name="appointment_services.map(x, x.staff)" type="[]bool" required>
      Mapped array of: The staff performing this service.

      ```json CEL theme={null}
      appointment_services.map(x, x.staff)
      ```

      ```json Example theme={null}
      [
      {
      "email_address": "sarah.johnson@spa.com",
      "first_name": "Sarah",
      "id": "urn:blvd:Staff:staff123",
      "last_name": "Johnson",
      "phone_number": "+15551234567",
      "role_name": "Massage Therapist"
      }
      ]
      ```
    </ResponseField>

    <ResponseField name="is_grouped_appointment" type="bool" required>
      Indicates whether the appointment is part of a group appointment.

      ```json CEL theme={null}
      is_grouped_appointment
      ```

      ```json Example theme={null}
      false
      ```
    </ResponseField>

    <ResponseField name="is_recurring" type="bool" required>
      Indicates if the appointment belongs to a recurring series.

      ```json CEL theme={null}
      is_recurring
      ```

      ```json Example theme={null}
      false
      ```
    </ResponseField>

    <ResponseField name="is_remote" type="bool" required>
      Indicates that the appointment is due to be carried out remotely.

      ```json CEL theme={null}
      is_remote
      ```

      ```json Example theme={null}
      false
      ```
    </ResponseField>

    <ResponseField name="appointment_location" type="object">
      The Location where this appointment was booked.

      ```json CEL theme={null}
      appointment_location
      ```

      ```json Example theme={null}
      {
      "address": {
      "city": "San Francisco",
      "country": "US",
      "line1": "1 Acacia Ave.",
      "line2": "Apt 3a.",
      "province": "Alberta",
      "state": "CA",
      "zip_code": "94117"
      },
      "external_id": "LOC001",
      "id": "urn:blvd:Location:loc123",
      "is_remote": false,
      "name": "Downtown Spa",
      "timezone": "America/New_York"
      }
      ```
    </ResponseField>

    <ResponseField name="appointment_location.id" type="string">
      `ID` Unique identifier for the location.

      ```json CEL theme={null}
      appointment_location.id
      ```

      ```json Example theme={null}
      "urn:blvd:Location:loc123"
      ```
    </ResponseField>

    <ResponseField name="appointment_location.name" type="string">
      Name of the location.

      ```json CEL theme={null}
      appointment_location.name
      ```

      ```json Example theme={null}
      "Downtown Spa"
      ```
    </ResponseField>

    <ResponseField name="appointment_location.external_id" type="string">
      `ID` External identifier for the location.

      ```json CEL theme={null}
      appointment_location.external_id
      ```

      ```json Example theme={null}
      "LOC001"
      ```
    </ResponseField>

    <ResponseField name="appointment_location.timezone" type="string">
      Timezone associated with the location.

      ```json CEL theme={null}
      appointment_location.timezone
      ```

      ```json Example theme={null}
      "America/New_York"
      ```
    </ResponseField>

    <ResponseField name="appointment_location.address" type="object">
      `PII` Address of the location.

      ```json CEL theme={null}
      appointment_location.address
      ```

      ```json Example theme={null}
      {
      "city": "San Francisco",
      "country": "US",
      "line1": "1 Acacia Ave.",
      "line2": "Apt 3a.",
      "province": "Alberta",
      "state": "CA",
      "zip_code": "94117"
      }
      ```
    </ResponseField>

    <ResponseField name="appointment_location.address.line1" type="string">
      `PII` Line 1 of the Address

      ```json CEL theme={null}
      appointment_location.address.line1
      ```

      ```json Example theme={null}
      "1 Acacia Ave."
      ```
    </ResponseField>

    <ResponseField name="appointment_location.address.line2" type="string">
      `PII` Line 2 of the Address

      ```json CEL theme={null}
      appointment_location.address.line2
      ```

      ```json Example theme={null}
      "Apt 3a."
      ```
    </ResponseField>

    <ResponseField name="appointment_location.address.city" type="string">
      City of the Address

      ```json CEL theme={null}
      appointment_location.address.city
      ```

      ```json Example theme={null}
      "San Francisco"
      ```
    </ResponseField>

    <ResponseField name="appointment_location.address.province" type="string">
      Province of the Address.

      ```json CEL theme={null}
      appointment_location.address.province
      ```

      ```json Example theme={null}
      "Alberta"
      ```
    </ResponseField>

    <ResponseField name="appointment_location.address.state" type="string">
      State of the Address.

      ```json CEL theme={null}
      appointment_location.address.state
      ```

      ```json Example theme={null}
      "CA"
      ```
    </ResponseField>

    <ResponseField name="appointment_location.address.zip_code" type="string">
      Zip (postal) code for the Address.

      ```json CEL theme={null}
      appointment_location.address.zip_code
      ```

      ```json Example theme={null}
      "94117"
      ```
    </ResponseField>

    <ResponseField name="appointment_location.address.country" type="string">
      Country for the Address.

      ```json CEL theme={null}
      appointment_location.address.country
      ```

      ```json Example theme={null}
      "US"
      ```
    </ResponseField>

    <ResponseField name="appointment_location.is_remote" type="bool">
      Indicates that the location is a remote location, and that appointments for this location are carried out remotely.

      ```json CEL theme={null}
      appointment_location.is_remote
      ```

      ```json Example theme={null}
      false
      ```
    </ResponseField>

    <ResponseField name="manage_url" type="string" required>
      The URL at which a client can manage their own booking.

      ```json CEL theme={null}
      manage_url
      ```

      ```json Example theme={null}
      "https://book.boulevard.com/manage/abc123"
      ```
    </ResponseField>

    <ResponseField name="calendar_links" type="object">
      Links to allow direct addition of the appointment to different calendar platforms.

      ```json CEL theme={null}
      calendar_links
      ```

      ```json Example theme={null}
      {
      "google_calendar": "https://calendar.google.com/calendar/event?action=TEMPLATE&tmeid=abc123",
      "ics_download": "https://boulevard.com/calendar/appointment.ics",
      "microsoft_office": "https://outlook.live.com/calendar/0/deeplink/compose?subject=Appointment",
      "microsoft_outlook": "https://outlook.office.com/calendar/0/deeplink/compose?subject=Appointment",
      "yahoo_calendar": "https://calendar.yahoo.com/?v=60&view=d&type=20&title=Appointment"
      }
      ```
    </ResponseField>

    <ResponseField name="calendar_links.google_calendar" type="string">
      A deep link to add the appointment directly to Google Calendar.

      ```json CEL theme={null}
      calendar_links.google_calendar
      ```

      ```json Example theme={null}
      "https://calendar.google.com/calendar/event?action=TEMPLATE&tmeid=abc123"
      ```
    </ResponseField>

    <ResponseField name="calendar_links.ics_download" type="string">
      A downloadable ICS file to use for native calendar applications.

      ```json CEL theme={null}
      calendar_links.ics_download
      ```

      ```json Example theme={null}
      "https://boulevard.com/calendar/appointment.ics"
      ```
    </ResponseField>

    <ResponseField name="calendar_links.microsoft_office" type="string">
      A deep link to add the appointment directly to Microsoft Office 365.

      ```json CEL theme={null}
      calendar_links.microsoft_office
      ```

      ```json Example theme={null}
      "https://outlook.live.com/calendar/0/deeplink/compose?subject=Appointment"
      ```
    </ResponseField>

    <ResponseField name="calendar_links.microsoft_outlook" type="string">
      A deep link to add the appointment directly to Microsoft Outlook Online.

      ```json CEL theme={null}
      calendar_links.microsoft_outlook
      ```

      ```json Example theme={null}
      "https://outlook.office.com/calendar/0/deeplink/compose?subject=Appointment"
      ```
    </ResponseField>

    <ResponseField name="calendar_links.yahoo_calendar" type="string">
      A deep link to add the appointment directly to Yahoo Calendar.

      ```json CEL theme={null}
      calendar_links.yahoo_calendar
      ```

      ```json Example theme={null}
      "https://calendar.yahoo.com/?v=60&view=d&type=20&title=Appointment"
      ```
    </ResponseField>

    <ResponseField name="order_id" type="string">
      `ID` The id of the order that the appointment was checked out with.

      ```json CEL theme={null}
      order_id
      ```

      ```json Example theme={null}
      "urn:blvd:Order:67890"
      ```
    </ResponseField>

    <ResponseField name="created_at" type="timing.v1.Timestamp" required>
      When the appointment was created (in Etc/UTC).

      ```json CEL theme={null}
      created_at
      ```

      ```json Example theme={null}
      "2024-03-01T09:00:00Z"
      ```
    </ResponseField>
  </Expandable>
</ResponseField>
