Skip to content
Preview. The endpoints on this page are illustrative and are likely to change as they move toward general availability. Documentation is published in advance so you can start shaping your integration; treat request and response details as subject to revision.

Meeting object

The Meeting is the canonical representation of a booked meeting across the entire Cirrus Insight platform. It's returned by POST /api/v1alpha1/scheduled-meetings, GET /api/v1alpha1/scheduled-meetings/{id}, and PATCH /api/v1alpha1/scheduled-meetings/{id}, and it's the shape of the meeting payload delivered on v2 webhook subscriptions.

The shape has two tiers:

  • Ubiquitous root fields — id, host, attendee, times, title, location, calendar reference, status. Any Cirrus-owned meeting has these regardless of how it was booked or what other features touched it.
  • Feature sub-objects — one per Cirrus product area (smartScheduling, personalScheduling, teamScheduling, meetingAi, and future feature areas). Fields that only exist because a specific feature was involved live under that feature's sub-object. Always present in the payload, null when the feature did not apply.

Multiple sub-objects can be populated simultaneously — a Smart Scheduler booking that later gets recorded by Meeting AI populates both smartScheduling and meetingAi.

Difference from v0.1 (legacy) webhook payloads

The v2 canonical Meeting is the shape on new webhook subscriptions and on all Platform API responses. Subscriptions created before v1alpha1 rolled out continue to emit the legacy nested meetingmodel shape indefinitely. To move an existing integration to v2, create a new subscription — old subscriptions are never forced to migrate.

The Meeting schema

json
{
  "id": "mtg_...",
  "orgId": "org_...",
  "host": {
    "userId": "usr_...",
    "email": "host@example.com",
    "firstName": "Alex",
    "lastName": "Rivera",
    "displayName": "Alex Rivera"
  },
  "attendee": {
    "email": "guest@example.com",
    "firstName": "Sample",
    "lastName": "Guest",
    "phone": "+14155551234",
    "timeZone": "America/New_York"
  },
  "additionalAttendees": ["colleague@example.com"],
  "title": "Cirrus Insight Demo",
  "startTime": "2026-06-16T17:00:00Z",
  "endTime":   "2026-06-16T17:30:00Z",
  "timeZone":  "America/Los_Angeles",
  "location": {
    "type": "video",
    "provider": "zoom",
    "joinUrl": "https://us02web.zoom.us/j/...",
    "address": null
  },
  "conferencing": {
    "provider": "zoom",
    "providerMeetingId": "1234567890"
  },
  "calendarEventId": "google-event-uid",
  "status": "scheduled",
  "createdAt": "2026-06-15T14:23:01Z",
  "updatedAt": "2026-06-15T14:23:01Z",

  "smartScheduling": {
    "scheduleId": "sched_...",
    "formValues": [
      { "key": "region", "answer": "NA-East" }
    ],
    "surveyResponses": [
      { "question": "What brings you here today?", "answer": "Pipeline visibility" }
    ],
    "rescheduleUrl": "https://...",
    "cancelUrl": "https://...",
    "campaign": {
      "id": null, "source": null, "medium": null,
      "campaign": null, "term": null, "content": null
    },
    "preview": false
  },
  "personalScheduling": null,
  "teamScheduling": null,
  "meetingAi": null
}

Ubiquitous root fields


id string

The meeting identifier, prefixed mtg_. Stable across reschedule and across all Cirrus surfaces — webhooks emit the same id and the Platform API returns the same id.


orgId string

Your organization's identifier, prefixed org_. Present on every meeting so a partner receiving webhooks for multiple orgs can filter without a separate lookup.


host object

The Cirrus Insight user who owns the meeting (the one whose calendar holds the event). On a host-swap reschedule, this reflects the new host.

AttributeTypeDescription
userIdstringHost identifier, prefixed usr_.
emailstringHost's email address.
firstNamestringHost's given name.
lastNamestringHost's family name.
displayNamestringConcatenated first + last, falling back to email when no name is stored. Safe to surface to end-users.

attendee object

The person the meeting was booked for. Cannot be changed by reschedule — to change the attendee, cancel and rebook.

AttributeTypeDescription
emailstringAttendee's email address.
firstNamestringAttendee's given name.
lastNamestringAttendee's family name.
phonestring(optional) E.164 phone number when supplied on booking. null otherwise.
timeZonestring(optional) IANA time zone the attendee booked from.

additionalAttendees list

Additional email addresses invited to the meeting (up to 50). Empty array when none were specified. Not a full contact object — just email strings; if the attendee was a real Cirrus contact, it's still represented as their email address only.


title string

Calendar event subject line.


startTime, endTime string

Meeting start and end, ISO 8601 in UTC.


timeZone string

IANA time zone the schedule is anchored to on the server. Response timestamps are always in UTC — this field is informational and lets your UI render the "office hours" context.


location object

(optional) Where the meeting will be held. null when the schedule has no configured location.

AttributeTypeDescription
typestringOne of video, phone, in-person, custom.
providerstringPresent when type is video. One of zoom, microsoft_teams, google_meet.
joinUrlstringPresent when type is video or when type is custom and the schedule's location is a URL.
addressstringPresent when type is in-person or phone, or when type is custom and the schedule's location is free text.

The type=custom case exists specifically so an admin-configured "call this phone number, pin 1234" location isn't misclassified as a broken join URL.


conferencing object

(optional) Provider-specific conferencing identifiers, when the meeting uses one. null when the meeting has no conferencing.

AttributeTypeDescription
providerstringzoom | microsoft_teams | google_meet.
providerMeetingIdstringThe provider's own meeting id (e.g., a Zoom meeting number). Useful for cross-referencing with provider-side APIs.

calendarEventId string

The provider's identifier for the underlying calendar event (Google Calendar event ID, Outlook iCalUId, etc.). Useful for cross-referencing with calendar-API integrations. null when no calendar sync has occurred yet.


status string

Current meeting state. Derived from the clock and cancellation flag — no background sweeper runs, so a cached value may go stale without a corresponding write.

Emitted values in v1alpha1:

  • scheduled — meeting is upcoming and on the host's calendar
  • completed — meeting's end time has passed
  • canceled — the meeting was canceled (via DELETE or by the host externally); overrides both scheduled and completed

The wire enum reserves two additional values (rescheduled, no-show) that are not emitted today — they'd require persisted state that doesn't exist yet. They're documented in the enum so adding them later isn't a breaking change for a caller that already switches on the field.


createdAt, updatedAt string

ISO 8601 UTC. createdAt is the initial booking timestamp and does not change on reschedule; updatedAt bumps on every mutation.


Feature sub-objects

Each sub-object is always present in the payload, null when the feature did not apply to this meeting. Presence (non-null value) is the signal to consumers that this feature produced or enriched this meeting:

Sub-objects evolve independently. Adding a field to meetingAi cannot affect Smart Scheduling consumers; evolving smartScheduling.formValues cannot affect team-scheduling consumers.


smartScheduling object

Populated when the meeting was booked through a Smart Scheduler. null otherwise.

AttributeTypeDescription
scheduleIdstringThe Smart Schedule this meeting was booked from, prefixed sched_. See SmartSchedule.
formValueslistAnswers to the host-matching form. Each entry is { key, answer }key is the field's stable identifier from the schedule's matchingForm.fields[].key; answer is the submitted value (scalar or array for multi-select).
surveyResponseslistAnswers to the informational survey questions configured on the schedule. Each entry is { question, answer }question is the question text (surveys don't yet have stable ids in v1alpha1).
rescheduleUrlstringA self-service link the attendee can use to reschedule via the Cirrus-hosted UI. Suitable for inclusion in your own confirmation messaging.
cancelUrlstringA self-service link the attendee can use to cancel via the Cirrus-hosted UI.
campaignobjectUTM tracking parameters captured from the scheduling page's query string when the attendee arrived. See UTM shape below.
previewbooleantrue when the booking came from a preview-mode slot token. Preview bookings skip webhook delivery and CRM sync.

personalScheduling object

Populated when the meeting was booked through a personal scheduling page. null otherwise. Same fields as smartScheduling except no formValues and no preview:

  • Personal scheduling pages do not run a matching form.
  • Preview mode is not exposed to this flow today.
AttributeType
scheduleIdpsched_...
surveyResponseslist
rescheduleUrlstring
cancelUrlstring
campaignobject

teamScheduling object

Populated when the meeting was booked through a team scheduling page. null otherwise. Same fields as personalScheduling, plus:

AttributeTypeDescription
teamMemberslistParticipating Cirrus users. Each entry uses the same shape as hostuserId, email, firstName, lastName, displayName.

meetingAi object

Populated when Meeting AI recorded or analysed the meeting. null otherwise.

The schema for this sub-object is owned by the Meeting AI team and is not yet defined in v1alpha1 — all Platform API responses and webhook payloads emit meetingAi: null today. When Meeting AI ships its schema, the sub-object will begin populating on relevant meetings; consumers see the new fields without a payload-version bump because it's an additive change to a nullable field.


javascript
if (meeting.smartScheduling) {
  // this meeting was booked through Smart Scheduler
}
if (meeting.meetingAi) {
  // Meeting AI recorded or analysed it
}

Campaign (UTM tracking)

The campaign object appears inside smartScheduling, personalScheduling, and teamScheduling. Same shape in all three:

AttributeTypeDescription
idstringThe utm_id parameter, if present.
sourcestringThe utm_source parameter.
mediumstringThe utm_medium parameter.
campaignstringThe utm_campaign parameter.
termstringThe utm_term parameter (paid-search keywords).
contentstringThe utm_content parameter.

Each field is null when the corresponding query-string parameter was absent when the attendee reached the scheduling page. The whole object is null if no UTM parameters were captured.


Meetings don't exist in isolation. Every meeting references — or is produced by — one of the following supporting models. Each is documented on its own page:

  • Smart Schedule — the schedule configuration that produced a Smart Scheduler booking. Referenced by smartScheduling.scheduleId. Includes the matching-form schema, survey-question schema, booking window, and assignee list.
  • Slot — the opaque signed token returned by /availability and consumed by /scheduled-meetings to book. Slots don't appear on the Meeting object directly; they're the currency of the booking transaction.
  • Forms & Surveys — the field-level shape of the matching form (whose answers appear in smartScheduling.formValues) and the survey-question set (whose responses appear in smartScheduling.surveyResponses and its personal/team counterparts).

Raleigh, NC — a Cirruspath, Inc. company