Meetings API
External integrationThe 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.
https://api.altafid.dev.altafid.netStandard auth headers are required on all endpoints except public webhooks and OAuth callbacks — see Authentication and Global Headers.
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.
| Header | Required | Notes |
|---|---|---|
Authorization: Bearer <token> | required | Access token. |
x-tenant-uuid | required | Tenant context. |
x-user-id | required | Current user UUID. |
x-user-email | required | Current user email. |
x-user-type | required | TENANT_STAFF, PARTNER_STAFF, or CLIENT. |
x-tenant-code | optional | Tenant code. |
x-partner-uuid | optional | Partner 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.
Find a free slot for staff
Returns
meetingUuidmonitor
externalSyncStatusParticipants accept or decline
or cancel
externalSyncStatus tracks progress. Otherwise the meeting is internal-only and externalSyncStatus is NOT_APPLICABLE.
Meeting endpoints
| Endpoint | Purpose |
|---|---|
POST /api/v1/meetings | Create a meeting. Returns the full meeting with meetingUuid. |
GET /api/v1/meetings | List meetings on the current user's calendar. |
POST /api/v2/meetings | Advanced 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}/cancel | Cancel a meeting; status moves to CANCELED. |
POST /api/v1/meetings/{meetingUuid}/resend | Resend invitations to all participants. |
POST /api/v1/meetings/{meetingUuid}/participants/{participantUuid}/resend | Resend the invitation to a single participant. |
POST /api/v1/meetings/{meetingUuid}/sync | Retry a failed external calendar sync. |
DELETE /api/v1/meetings/{meetingUuid}/calendar-visibility | Hide 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"
}
]
}
| Field | Type | Required | Notes |
|---|---|---|---|
title | string | optional | Meeting title. |
startDateTime | datetime | required | Local date-time, e.g. 2026-06-15T15:00:00. |
endDateTime | datetime | required | Must be after startDateTime. |
timezone | string | required | IANA zone, e.g. America/Santiago. |
allDay | boolean | optional | Marks the meeting as all-day. |
locationType | enum | required | ONLINE | IN_PERSON. |
locationDetail | string | optional | Address or meeting URL. |
description | string | optional | Shown to all participants. |
internalNotes | string | optional | Visible to internal staff only. |
meetingInformation | string | optional | Additional free-form meeting info. |
meetingLink | string | optional | Conference link. |
meetingPassword | string | optional | Conference passcode. |
meetingProvider | string | optional | Conference provider label, e.g. GOOGLE_MEET. |
contactIds | string[] | optional | Contact UUIDs to invite. |
staffIds | string[] | optional | Staff UUIDs to invite. |
externalAttendees | object[] | optional | Free-form guests — see ExternalAttendee. |
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"]
}
| Field | Type | Required | Notes |
|---|---|---|---|
filters[].field | string | required | Field to filter on. |
filters[].operator | enum | required | See FilterOperator. |
filters[].value / values / min / max | varies | optional | value for scalar ops, values for IN/NOT_IN, min+max for RANGE. |
page | integer | optional | Zero-indexed. Minimum 0. |
size | integer | optional | Between 1 and 100. |
sort | string[] | optional | field,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
| Endpoint | Purpose | Response |
|---|---|---|
POST /api/v1/meetings/{meetingUuid}/resend | Resend invitations to every participant. | 200 with per-recipient ResendInvitation results. |
POST /api/v1/meetings/{meetingUuid}/participants/{participantUuid}/resend | Resend to a single participant. | 200 with one result; lastInvitationResentAt is null if skipped. |
POST /api/v1/meetings/{meetingUuid}/sync | Retry external calendar sync after a failure. | 200 with the refreshed meeting. |
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"
}
| Field | Type | Required | Notes |
|---|---|---|---|
userUuids | string[] | required | Must be non-empty. |
startDateTime | datetime | required | Window start. |
endDateTime | datetime | required | Window end. |
timezone | string | optional | IANA 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.
| Endpoint | Purpose | Auth |
|---|---|---|
PUT /api/v1/meetings/{meetingUuid}/rsvp | RSVP as the authenticated participant. | Standard headers. |
PUT /api/v1/meetings/{meetingUuid}/participants/{participantUuid}/rsvp | RSVP via public link (JSON). | Public; optional token query param. |
GET /api/v1/meetings/{meetingUuid}/participants/{participantUuid}/rsvp | RSVP 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.
| Endpoint | Purpose |
|---|---|
GET /api/v1/calendar/connection | Current 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/success | OAuth success page (HTML). |
GET /api/v1/calendar/callback/oauth-failed | OAuth failure page (HTML). |
POST /api/v1/calendar/disconnect | Disconnect the calendar. |
POST /api/v1/calendar/sync | Pull meetings from the external calendar. |
PUT /api/v1/calendar/connection/preferences | Update the first-time modal preference (action required). |
Returns
authorizationUrlConnection stored
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.
| Endpoint | Notes |
|---|---|
POST /api/v1/webhooks/google | Google push notifications. Requires the x-goog-channel-id header; unknown channel returns 403, missing header 400. |
POST /api/v1/webhooks/outlook | Outlook 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.
| Field | Type | Notes |
|---|---|---|
meetingUuid | string | Identifier. |
tenantUuid | string | Owning tenant. |
title | string | |
startDateTime / endDateTime | datetime | Local date-times. |
timezone | string | IANA zone. |
allDay | boolean | |
locationType | enum | ONLINE | IN_PERSON. |
locationDetail | string | |
description / internalNotes / meetingInformation | string | internalNotes is staff-only. |
meetingLink / meetingPassword / meetingProvider | string | Conferencing details. |
status | enum | ACTIVE | CANCELED. |
source | enum | INTERNAL | GOOGLE | OUTLOOK. |
hostUuid / hostType / hostName / hostEmail | string | Meeting owner. |
createdByUuid / createdByType | string | Creator. |
createdAt / updatedAt | datetime | |
durationMinutes | integer | Derived length. |
attendeeCount | integer | Number of participants. |
participants | Participant[] | See below. |
canEdit / canCancel / canResend / canRemoveFromCalendar | boolean | Permitted actions for the current user. |
organizerEmail / organizerName | string | External organizer, when applicable. |
externallyOrganized / showExternalCalendarIcon | boolean | Origin flags. |
externalSyncStatus | enum | NOT_APPLICABLE | PENDING | SYNCED | FAILED. |
lastSyncOperation | enum | CREATE | UPDATE | DELETE. |
syncFailedAt / syncFailureCode / syncFailureReason | varies | Last failure detail. |
canRetrySync / externalSyncFailureVisibleToViewer | boolean | Sync UX flags. |
Participant
| Field | Type | Notes |
|---|---|---|
participantUuid | string | Participant identifier (used in per-participant RSVP/resend). |
participantEntityUuid | string | Underlying contact/staff UUID. |
participantType | enum | CONTACT | TENANT_STAFF | PARTNER_STAFF | EXTERNAL. |
email / name | string | |
language / countryCode / phone | string | EXTERNAL participants only. |
rsvpStatus | enum | UNKNOWN | ACCEPTED | DECLINED. |
canResend / lastInvitationResentAt | varies | Resend state. |
ExternalAttendee
| Field | Type | Required | Notes |
|---|---|---|---|
email | string | required | Guest email. |
name | string | optional | Display name. |
language | string | optional | Invitation language. |
countryCode / phone | string | optional | Validated 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.