Skip to content

listAppointments

This interface retrieves upcoming appointments from the connected CRM so they can be displayed within App Connect's appointment panel. It is called whenever a user opens or refreshes the appointments view.

Input parameters

Parameter Description
user An object describing the Chrome extension user associated with the action that triggered this interface.
authHeader The HTTP Authorization header to be transmitted with the API request to the target CRM.
range (Optional) An object with startTime and endTime ISO-8601 strings defining the window of appointments to fetch.
mineOnly (Optional) Boolean. When true, return only appointments owned by the current user.

Return value(s)

An object with the following property:

Parameter Description
appointments An array of appointment objects.

Appointment object

Property Type Description
id string The unique identifier of the appointment in the CRM.
thirdPartyAppointmentId string Same as id — the CRM's native ID for the appointment.
title string The appointment title or subject.
description string Notes or body text for the appointment.
startTimeUtc string ISO-8601 UTC timestamp of the appointment start time.
durationMinutes number Duration of the appointment in minutes.
status string Current status. Typically "scheduled", "cancelled", or "confirmed".
contactId string ID of the primary contact associated with the appointment (empty string if none).
attendees array Array of attendee objects, each with id, name, and type.

Example

return {
  appointments: [
    {
      id: "12345",
      thirdPartyAppointmentId: "12345",
      title: "Intake call with Jane Smith",
      description: "Initial consultation",
      startTimeUtc: "2024-03-15T14:00:00.000Z",
      durationMinutes: 60,
      status: "scheduled",
      contactId: "67890",
      attendees: [
        { id: 67890, name: "Jane Smith", type: "Contact" }
      ]
    }
  ]
};

Reference

    const externalPropertyPayload = existingProp?.id != null
        ? [{ id: existingProp.id, name, value: `${value}` }]
        : [{ name, value: `${value}` }];

    await axios.patch(
        `https://${user.hostname}/api/v4/calendar_entries/${appointmentId}.json`,
        { data: { external_properties: externalPropertyPayload } },
        { headers: { 'Authorization': authHeader } }
    );
}

async function listAppointments({ user, authHeader, range, mineOnly }) {
    const listRes = await axios.get(
        `https://${user.hostname}/api/v4/calendar_entries.json`,
        {
            headers: { 'Authorization': authHeader },
            params: {
                fields: 'id,summary,start_at,end_at,description,attendees{id,name,type}'
            }
        }
    );

    const entries = listRes?.data?.data ?? [];

    const appointments = entries.map(e => {
        const startUtc = e?.start_at ? moment.parseZone(e.start_at).utc() : null;
        const endUtc = e?.end_at ? moment.parseZone(e.end_at).utc() : null;
        const durationMinutes = (startUtc && endUtc)
            ? Math.max(0, Math.round(endUtc.diff(startUtc, 'minutes', true)))
            : 0;

        const id = e?.id != null ? `${e.id}` : null;
        const attendees = (e?.attendees ?? [])
            .map(a => (a?.id != null ? { id: a?.id, name: a?.name, type: a?.type } : null))
            .filter(Boolean);
        return {
            thirdPartyAppointmentId: id,
            id,