Meetings API

External integration

The Meetings API manages scheduled meetings and calendar integration on the Altafid platform. It covers meeting creation and lifecycle, participant invitations and RSVP, staff availability checks, and two-way synchronisation with Google Calendar and Outlook.

Base URL: https://api.altafid.dev.altafid.net
Standard auth headers are required on all endpoints except public webhooks and OAuth callbacks — see Authentication and Global Headers.
Access model: a meeting is owned by a host and read/write actions are scoped to participants. The response fields canEdit, canCancel, canResend, and canRemoveFromCalendar tell the caller which actions the current user is permitted to perform.

Authentication and headers

Authenticated endpoints expect the standard gateway headers. Public RSVP links, OAuth callbacks, and provider webhooks are unauthenticated.

HeaderRequiredNotes
Authorization: Bearer <token>requiredAccess token.
x-tenant-uuidrequiredTenant context.
x-user-idrequiredCurrent user UUID.
x-user-emailrequiredCurrent user email.
x-user-typerequiredTENANT_STAFF, PARTNER_STAFF, or CLIENT.
x-tenant-codeoptionalTenant code.
x-partner-uuidoptionalPartner context for partner staff.

Meeting lifecycle

A typical meeting moves through availability checking, creation, invitation delivery, and external calendar sync. Participants then RSVP, and the host can update, resend, or cancel.

1
Check availability
POST /api/v1/availability/check
Find a free slot for staff
2
Create meeting
POST /api/v1/meetings
Returns meetingUuid
3
Invite & sync
Invitations sent;
monitor externalSyncStatus
4
RSVP
PUT .../rsvp
Participants accept or decline
5
Manage
Update, resend,
or cancel
External calendar is optional. If the host has connected Google or Outlook (see Calendar connection), meetings sync to that calendar and externalSyncStatus tracks progress. Otherwise the meeting is internal-only and externalSyncStatus is NOT_APPLICABLE.

Meeting endpoints

EndpointPurpose
POST /api/v1/meetingsCreate a meeting. Returns the full meeting with meetingUuid.
GET /api/v1/meetingsList meetings on the current user's calendar.
POST /api/v2/meetingsAdvanced filtered list (see List and filter).
GET /api/v1/meetings/{meetingUuid}Get a single meeting with full detail and participants.
PUT /api/v1/meetings/{meetingUuid}Update a meeting (partial — send only changed fields).
POST /api/v1/meetings/{meetingUuid}/cancelCancel a meeting; status moves to CANCELED.
POST /api/v1/meetings/{meetingUuid}/resendResend invitations to all participants.
POST /api/v1/meetings/{meetingUuid}/participants/{participantUuid}/resendResend the invitation to a single participant.
POST /api/v1/meetings/{meetingUuid}/syncRetry a failed external calendar sync.
DELETE /api/v1/meetings/{meetingUuid}/calendar-visibilityHide a canceled meeting from the calendar. Returns 204 No Content.

POST/api/v1/meetings

Creates a meeting. Participants are supplied as platform contacts, platform staff, and free-form external attendees. Invitations are dispatched automatically and, if the host has a connected calendar, the meeting is queued for external sync. Returns 201 Created with a MeetingResponse.

{
  "title":            "Quarterly portfolio review",
  "startDateTime":    "2026-06-15T15:00:00",
  "endDateTime":      "2026-06-15T15:45:00",
  "timezone":         "America/Santiago",
  "allDay":           false,
  "locationType":     "ONLINE",
  "locationDetail":   "https://meet.google.com/abc-defg-hij",
  "description":      "Review Q2 performance and rebalancing plan.",
  "internalNotes":    "Bring the updated IPS draft.",
  "meetingProvider":  "GOOGLE_MEET",
  "meetingLink":      "https://meet.google.com/abc-defg-hij",
  "meetingPassword":  null,

  "contactIds":       ["C019B9D0FD0E5772F9E8ED189895D40C4"],
  "staffIds":         ["PS0199CA8F08C270B5A5B0DFD3B565B332"],
  "externalAttendees": [
    {
      "name":        "Jane Roe",
      "email":       "jane.roe@example.com",
      "language":    "ENGLISH",
      "countryCode": "+1",
      "phone":       "5551234567"
    }
  ]
}
FieldTypeRequiredNotes
titlestringoptionalMeeting title.
startDateTimedatetimerequiredLocal date-time, e.g. 2026-06-15T15:00:00.
endDateTimedatetimerequiredMust be after startDateTime.
timezonestringrequiredIANA zone, e.g. America/Santiago.
allDaybooleanoptionalMarks the meeting as all-day.
locationTypeenumrequiredONLINE | IN_PERSON.
locationDetailstringoptionalAddress or meeting URL.
descriptionstringoptionalShown to all participants.
internalNotesstringoptionalVisible to internal staff only.
meetingInformationstringoptionalAdditional free-form meeting info.
meetingLinkstringoptionalConference link.
meetingPasswordstringoptionalConference passcode.
meetingProviderstringoptionalConference provider label, e.g. GOOGLE_MEET.
contactIdsstring[]optionalContact UUIDs to invite.
staffIdsstring[]optionalStaff UUIDs to invite.
externalAttendeesobject[]optionalFree-form guests — see ExternalAttendee.
Save meetingUuid — it is required for all update, RSVP, resend, sync, and cancel calls.

List and filter

GET/api/v1/meetings returns the meetings on the current user's calendar as a MeetingListResponse.

POST/api/v2/meetings supports advanced filtering, paging, and sorting. Each filter condition names a field, an operator, and a value (or values / min / max depending on the operator).

{
  "filters": [
    { "field": "status",        "operator": "EQUALS", "value": "ACTIVE" },
    { "field": "startDateTime", "operator": "RANGE",  "min": "2026-06-01T00:00:00", "max": "2026-06-30T23:59:59" }
  ],
  "page": 0,
  "size": 20,
  "sort": ["startDateTime,asc"]
}
FieldTypeRequiredNotes
filters[].fieldstringrequiredField to filter on.
filters[].operatorenumrequiredSee FilterOperator.
filters[].value / values / min / maxvariesoptionalvalue for scalar ops, values for IN/NOT_IN, min+max for RANGE.
pageintegeroptionalZero-indexed. Minimum 0.
sizeintegeroptionalBetween 1 and 100.
sortstring[]optionalfield,direction entries.

Update and cancel

PUT/api/v1/meetings/{meetingUuid} accepts the same fields as create — all optional. Omitted fields are left unchanged. Updating a meeting that is externally synced queues a follow-up sync.

POST/api/v1/meetings/{meetingUuid}/cancel moves the meeting to CANCELED and notifies participants. Use DELETE/api/v1/meetings/{meetingUuid}/calendar-visibility to remove a canceled meeting from the calendar view (204 No Content).

Invitations and sync

EndpointPurposeResponse
POST /api/v1/meetings/{meetingUuid}/resendResend invitations to every participant.200 with per-recipient ResendInvitation results.
POST /api/v1/meetings/{meetingUuid}/participants/{participantUuid}/resendResend to a single participant.200 with one result; lastInvitationResentAt is null if skipped.
POST /api/v1/meetings/{meetingUuid}/syncRetry external calendar sync after a failure.200 with the refreshed meeting.
Sync is best-effort. When externalSyncStatus is FAILED and canRetrySync is true, call the sync endpoint to retry. syncFailureCode and syncFailureReason describe the last failure.

POST/api/v1/availability/check

Checks whether the given staff are free during a window. Returns one status per requested user.

{
  "userUuids":     ["PS0199CA8F08C270B5A5B0DFD3B565B332"],
  "startDateTime": "2026-06-15T15:00:00",
  "endDateTime":   "2026-06-15T15:45:00",
  "timezone":      "America/Santiago"
}
FieldTypeRequiredNotes
userUuidsstring[]requiredMust be non-empty.
startDateTimedatetimerequiredWindow start.
endDateTimedatetimerequiredWindow end.
timezonestringoptionalIANA zone for the window.
{
  "availabilities": [
    { "userUuid": "PS0199CA8F08C270B5A5B0DFD3B565B332", "status": "AVAILABLE" }
  ]
}

RSVP

Participants accept or decline an invitation. Authenticated users RSVP for themselves; guests use a per-participant public link delivered in their invitation email.

EndpointPurposeAuth
PUT /api/v1/meetings/{meetingUuid}/rsvpRSVP as the authenticated participant.Standard headers.
PUT /api/v1/meetings/{meetingUuid}/participants/{participantUuid}/rsvpRSVP via public link (JSON).Public; optional token query param.
GET /api/v1/meetings/{meetingUuid}/participants/{participantUuid}/rsvpRSVP via email link; returns an HTML confirmation page.Public; status + optional token query params.
{ "status": "ACCEPTED" }

status is required and must be ACCEPTED or DECLINED. For the public GET link, pass it as a query parameter: ?status=ACCEPTED&token=....


Calendar connection

A host can connect a Google or Outlook calendar so meetings sync both ways. The OAuth flow is initiated from the API and completed in the provider's consent screen.

EndpointPurpose
GET /api/v1/calendar/connectionCurrent connection status and modal preferences.
POST /api/v1/calendar/connect/{provider}Begin OAuth for google or outlook; returns an authorizationUrl.
GET /api/v1/calendar/callback/{provider}OAuth callback handler (provider redirect).
GET /api/v1/calendar/callback/successOAuth success page (HTML).
GET /api/v1/calendar/callback/oauth-failedOAuth failure page (HTML).
POST /api/v1/calendar/disconnectDisconnect the calendar.
POST /api/v1/calendar/syncPull meetings from the external calendar.
PUT /api/v1/calendar/connection/preferencesUpdate the first-time modal preference (action required).
1
Initiate
POST /calendar/connect/{provider}
Returns authorizationUrl
2
Authorize
User consents in provider UI
3
Callback
GET /calendar/callback/{provider}
Connection stored
4
Sync
POST /calendar/sync
Meetings flow both ways

Webhooks

Providers push change notifications to these unauthenticated endpoints. They always return 200 even on internal sync errors, to prevent the provider from retrying.

EndpointNotes
POST /api/v1/webhooks/googleGoogle push notifications. Requires the x-goog-channel-id header; unknown channel returns 403, missing header 400.
POST /api/v1/webhooks/outlookOutlook subscription notifications. A validationToken query param triggers a plain-text handshake response.

Data model

Meeting

Returned by create, get, update, and sync. The summary form (used in list responses) carries a reduced subset.

FieldTypeNotes
meetingUuidstringIdentifier.
tenantUuidstringOwning tenant.
titlestring
startDateTime / endDateTimedatetimeLocal date-times.
timezonestringIANA zone.
allDayboolean
locationTypeenumONLINE | IN_PERSON.
locationDetailstring
description / internalNotes / meetingInformationstringinternalNotes is staff-only.
meetingLink / meetingPassword / meetingProviderstringConferencing details.
statusenumACTIVE | CANCELED.
sourceenumINTERNAL | GOOGLE | OUTLOOK.
hostUuid / hostType / hostName / hostEmailstringMeeting owner.
createdByUuid / createdByTypestringCreator.
createdAt / updatedAtdatetime
durationMinutesintegerDerived length.
attendeeCountintegerNumber of participants.
participantsParticipant[]See below.
canEdit / canCancel / canResend / canRemoveFromCalendarbooleanPermitted actions for the current user.
organizerEmail / organizerNamestringExternal organizer, when applicable.
externallyOrganized / showExternalCalendarIconbooleanOrigin flags.
externalSyncStatusenumNOT_APPLICABLE | PENDING | SYNCED | FAILED.
lastSyncOperationenumCREATE | UPDATE | DELETE.
syncFailedAt / syncFailureCode / syncFailureReasonvariesLast failure detail.
canRetrySync / externalSyncFailureVisibleToViewerbooleanSync UX flags.

Participant

FieldTypeNotes
participantUuidstringParticipant identifier (used in per-participant RSVP/resend).
participantEntityUuidstringUnderlying contact/staff UUID.
participantTypeenumCONTACT | TENANT_STAFF | PARTNER_STAFF | EXTERNAL.
email / namestring
language / countryCode / phonestringEXTERNAL participants only.
rsvpStatusenumUNKNOWN | ACCEPTED | DECLINED.
canResend / lastInvitationResentAtvariesResend state.

ExternalAttendee

FieldTypeRequiredNotes
emailstringrequiredGuest email.
namestringoptionalDisplay name.
languagestringoptionalInvitation language.
countryCode / phonestringoptionalValidated as a guest phone number.

ResendInvitation

Returned by the resend endpoints: email and lastInvitationResentAt (null when the recipient was skipped).


Enum reference

The following fields accept a fixed set of values. Pass the exact string value shown.

locationType

ONLINE IN_PERSON

status (meeting)

ACTIVE CANCELED

source

INTERNAL GOOGLE OUTLOOK

participantType

CONTACT TENANT_STAFF PARTNER_STAFF EXTERNAL

rsvpStatus

UNKNOWN ACCEPTED DECLINED

externalSyncStatus

NOT_APPLICABLE PENDING SYNCED FAILED

lastSyncOperation

CREATE UPDATE DELETE

provider (calendar connection)

GOOGLE OUTLOOK

connection status

CONNECTED DISCONNECTED NONE

modal preference (firstTimeModalPref)

SHOW_ALWAYS DONT_SHOW REMIND_LATER

FilterOperator (v2 filtering)

EQUALS NOT_EQUALS IN NOT_IN CONTAINS STARTS_WITH ENDS_WITH RANGE GREATER_THAN GREATER_THAN_OR_EQUAL LESS_THAN LESS_THAN_OR_EQUAL IS_NULL IS_NOT_NULL