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,nullwhen 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
{
"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.
| Attribute | Type | Description |
|---|---|---|
userId | string | Host identifier, prefixed usr_. |
email | string | Host's email address. |
firstName | string | Host's given name. |
lastName | string | Host's family name. |
displayName | string | Concatenated 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.
| Attribute | Type | Description |
|---|---|---|
email | string | Attendee's email address. |
firstName | string | Attendee's given name. |
lastName | string | Attendee's family name. |
phone | string | (optional) E.164 phone number when supplied on booking. null otherwise. |
timeZone | string | (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.
| Attribute | Type | Description |
|---|---|---|
type | string | One of video, phone, in-person, custom. |
provider | string | Present when type is video. One of zoom, microsoft_teams, google_meet. |
joinUrl | string | Present when type is video or when type is custom and the schedule's location is a URL. |
address | string | Present 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.
| Attribute | Type | Description |
|---|---|---|
provider | string | zoom | microsoft_teams | google_meet. |
providerMeetingId | string | The 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 calendarcompleted— meeting's end time has passedcanceled— the meeting was canceled (viaDELETEor by the host externally); overrides bothscheduledandcompleted
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.
| Attribute | Type | Description |
|---|---|---|
scheduleId | string | The Smart Schedule this meeting was booked from, prefixed sched_. See SmartSchedule. |
formValues | list | Answers 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). |
surveyResponses | list | Answers 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). |
rescheduleUrl | string | A self-service link the attendee can use to reschedule via the Cirrus-hosted UI. Suitable for inclusion in your own confirmation messaging. |
cancelUrl | string | A self-service link the attendee can use to cancel via the Cirrus-hosted UI. |
campaign | object | UTM tracking parameters captured from the scheduling page's query string when the attendee arrived. See UTM shape below. |
preview | boolean | true 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.
| Attribute | Type |
|---|---|
scheduleId | psched_... |
surveyResponses | list |
rescheduleUrl | string |
cancelUrl | string |
campaign | object |
teamScheduling object
Populated when the meeting was booked through a team scheduling page. null otherwise. Same fields as personalScheduling, plus:
| Attribute | Type | Description |
|---|---|---|
teamMembers | list | Participating Cirrus users. Each entry uses the same shape as host — userId, 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.
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:
| Attribute | Type | Description |
|---|---|---|
id | string | The utm_id parameter, if present. |
source | string | The utm_source parameter. |
medium | string | The utm_medium parameter. |
campaign | string | The utm_campaign parameter. |
term | string | The utm_term parameter (paid-search keywords). |
content | string | The 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.
Related models
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
/availabilityand consumed by/scheduled-meetingsto 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 insmartScheduling.surveyResponsesand its personal/team counterparts).