---
title: "PATCH /space/{spaceId}/section/{sectionId}/block/{blockId}"
method: PATCH
path: "/space/{spaceId}/section/{sectionId}/block/{blockId}"
tags: ["space"]
---

# PATCH /space/{spaceId}/section/{sectionId}/block/{blockId}

`PATCH /space/{spaceId}/section/{sectionId}/block/{blockId}`

## Request

- Base URL: `https://developer.meetergo.com` (the document declares no server; this is the origin it was published from)
- URL: `https://developer.meetergo.com/space/{spaceId}/section/{sectionId}/block/{blockId}`
- Auth: one of:
  - HTTP bearer
  - HTTP bearer
  - API key in header `x-meetergo-api-user-id`

## Path parameters

- `spaceId` string, required
- `sectionId` string, required
- `blockId` string, required

## Request body

- UpdateSpaceBlockDto
  - `kind` 'content' | 'task' | 'scheduler' | 'text' | 'form' | 'meetings' | 'team' | 'invitee' | 'embed' | 'upload' | 'html' | 'contact' | 'offer' | 'whiteboard'
  - `title` string
  - `description` string
  - `visibility` 'hidden' | 'locked' | 'visible'
  - `status` 'todo' | 'wip' | 'done' | 'cancelled'
  - `index` number
  - `contentId` string, nullable
  - `documentId` string, nullable
  - `allowDownload` boolean
  - `thumbnail` object
  - `taskType` 'task' | 'meeting' | 'approval' | 'documentRequest'
  - `dueDate` string, nullable
  - `done` boolean
  - `tasks` SpaceBlockTask[]
    - `id` string, required
    - `description` string, required
    - `done` boolean, required
    - `dueDate` object, nullable
    - `assignee` SpaceTaskAssignee
      - `name` string, required
      - `side` 'us' | 'them', required
      - `avatarUrl` string
      - `viewerId` string
    - `resource` SpaceTaskResource
      - `title` string
      - `url` string
      - `contentId` string
    - `resources` SpaceTaskResource[]
      - `title` string
      - `url` string
      - `contentId` string
    - `phase` object, nullable
    - `completedAt` object, nullable
    - `updatedAt` object, nullable
  - `internalOwnerId` string, nullable
  - `ownerContactId` string, nullable
  - `stakeholderIds` string[]
  - `cta` SpaceBlockCta
    - `title` string, required
    - `url` string, required
  - `resources` SpaceBlockResource[]
    - `title` string, required
    - `url` string
    - `contentId` string
    - `folder` string
  - `meetingTypeId` string, nullable
  - `formId` string, nullable
  - `signatureRequestId` string, uuid, nullable: A document this block asks the client to sign. Checked against the owner's own company before it is attached: the signers behind a request become signing links for this portal's viewers, so attaching another company's request would hand its tokens out.
  - `url` string, nullable
  - `text` object, nullable
  - `html` string, nullable

## Response `200`

- SpaceBlock
  - `kind` 'content' | 'task' | 'scheduler' | 'text' | 'form' | 'meetings' | 'team' | 'invitee' | 'embed' | 'upload' | 'html' | 'contact' | 'offer' | 'whiteboard', required
  - `title` string, required
  - `description` string, required
  - `visibility` 'hidden' | 'locked' | 'visible', required
  - `status` 'todo' | 'wip' | 'done' | 'cancelled'
  - `index` number, required
  - `allowDownload` boolean, required
  - `thumbnail` object, required
  - `taskType` 'task' | 'meeting' | 'approval' | 'documentRequest'
  - `dueDate` string, date-time, nullable
  - `done` boolean, required
  - `tasks` SpaceBlockTask[], required
    - `id` string, required
    - `description` string, required
    - `done` boolean, required
    - `dueDate` object, nullable
    - `assignee` SpaceTaskAssignee
      - `name` string, required
      - `side` 'us' | 'them', required
      - `avatarUrl` string
      - `viewerId` string
    - `resource` SpaceTaskResource
      - `title` string
      - `url` string
      - `contentId` string
    - `resources` SpaceTaskResource[]
      - `title` string
      - `url` string
      - `contentId` string
    - `phase` object, nullable
    - `completedAt` object, nullable
    - `updatedAt` object, nullable
  - `cta` SpaceBlockCta
    - `title` string, required
    - `url` string, required
  - `resources` SpaceBlockResource[], required
    - `title` string, required
    - `url` string
    - `contentId` string
    - `folder` string
  - `url` string, nullable
  - `text` object, nullable
  - `html` string, nullable: html-block artifact document. Stored verbatim (no sanitizer preserves a working app); the opaque-origin sandboxed iframe is the security boundary. Never render this field outside that frame.
  - `salesDocumentId` string, nullable: OFFER blocks: the shared invoicing SalesDocument (plain id — the invoicing module stays decoupled, mirroring SalesDocument.dealId).
  - `createdAt` string, date-time, required
  - `updatedAt` string, date-time, required
  - `deletedAt` string, date-time, nullable
  - `id` string, required
  - `sectionId` string, required
  - `content` Content
    - `metadata` object, required: Accepts any json. Currently used properties: `url`: URL to the content (why we don't have a field for this I dont know) `bucketFileKey`: If file is stored in content bucket, the key for accessing directly in bucket (undefined if file is not stored by us)
    - `tags` string[], required: Free-form organizing labels for the content library (owner-only).
    - `createdAt` string, date-time, required
    - `updatedAt` string, date-time, required
    - `deletedAt` string, date-time, nullable
    - `id` string, required
    - `name` string, required
    - `saved` boolean, required: @default true
    - `contentType` string, required
    - `userId` string: Owner
  - `contentId` string, nullable
  - `documentId` string, nullable
  - `internalOwnerId` string, nullable
  - `ownerContact` CustomerContact
    - `name` string
    - `email` string
    - `phone` string
    - `profilePicture` string
    - `position` string
    - `isInternal` boolean, required
    - `language` 'en' | 'de' | 'fr' | 'es' | 'no' | 'nl' | 'it' | 'pl' | 'se' | 'tr' | 'da', required
    - `id` string, required
    - `companyId` string, required
    - `customerCompanyId` string
    - `passcode` string, required
    - `createdAt` string, date-time, required
    - `updatedAt` string, date-time, required
    - `deletedAt` string, date-time, nullable
    - `stats` ContactDealStats, required
      - `viewHistory` string[]
  - `ownerContactId` string, nullable
  - `stakeholders` CustomerContact[]
    - `name` string
    - `email` string
    - `phone` string
    - `profilePicture` string
    - `position` string
    - `isInternal` boolean, required
    - `language` 'en' | 'de' | 'fr' | 'es' | 'no' | 'nl' | 'it' | 'pl' | 'se' | 'tr' | 'da', required
    - `id` string, required
    - `companyId` string, required
    - `customerCompanyId` string
    - `passcode` string, required
    - `createdAt` string, date-time, required
    - `updatedAt` string, date-time, required
    - `deletedAt` string, date-time, nullable
    - `stats` ContactDealStats, required
      - `viewHistory` string[]
  - `stakeholderIds` string[], required
  - `meetingType` MeetingType
    - `meetingInfo` MeetingInfo, required
      - `name` string, required: Name of the meeting type
      - `description` string, required: Description of the meeting type
      - `nameLocalised` LocalisedContent
        - `en` string, required
        - `de` string
        - `fr` string
        - `es` string
        - `no` string
        - `it` string
        - `nl` string
        - `da` string
        - `pl` string
        - `se` string
        - `tr` string
      - `descriptionLocalised` LocalisedContent
        - `en` string, required
        - `de` string
        - `fr` string
        - `es` string
        - `no` string
        - `it` string
        - `nl` string
        - `da` string
        - `pl` string
        - `se` string
        - `tr` string
      - `enableRedirect` boolean, required: Enable redirect after booking completion
      - `redirect` string, required: Redirect URL to navigate after booking
      - `passEventDetailsToRedirect` boolean, required: Pass event details (invitee name, email, form answers) as query params to redirect URL
      - `duration` number, required: Primary duration in minutes
      - `channel` 'local' | 'local-attendee' | 'google' | 'zoom' | 'phone' | 'phone-incoming' | 'whatsapp' | 'connect' | 'webex' | 'skypeForConsumer' | 'skypeForBusiness' | 'teamsForBusiness' | 'teamsForBusiness2' | 'teamsForExchange' | 'teams2ForExchange' | 'custom' | 'resource' | 'whereby' | 'kmeet' | 'zava' | 'jitsi' | 'nextcloudTalk' | 'openTalk' | 'alfaview', required: Meeting channel/location type
      - `customChannelName` string, required: Custom name for the meeting channel
      - `customChannelLink` string, required: Custom link for the meeting channel
      - `connectChannelName` string, required: Custom display name for the connect channel
      - `groupBooking` boolean, required: Enable group booking (multiple attendees per slot)
      - `showAvailableSlots` boolean, required: Show available spots count on the booking page
      - `enrichInvitee` boolean, required: Enable invitee data enrichment
      - `autoCreateSpace` boolean, required: Auto-create a Space when someone books
      - `spacePresetId` object, nullable: Space preset id used for the auto-created Space
      - `spaceAutoInvite` boolean, required: Publish the auto-created Space and invite the booker
      - `confirmationButton` ConfirmationButton, required
        - `useConfirmationButton` boolean, required
        - `text` string, required
        - `color` string, required
        - `link` string, required
      - `bufferBefore` number, required: Buffer time before meeting in minutes
      - `bufferAfter` number, required: Buffer time after meeting in minutes
      - `bufferMustStayWithinWorkingHours` boolean, required: Only offer slots where buffer fits within working hours (no spillover into breaks or after-hours)
      - `rollingSlots` boolean, required: Restart the slot grid after each appointment instead of keeping a fixed grid per working block
      - `color` object, nullable: Color for the meeting type in RGB format, e.g. "rgb(0, 153, 255)"
    - `meetingOptions` MeetingOptions, required
      - `allowedDurations` number[], required: Additional duration options in minutes (shown alongside primary duration)
      - `allowSelectChannel` boolean, required: Allow attendees to select meeting channel/location
      - `allowHostSelection` boolean, required: Allow attendees to select specific host (round-robin only)
      - `forceHostSelection` boolean, required: Force host selection (no "any host" option available)
      - `allowedChannels` MeetingTypeChannel[], required: Available channel options when allowSelectChannel is enabled
      - `channelAvailabilities` object: Per-channel availability overrides. Each value can be a UUID string (existing availability) or an inline availability object with "name", "timezone", and optional "schedule" and "exceptions" for creation.
      - `allowAddingGuests` boolean, required: Allow attendees to invite additional guests
      - `doubleOptIn` string, required: Double opt-in confirmation setting
      - `requireHostConfirmation` string, required: Require host confirmation for bookings
      - `enableClusterMeeting` boolean, required: Show only time slots adjacent to existing meetings
      - `enableBufferCarryOver` boolean, required: Carry over buffer time to next available slot if needed
      - `maxBufferCarryOverDelay` number, required: Maximum hours for buffer carry-over delay (0-168)
      - `allowPhoneOnlyBooking` boolean, required: Allow phone-only bookings without email (API use case, requires phoneOnlyBooking in request)
      - `hideReassignedHostDetails` boolean, required: Hide the previous host's details from attendee reassignment emails
      - `confirmationPageCssSetting` CssSetting, required
        - `mode` number, required
        - `themePreset` 'light' | 'dark' | 'eco' | 'charcoal' | 'bold'
      - `bookingPagePassword` BookingPagePasswordSetting, required
        - `enable` boolean, required: Enable password protection for booking page
        - `password` object, required: Password for booking page access
    - `timeslotInterval` number, required
    - `spots` number, required
    - `enabled` boolean, required
    - `isHidden` boolean, required: Marks meeting types that should be hidden from user-facing UIs. Used for system-generated meeting types (e.g., calgent auto-bookings). When true: - Not shown in meeting type lists (filtered in all queries) - Cannot be directly edited by users via UI - May be managed by automated processes
    - `slug` string, required
    - `bookingMinimum` number, required: Time in minutes. Default 30 mins
    - `roundRobin` string[], required: Used to store user latest booked host ids Last element - lastest booked host There shouldn't be duplicates
    - `schedule` WeeklySchedule, required
      - `monday` DaySchedule, required
        - `enabled` boolean, required
        - `hours` HoursSchedule[], required
          - `start` string, required
          - `end` string, required
      - `tuesday` DaySchedule, required
        - `enabled` boolean, required
        - `hours` HoursSchedule[], required
          - `start` string, required
          - `end` string, required
      - `wednesday` DaySchedule, required
        - `enabled` boolean, required
        - `hours` HoursSchedule[], required
          - `start` string, required
          - `end` string, required
      - `thursday` DaySchedule, required
        - `enabled` boolean, required
        - `hours` HoursSchedule[], required
          - `start` string, required
          - `end` string, required
      - `friday` DaySchedule, required
        - `enabled` boolean, required
        - `hours` HoursSchedule[], required
          - `start` string, required
          - `end` string, required
      - `saturday` DaySchedule, required
        - `enabled` boolean, required
        - `hours` HoursSchedule[], required
          - `start` string, required
          - `end` string, required
      - `sunday` DaySchedule, required
        - `enabled` boolean, required
        - `hours` HoursSchedule[], required
          - `start` string, required
          - `end` string, required
    - `hideAddressField` boolean, required: Hide address field for LOCAL_ATTENDEE channel type
    - `form` Form
      - `id` string, required
      - `name` string, required
      - `title` object, required: Title to be displayed in booking in multiple languages. Key is Language Code, Value is title in specified locale.
      - `actionButtonText` object, required: Button text to be displayed in booking in multiple languages. Key is Language Code, Value is title in specified locale.
      - `blockedEmails` string[], required
      - `fields` FormField[], required
        - `form` Form, required (recursive)
        - `formId` string, required
        - `dataField` DataField, required
          - `id` number, required
          - `label` string, required
          - `name` string, required
          - `target` 'email' | 'firstname' | 'lastname' | 'fullname' | 'phone' | 'marketing_consent' | 'other', required
          - `fieldType` 'email' | 'phone' | 'text-single' | 'text-multi' | 'number' | 'select' | 'checkbox-single' | 'checkbox-multi' | 'radio' | 'slide' | 'url' | 'file' | 'date-of-birth' | 'yes-no' | 'rating' | 'scale' | 'signature' | 'date' | 'time' | 'image' | 'heading' | 'separator' | 'page-break' | 'contact' | 'bank-details' | 'license-plate' | 'info-text' | 'info-image' | 'info-video' | 'currency' | 'location' | 'pdf-template' | 'file-download' | 'testimonial' | 'faq' | 'countdown' | 'loading' | 'quiz-reveal' | 'logos' | 'checklist' | 'html' | 'address', required
          - `order` number, required: Where this field sits when its values are read back on a record. A contact's custom fields are a jsonb bag keyed by field name, so the card showing them had no order but the one values happened to be written in — which put a postcode above the street it belongs under. Ordering the definitions gives every surface reading `additionalData` one answer. Lower first; ties fall back to id, so untouched companies keep the order they already see.
          - `locales` FieldLocale[], required
            - `locale` string, required
            - `label` string, required
            - `labelRichText` RichTextDocument
              - …
            - `placeholder` string
          - `default` boolean, required
          - `required` boolean, required
          - `hidden` boolean, required
          - `hideUntilChange` boolean, required
          - `mutable` boolean, required
          - `defaultValue` string
          - `placeholder` string
          - `options` FieldOptions[], required
            - `description` string: Optional plain-text option description
            - `labelRichText` RichTextDocument
              - …
            - `descriptionRichText` RichTextDocument
              - …
            - `pointValue` number: Points awarded when this option is selected (for scored forms)
            - `locales` FieldLocale[]: Translations for the option label, same structure as field-level locales
              - …
            - `conditions` Expression
              - …
            - `label` string, required
            - `value` string, required
            - `image` string
            - `icon` string
            - `minValue` number: Used by number fields, min value
            - `maxValue` number: Used by number fields, max value
          - `slideOptions` SlideOptions
            - `description` string, required
            - `multiselect` boolean, required
            - `type` 'checkbox' | 'page' | 'image' | 'icon', required
            - `hideLabel` boolean
            - `childFields` object[]: Per-page child-field instances inside the slide. The editor owns the SlideChildField shape (instanceId, index, dataFieldId, optional inline definition, legacy `required` flag, etc.). We accept it verbatim and keep the type loose because the legacy import path adds extra fields the editor doesn't model. Declaring it on the DTO is what lets a save carry childFields through: without it, class-transformer drops the unknown key from the request body, so DnD-added children never persist.
              - …
          - `fileFieldOptions` FileFieldOptions
            - `allowedExtensions` string[], required: Allowed file extensions (e.g., pdf, docx, jpg)
            - `maxFileSizeMB` number, required: Maximum file size in MB
            - `maxFiles` number, required: Maximum number of files
            - `enableCameraCapture` boolean: Enable camera capture on mobile devices (shows camera/file toggle). Only works when allowedExtensions includes image types.
          - `contactOptions` ContactOptions
            - `company` boolean: Company name; becomes the invoice recipient when the field feeds billing
            - `salutation` boolean
            - `firstName` boolean
            - `lastName` boolean
            - `email` boolean
            - `phone` boolean
            - `mobile` boolean
            - `birthdate` boolean
            - `street` boolean
            - `addressSupplement` boolean
            - `zip` boolean
            - `city` boolean
            - `country` boolean
            - `vatId` boolean: USt-IdNr. / VAT ID, for B2B and reverse-charge invoicing
          - `hubspotContactField` string
          - `hubspotCompanyField` string
          - `smartWeContactField` string
          - `smartWeCompanyField` string
          - `pipedriveContactField` string
          - `closeContactField` string
          - `salesforceContactField` string
          - `salesforceLeadField` string
          - `salesforceCaseField` string
          - `salesforceOpportunityField` string
          - `salesforceAccountField` string
          - `createdAt` string, date-time, required
          - `updatedAt` string, date-time, required
          - `deletedAt` string, nullable
          - `helpText` string: Optional help text shown below the field in the booking form. Provides additional guidance to users filling out the form.
          - `bankDetailsOptions` BankDetailsOptions
            - `showBic` boolean
            - `showAccountHolder` boolean
            - `showSignature` boolean
          - `licensePlateOptions` LicensePlateOptions
            - `countryFilter` 'all' | 'de': Country format filter: all = any country, de = German format only
          - `textFormatOptions` TextFormatOptions
            - `kind` 'length' | 'digits' | 'preset' | 'mask', required
            - `minLength` number, nullable: kind = length
            - `maxLength` number, nullable: kind = length
            - `length` number, nullable: kind = digits: exact digit count
            - `preset` 'se_orgnr' | 'de_plz' | 'at_plz' | 'ch_plz' | 'de_steuer_id' | 'pl_nip', nullable: kind = preset
            - `mask` string, nullable: kind = mask. # = digit, A = letter, * = letter or digit, anything else is a literal.
            - `errorMessage` string, nullable: Host-authored message shown instead of the derived one
          - `pdfTemplateOptions` PdfTemplateOptions
            - `fileAssetId` string, required: FileAsset ID of the uploaded PDF template
            - `pdfmeTemplate` object, required: pdfme template schema JSON (positions of fields on the PDF). Does not include the basePdf bytes.
            - `requireSignature` boolean, required: When true, respondent must draw a signature before accepting the document.
            - `requireSignatureOtp` boolean: When true, respondent must verify their identity via email OTP (FES) before signing.
          - `fileDownloadOptions` FileDownloadOptions
            - `fileAssetIds` string[], required: FileAsset IDs of library files to offer for download
            - `fileNames` object: Map of fileAssetId → original filename for display without extra API calls
          - `blockOptions` BlockOptions
            - `richText` DataFieldRichText
              - …
            - `testimonials` TestimonialItemOptions[]
              - …
            - `faqs` FaqItemOptions[]
              - …
            - `logos` LogoItemOptions[]
              - …
            - `checklist` ChecklistItemOptions[]
              - …
            - `countdown` CountdownBlockOptions
              - …
            - `loading` LoadingBlockOptions
              - …
            - `quizReveal` QuizRevealBlockOptions
              - …
            - `html` HtmlBlockOptions
              - …
          - `displayStyle` object: Controls how options are displayed for radio/checkbox/select fields. 'default' - Standard list view 'card' - Card grid with optional icons
          - `conditions` object, nullable: Conditional visibility expression. When set, the field is only shown to the visitor when the expression evaluates to true against current form values. Uses the same Expression/ExpressionCondition structure as routing rules.
          - `headingLevel` number: Heading level for heading fields (1–6). Defaults to 2 (renders as <h2>).
          - `signingPaused` boolean: Computed per request when a public form is served — not persisted. Populated by `PublicFormController.withSigningAvailability`. True when the owning company has used this month's signature allowance, so the renderer shows this field as temporarily unable to take a signature instead of a signature pad. The rest of the form still renders and still submits: these forms are lead capture, and losing the lead would cost the owner far more than the unsigned document.
          - `showInfobox` boolean, required: Only for data fields of type slide, enable to show an infobox.
          - `infoboxText` string: Only for data fields of type slide, custom infobox text.
          - `companyId` string, required
          - `evalancheFieldId` string
          - `klicktippFieldId` string
          - `min` number: Currently used by number field as min value. For string field, it is minimum amount of characters.
          - `max` number
          - `style` number: For Phone Number field - used to set the style of phone input. 0 - Simple (Default) 1 - With country code picker
          - `defaultCountryCode` string: For Phone Number field - default country code (e.g., "+1", "+49", "+44"). Used when style is WITH_COUNTRY_CODE_PICKER to set the initial country selection.
          - `useMarkdown` boolean, required: When true, field.label is rendered through markdown-it (html: false). Allows **bold**, _italic_, `code`, and links in field labels.
          - `requireSignatureOtp` boolean, required: When true, the signer must verify their email via OTP before the signature canvas is unlocked.
        - `dataFieldId` number, required
        - `index` number, required
      - `funnelSteps` FunnelStep[], required
        - `form` Form, required (recursive)
        - `id` string, required
        - `index` number, required
        - `formId` string, required
        - `funnelStepDataFields` FunnelStepDataField[], required
          - `id` string, required
          - `funnelStep` FunnelStep, required (recursive)
          - `funnelStepId` string, required
          - `funnelStepFormId` string
          - `dataField` DataField, required
            - `id` number, required
            - `label` string, required
            - `name` string, required
            - `target` 'email' | 'firstname' | 'lastname' | 'fullname' | 'phone' | 'marketing_consent' | 'other', required
            - `fieldType` 'email' | 'phone' | 'text-single' | 'text-multi' | 'number' | 'select' | 'checkbox-single' | 'checkbox-multi' | 'radio' | 'slide' | 'url' | 'file' | 'date-of-birth' | 'yes-no' | 'rating' | 'scale' | 'signature' | 'date' | 'time' | 'image' | 'heading' | 'separator' | 'page-break' | 'contact' | 'bank-details' | 'license-plate' | 'info-text' | 'info-image' | 'info-video' | 'currency' | 'location' | 'pdf-template' | 'file-download' | 'testimonial' | 'faq' | 'countdown' | 'loading' | 'quiz-reveal' | 'logos' | 'checklist' | 'html' | 'address', required
            - `order` number, required: Where this field sits when its values are read back on a record. A contact's custom fields are a jsonb bag keyed by field name, so the card showing them had no order but the one values happened to be written in — which put a postcode above the street it belongs under. Ordering the definitions gives every surface reading `additionalData` one answer. Lower first; ties fall back to id, so untouched companies keep the order they already see.
            - `locales` FieldLocale[], required
              - …
            - `default` boolean, required
            - `required` boolean, required
            - `hidden` boolean, required
            - `hideUntilChange` boolean, required
            - `mutable` boolean, required
            - `defaultValue` string
            - `placeholder` string
            - `options` FieldOptions[], required
              - …
            - `slideOptions` SlideOptions
              - …
            - `fileFieldOptions` FileFieldOptions
              - …
            - `contactOptions` ContactOptions
              - …
            - `hubspotContactField` string
            - `hubspotCompanyField` string
            - `smartWeContactField` string
            - `smartWeCompanyField` string
            - `pipedriveContactField` string
            - `closeContactField` string
            - `salesforceContactField` string
            - `salesforceLeadField` string
            - `salesforceCaseField` string
            - `salesforceOpportunityField` string
            - `salesforceAccountField` string
            - `createdAt` string, date-time, required
            - `updatedAt` string, date-time, required
            - `deletedAt` string, nullable
            - `helpText` string: Optional help text shown below the field in the booking form. Provides additional guidance to users filling out the form.
            - `bankDetailsOptions` BankDetailsOptions
              - …
            - `licensePlateOptions` LicensePlateOptions
              - …
            - `textFormatOptions` TextFormatOptions
              - …
            - `pdfTemplateOptions` PdfTemplateOptions
              - …
            - `fileDownloadOptions` FileDownloadOptions
              - …
            - `blockOptions` BlockOptions
              - …
            - `displayStyle` object: Controls how options are displayed for radio/checkbox/select fields. 'default' - Standard list view 'card' - Card grid with optional icons
            - `conditions` object, nullable: Conditional visibility expression. When set, the field is only shown to the visitor when the expression evaluates to true against current form values. Uses the same Expression/ExpressionCondition structure as routing rules.
            - `headingLevel` number: Heading level for heading fields (1–6). Defaults to 2 (renders as <h2>).
            - `signingPaused` boolean: Computed per request when a public form is served — not persisted. Populated by `PublicFormController.withSigningAvailability`. True when the owning company has used this month's signature allowance, so the renderer shows this field as temporarily unable to take a signature instead of a signature pad. The rest of the form still renders and still submits: these forms are lead capture, and losing the lead would cost the owner far more than the unsigned document.
            - `showInfobox` boolean, required: Only for data fields of type slide, enable to show an infobox.
            - `infoboxText` string: Only for data fields of type slide, custom infobox text.
            - `companyId` string, required
            - `evalancheFieldId` string
            - `klicktippFieldId` string
            - `min` number: Currently used by number field as min value. For string field, it is minimum amount of characters.
            - `max` number
            - `style` number: For Phone Number field - used to set the style of phone input. 0 - Simple (Default) 1 - With country code picker
            - `defaultCountryCode` string: For Phone Number field - default country code (e.g., "+1", "+49", "+44"). Used when style is WITH_COUNTRY_CODE_PICKER to set the initial country selection.
            - `useMarkdown` boolean, required: When true, field.label is rendered through markdown-it (html: false). Allows **bold**, _italic_, `code`, and links in field labels.
            - `requireSignatureOtp` boolean, required: When true, the signer must verify their email via OTP before the signature canvas is unlocked.
          - `dataFieldId` number, required
          - `order` number, required
      - `default` boolean, required: Indicates default form that can be modified, but should not be deleted
      - `funnelConditions` FunnelQualifier[], required
        - `fieldId` string, required
        - `expression` Expression, required
          - `operator` 'and' | 'or', required
          - `operands` union[], required
            - union
              - …
      - `useFullName` boolean, required
      - `skipForm` boolean, required
      - `showProgressBar` boolean
      - `useMeetingTypeSelection` boolean, required
      - `selectMeetingTypes` MeetingType[], required
      - `selectMeetingTypeOrder` string[]: Stores the order of meeting types for selection pages. If empty/null, use default order from selectMeetingTypeIds.
      - `selectionPageLayout` 'grid' | 'list' | 'cards' | 'tiles' | 'spotlight' | 'minimal' | 'showcase', required
      - `selectionPageDescription` object, required: Intro text shown under the selection page title, per language code.
      - `selectionPageSocialLinks` object, required: Social and contact links shown on the selection page.
      - `meetingType` MeetingType (recursive)
      - `meetingTypeTemplate` MeetingTypeTemplate
        - `meetingInfo` MeetingInfo, required
          - `name` string, required: Name of the meeting type
          - `description` string, required: Description of the meeting type
          - `nameLocalised` LocalisedContent
            - `en` string, required
            - `de` string
            - `fr` string
            - `es` string
            - `no` string
            - `it` string
            - `nl` string
            - `da` string
            - `pl` string
            - `se` string
            - `tr` string
          - `descriptionLocalised` LocalisedContent
            - `en` string, required
            - `de` string
            - `fr` string
            - `es` string
            - `no` string
            - `it` string
            - `nl` string
            - `da` string
            - `pl` string
            - `se` string
            - `tr` string
          - `enableRedirect` boolean, required: Enable redirect after booking completion
          - `redirect` string, required: Redirect URL to navigate after booking
          - `passEventDetailsToRedirect` boolean, required: Pass event details (invitee name, email, form answers) as query params to redirect URL
          - `duration` number, required: Primary duration in minutes
          - `channel` 'local' | 'local-attendee' | 'google' | 'zoom' | 'phone' | 'phone-incoming' | 'whatsapp' | 'connect' | 'webex' | 'skypeForConsumer' | 'skypeForBusiness' | 'teamsForBusiness' | 'teamsForBusiness2' | 'teamsForExchange' | 'teams2ForExchange' | 'custom' | 'resource' | 'whereby' | 'kmeet' | 'zava' | 'jitsi' | 'nextcloudTalk' | 'openTalk' | 'alfaview', required: Meeting channel/location type
          - `customChannelName` string, required: Custom name for the meeting channel
          - `customChannelLink` string, required: Custom link for the meeting channel
          - `connectChannelName` string, required: Custom display name for the connect channel
          - `groupBooking` boolean, required: Enable group booking (multiple attendees per slot)
          - `showAvailableSlots` boolean, required: Show available spots count on the booking page
          - `enrichInvitee` boolean, required: Enable invitee data enrichment
          - `autoCreateSpace` boolean, required: Auto-create a Space when someone books
          - `spacePresetId` object, nullable: Space preset id used for the auto-created Space
          - `spaceAutoInvite` boolean, required: Publish the auto-created Space and invite the booker
          - `confirmationButton` ConfirmationButton, required
            - `useConfirmationButton` boolean, required
            - `text` string, required
            - `color` string, required
            - `link` string, required
          - `bufferBefore` number, required: Buffer time before meeting in minutes
          - `bufferAfter` number, required: Buffer time after meeting in minutes
          - `bufferMustStayWithinWorkingHours` boolean, required: Only offer slots where buffer fits within working hours (no spillover into breaks or after-hours)
          - `rollingSlots` boolean, required: Restart the slot grid after each appointment instead of keeping a fixed grid per working block
          - `color` object, nullable: Color for the meeting type in RGB format, e.g. "rgb(0, 153, 255)"
        - `meetingOptions` MeetingOptions, required
          - `allowedDurations` number[], required: Additional duration options in minutes (shown alongside primary duration)
          - `allowSelectChannel` boolean, required: Allow attendees to select meeting channel/location
          - `allowHostSelection` boolean, required: Allow attendees to select specific host (round-robin only)
          - `forceHostSelection` boolean, required: Force host selection (no "any host" option available)
          - `allowedChannels` MeetingTypeChannel[], required: Available channel options when allowSelectChannel is enabled
          - `channelAvailabilities` object: Per-channel availability overrides. Each value can be a UUID string (existing availability) or an inline availability object with "name", "timezone", and optional "schedule" and "exceptions" for creation.
          - `allowAddingGuests` boolean, required: Allow attendees to invite additional guests
          - `doubleOptIn` string, required: Double opt-in confirmation setting
          - `requireHostConfirmation` string, required: Require host confirmation for bookings
          - `enableClusterMeeting` boolean, required: Show only time slots adjacent to existing meetings
          - `enableBufferCarryOver` boolean, required: Carry over buffer time to next available slot if needed
          - `maxBufferCarryOverDelay` number, required: Maximum hours for buffer carry-over delay (0-168)
          - `allowPhoneOnlyBooking` boolean, required: Allow phone-only bookings without email (API use case, requires phoneOnlyBooking in request)
          - `hideReassignedHostDetails` boolean, required: Hide the previous host's details from attendee reassignment emails
          - `confirmationPageCssSetting` CssSetting, required
            - `mode` number, required
            - `themePreset` 'light' | 'dark' | 'eco' | 'charcoal' | 'bold'
          - `bookingPagePassword` BookingPagePasswordSetting, required
            - `enable` boolean, required: Enable password protection for booking page
            - `password` object, required: Password for booking page access
        - `timeslotInterval` number, required
        - `spots` number, required
        - `bookingMinimum` number, required: Time in minutes. Default 30 mins
        - `schedule` WeeklySchedule, required
          - `monday` DaySchedule, required
            - `enabled` boolean, required
            - `hours` HoursSchedule[], required
              - …
          - `tuesday` DaySchedule, required
            - `enabled` boolean, required
            - `hours` HoursSchedule[], required
              - …
          - `wednesday` DaySchedule, required
            - `enabled` boolean, required
            - `hours` HoursSchedule[], required
              - …
          - `thursday` DaySchedule, required
            - `enabled` boolean, required
            - `hours` HoursSchedule[], required
              - …
          - `friday` DaySchedule, required
            - `enabled` boolean, required
            - `hours` HoursSchedule[], required
              - …
          - `saturday` DaySchedule, required
            - `enabled` boolean, required
            - `hours` HoursSchedule[], required
              - …
          - `sunday` DaySchedule, required
            - `enabled` boolean, required
            - `hours` HoursSchedule[], required
              - …
        - `hideAddressField` boolean, required: Hide address field for LOCAL_ATTENDEE channel type
        - `form` Form (recursive)
        - `availability` Availability
          - `timezone` string, required
          - `id` string, required
          - `name` string, required
          - `schedule` WeeklySchedule, required
            - `monday` DaySchedule, required
              - …
            - `tuesday` DaySchedule, required
              - …
            - `wednesday` DaySchedule, required
              - …
            - `thursday` DaySchedule, required
              - …
            - `friday` DaySchedule, required
              - …
            - `saturday` DaySchedule, required
              - …
            - `sunday` DaySchedule, required
              - …
          - `useExplicitAvailability` boolean, required: When enabled, calendar events with the specified title are offered as bookable slots IN ADDITION to the weekly schedule (they behave like positive exceptions, see `UserAvailabilityService`). The weekly grid stays editable. Not to be confused with `scheduleSource`, which decides where the grid itself comes from.
          - `scheduleSource` object, required: Where the weekly schedule comes from. `manual` is the user typing it; `outlook` means it is read from the mailbox's Outlook working hours and the editor refuses direct schedule/timezone edits until switched back. Never read during slot calculation: to the availability engine an Outlook-sourced schedule is just a schedule.
          - `scheduleSourceConnectionId` string, nullable
          - `scheduleSyncedAt` string, date-time, nullable: Last time Outlook was consulted for this schedule (success or not).
          - `scheduleSyncError` object, nullable: Why the last consultation of Outlook could not update the schedule.
          - `explicitAvailabilityEventTitle` string, nullable: The calendar event title to look for when useExplicitAvailability is enabled. Events with this title will be treated as available booking slots.
          - `userId` string, required
          - `availabilityExceptions` AvailabilityException[]
            - `ownerId` string, required
            - `ownerType` 'company' | 'user', required
            - `available` boolean, required
            - `start` string, required: Start time stored as clock time: "YYYY-MM-DDTHH:mm" (e.g., "2026-01-20T10:00"). Interpreted in availability.timezone when querying. BACKWARDS COMPATIBILITY (migration in progress since Dec 2025): Legacy data has Z suffix (e.g., "2026-01-20T10:00:00.000Z") and is interpreted as UTC. When all legacy exceptions expire or are edited, the Z-suffix handling can be removed.
            - `end` string, required: End time stored as clock time: "YYYY-MM-DDTHH:mm" (e.g., "2026-01-20T17:00"). Interpreted in availability.timezone when querying. BACKWARDS COMPATIBILITY (migration in progress since Dec 2025): Legacy data has Z suffix (e.g., "2026-01-20T17:00:00.000Z") and is interpreted as UTC. When all legacy exceptions expire or are edited, the Z-suffix handling can be removed.
            - `title` string: Optional title
            - `note` string: Optional note / description
            - `id` number, required
            - `createdAt` string, date-time, required
            - `updatedAt` string, date-time, required
            - `availabilityId` string, required
          - `createdAt` string, date-time, required
          - `updatedAt` string, date-time, required
          - `deletedAt` string, date-time, nullable
          - `meetingType` MeetingType (recursive)
          - `meetingTypeTemplate` MeetingTypeTemplate (recursive)
          - `resourceChannels` ResourceChannel[], required
            - `name` string, nullable: Optional name to show for resource channel, fall back to user name
            - `resource` User, required
              - …
            - `groupName` string: If resource channel is part of a group, this is the name of the group. Multiple resource channels can be part of the same group, in which case the name is the same. Multiple resources with the same group name are grouped and only the group name is shown as a resource. Any resource within the group can be selected according to the items `groupIndex`. If resource channel is the only group member, this has no effect.
            - `groupMemberIndex` number: If resource channel is part of a group, this is the zero-based index to determine order that resource channel will be chosen within the group. Group members with index 0 will be chosen first, then 1, then 2, etc. If `groupName` is null, this has no effect.
            - `availability` Availability (recursive)
            - `meetingType` MeetingType (recursive)
            - `meetingTypeTemplate` MeetingTypeTemplate (recursive)
            - `id` string, required
            - `resourceId` string, required
            - `availabilityId` string
            - `meetingTypeId` string
            - `meetingTypeTemplateId` string
        - `reminders` Reminder[]
          - `meetingTypes` MeetingType[]
          - `meetingTypeTemplates` MeetingTypeTemplate[]
          - `forms` Form[]
          - `pipelines` Pipeline[]
            - `id` string, required
            - `name` string, required
            - `position` number, required
            - `isDefault` boolean, required
            - `company` Company, required
              - …
            - `companyId` string, required
            - `stages` PipelineStage[]
              - …
            - `createdAt` string, date-time, required
            - `updatedAt` string, date-time, required
            - `deletedAt` string, date-time
          - `workspace` Workspace
            - `connectWaitingRoom` ConnectWaitingRoomSettings
              - …
            - `integrationPermissions` object: Workspace-level integration permission overrides. Can override company settings (allow or deny specific integrations).
            - `customBookingCSS` string: Custom CSS for booking and confirmation pages. When set, this overrides the company-level customBookingCSS for this workspace's meeting types. Applied to both booking pages and confirmation/reschedule/cancel pages.
            - `createdAt` string, date-time, required
            - `updatedAt` string, date-time, required
            - `deletedAt` string, nullable
            - `id` string, required
            - `name` string, required
            - `slug` string, required: Slug must be unique
            - `picture` string: Full url to workspace picture hosted statically
            - `description` string
            - `primaryColor` string
            - `logoUrl` string
            - `language` 'en' | 'de' | 'fr' | 'es' | 'no' | 'nl' | 'it' | 'pl' | 'se' | 'tr' | 'da'
            - `salesforceStudioId` string: Salesforce Studio__c Record ID Used for Küche&Co integration to link Cases to Studios
            - `useCompanyDefaultColor` boolean, required
            - `useCompanyDefaultLanguage` boolean, required
            - `useCompanyDefaultLogo` boolean, required
            - `useCompanyDefaultContactInfo` boolean, required
            - `showTeamSection` boolean, required
            - `showServicesSection` boolean, required
            - `showCompanyDetails` boolean, required
            - `showContactInfo` boolean, required
            - `emailAddress` string
            - `phone` string
            - `website` string
            - `address` string
            - `privacyUrl` string
            - `imprintUrl` string
            - `emailSenderName` string: Email sender name. Only name part of sender string without email.
            - `emailSenderAddress` string: Email sender address. Only email part of sender string. Only active if custom smtp is active. Otherwise this is ignored.
            - `enableCustomLegalText` 'Enable' | 'Disable' | 'Inherit', required: Enable/disable custom legal text
            - `customLegalText` string: Custom legal text HTML, shown above booking button if enabled
            - `reviewSettings` WorkspaceReviewSettings
              - …
            - `company` Company
              - …
            - `companyId` string, required
            - `users` User[]
              - …
            - `adminUsers` User[]
              - …
            - `analyticsViewers` User[]: Analytics-only viewers of this team. They can see this workspace's analytics (scoped to its members) but get no admin or edit rights — deliberately separate from `adminUsers`, which the meeting-type edit gates key off. Used for the "analytics for employees" role.
              - …
            - `meetingTypes` MeetingType[]
            - `queues` Queue[]
              - …
            - `reminders` Reminder[]
            - `forms` Form[]
          - `scheduledReminders` ScheduledReminder[]
            - `reminder` Reminder (recursive)
            - `appointment` Appointment
              - …
            - `provisionalBooking` ProvisionalBookingPayload
              - …
            - `scheduledEmailIds` string[], required
            - `createdAt` string, date-time, required
            - `updatedAt` string, date-time, required
            - `deletedAt` string, nullable
            - `id` number, required
            - `type` object, required: Whether reminder is scheduled in email state machine or sms state machine (sms state machine is a general one but called sms here for simplicity). At the time of migration all scheduled reminders are email.
            - `reminderId` number, nullable
            - `appointmentId` string, nullable, required
            - `provisionalBookingId` string, nullable, required
            - `estimatedSmsSegments` number, nullable, required: Estimate for the exact personalized SMS queued by this row.
          - `createdAt` string, date-time, required
          - `updatedAt` string, date-time, required
          - `deletedAt` string, nullable
          - `id` number, required
          - `name` string, required
          - `enabled` boolean, required
          - `scope` object, required
          - `triggers` ReminderTrigger[], required
            - `trigger` ReminderTrigger, required (recursive)
            - `id` number, required
            - `triggerTiming` number, required: Time in minutes before or after specified trigger to wait for, before sending the reminder
            - `targetStageId` string, nullable: Optional target stage ID for DEAL_ENTERED_STAGE trigger. When set, the trigger only fires when a deal enters this specific stage.
            - `conditions` object[], nullable: Optional gating conditions for the trigger. Used by inbound WhatsApp triggers and booking-created workflows to match their inputs before firing the action chain. AND across the array; OR within `values`. Null/empty means "no filter".
              - …
            - `reminder` Reminder (recursive)
            - `actions` ReminderAction[], required
              - …
            - `conditionNodes` ReminderCondition[], required: Condition nodes branching this trigger's action chain. Named `conditionNodes` (not `conditions`) because the legacy jsonb column above already owns that name for trigger-level gating filters.
              - …
          - `companyId` string, required
          - `workspaceId` string
          - `userId` string: Maybe shouldnt be nullable
        - `locations` string[], required
        - `bookingFrequencies` HostBookingFrequency[]: @todo this doesn't need to be OneToMany and maybe not even a relation (unless different frequencies per user for a queue are needed)
          - `perDay` number: Maximum bookings allowed per day
          - `perWeek` number: Maximum bookings allowed per week
          - `perMonth` number: Maximum bookings allowed per month
          - `perYear` number: Maximum bookings allowed per year
        - `createdAt` string, date-time, required
        - `updatedAt` string, date-time, required
        - `deletedAt` string, nullable
        - `connectGuestJoinMinutesBeforeStart` number, nullable: Guest may enter this many minutes before a scheduled Connect call.
        - `connectGuestJoinMinutesAfterEnd` number, nullable: Guest may enter until this many minutes after a scheduled Connect call.
        - `timeFormat` '12' | '24', required
        - `useHostAvailability` boolean, required
        - `meetingTypes` MeetingType[]
        - `id` string, required
        - `crmOptions` MeetingCRMOptions, required
          - `hubspotContactSync` boolean, required
          - `hubspotContactStage` string, required
          - `hubspotCompanySync` boolean, required
          - `hubspotCompanyStage` string, required
          - `hubspotCompanyMatchingField` string, required
          - `hubspotDealSync` boolean, required
          - `hubspotDealStage` string, required
          - `hubspotPipelineId` string, required
          - `pipedriveDealSync` boolean, required
          - `pipedriveContactSync` boolean, required
          - `pipedrivePipelineId` number, nullable, required
          - `pipedriveStageId` number, nullable, required
          - `pipedriveUseExistingDeal` boolean, required
          - `closeDealSync` boolean, required
          - `closeContactSync` boolean, required
          - `closePipelineId` object, nullable, required
          - `closeStatusId` object, nullable, required
          - `closeUseExistingDeal` boolean, required
          - `centralStationContactSync` boolean, required
          - `centralStationDealSync` boolean, required
          - `centralStationPipelineId` number, nullable, required
          - `centralStationStageId` number, nullable, required
          - `linkandoSyncEnabled` boolean, required
          - `linkandoPlaybookId` number, nullable, required
          - `linkandoTemplateId` number, nullable, required
          - `evalancheEnabled` boolean, required
          - `klicktippEnabled` boolean, required
          - `getResponseEnabled` boolean, required
          - `getResponseCampaignId` string, nullable, required
          - `brevoEnabled` boolean, required
          - `sevdeskEnabled` boolean, required
          - `sevdeskCategoryId` number, nullable, required
          - `lexwareEnabled` boolean, required
          - `professionalWorksEnabled` boolean, required
          - `abAgentaEnabled` boolean, required
          - `smartWeContactSync` boolean, required
          - `smartWeCompanySync` boolean, required
          - `smartWeDealSync` boolean, required
          - `smartWeDealStage` string, required
          - `salesforceSyncEnabled` boolean, required
          - `salesforceCaseSync` boolean, required
          - `salesforceLeadSync` boolean, required
          - `salesforceOpportunitySync` boolean, required
          - `salesforceLeadStatus` string, required
          - `salesforceCaseStatus` string, required
          - `salesforceOpportunityStage` string, required
          - `salesforceDefaultObjectType` string, required
          - `internalCrmPipelineId` object, nullable, required
          - `internalCrmStageId` object, nullable, required
          - `crmOptInFieldName` object, nullable, required
        - `ics` IcsInfo, required
          - `title` LocalisedContent, required
            - `en` string, required
            - `de` string
            - `fr` string
            - `es` string
            - `no` string
            - `it` string
            - `nl` string
            - `da` string
            - `pl` string
            - `se` string
            - `tr` string
          - `description` LocalisedContent, required
            - `en` string, required
            - `de` string
            - `fr` string
            - `es` string
            - `no` string
            - `it` string
            - `nl` string
            - `da` string
            - `pl` string
            - `se` string
            - `tr` string
          - `location` LocalisedContent, required
            - `en` string, required
            - `de` string
            - `fr` string
            - `es` string
            - `no` string
            - `it` string
            - `nl` string
            - `da` string
            - `pl` string
            - `se` string
            - `tr` string
          - `requireGuestConfirmation` boolean
        - `daysIntoFuture` DaysIntoFutureSetting, required
          - `mode` string, required
          - `bookingLimit` number
          - `countMode` string
          - `rangeMin` string, date-time
          - `rangeMax` string, date-time
        - `enableCalendarInviteNotification` boolean, required: New notification setting - use calendar invites instead of email notifications. When this option is enabled, booking confirmation notification and cancellation notification are handled by calendar connection. A google/outlook connection is required. It will be used to create calendar invite with notification. All meeting types pre-migration use email notifications. Introduced in order to mitigate duplicate invites, cancellation handling in calendar and overall improve both host and attendee experience.
        - `useSchedule` boolean, required: Override individual host's availability If true, availability selected for that meeting type will be used as common availability for all hosts. Move to meetingOptions?
        - `useCompanyLogo` boolean, required: Move to meetingOptions?
        - `useTeamLogo` boolean, required: Show team logo instead of company logo (for queue/round-robin meeting types)
        - `useCustomInvite` boolean, required: Move to meetingOptions?
        - `disableActionButtons` boolean, required: Move to meetingOptions?
        - `showConfetti` boolean, required: Whether to show confetti animation on the confirmation page
        - `enableWithdrawalButton` boolean, required: Show the EU/German withdrawal button on the booking confirmation page (§ 356a BGB, from 19.06.2026)
        - `useCustomForm` boolean, required
        - `formId` string
        - `inCompanyPage` boolean, required
        - `formFirst` boolean, required: Move to meetingOptions?
        - `communicationSettings` CommunicationSettings
          - `attendeeMeetingConfirmationStatus` 'useCompanyTemplate' | 'useMeetingTypeTemplate' | 'disabled', required: @todo migrate to boolean, only disabled does something
          - `attendeeMeetingConfirmation` EmailTemplate, required
            - `category` 'bookingConfirmed' | 'bookingCanceled' | 'bookingRescheduled' | 'other', required
            - `content` EmailTemplateContent[], required
              - …
            - `createdAt` string, date-time, required
            - `updatedAt` string, date-time, required
            - `deletedAt` string, date-time, nullable
            - `reminderChannel` 'email' | 'sms' | 'whatsapp', required: Channel that the message is intended for. There are different requirements for each channel. For example, "sms" has a shorter character limit.
            - `id` string, required
            - `name` string, required
            - `reminderActions` ReminderAction[]
              - …
            - `permament` boolean, required
            - `companyId` string
          - `hostMeetingConfirmationStatus` 'useCompanyTemplate' | 'useMeetingTypeTemplate' | 'disabled', required: @todo migrate to boolean, only disabled does something
          - `hostMeetingConfirmation` EmailTemplate, required
            - `category` 'bookingConfirmed' | 'bookingCanceled' | 'bookingRescheduled' | 'other', required
            - `content` EmailTemplateContent[], required
              - …
            - `createdAt` string, date-time, required
            - `updatedAt` string, date-time, required
            - `deletedAt` string, date-time, nullable
            - `reminderChannel` 'email' | 'sms' | 'whatsapp', required: Channel that the message is intended for. There are different requirements for each channel. For example, "sms" has a shorter character limit.
            - `id` string, required
            - `name` string, required
            - `reminderActions` ReminderAction[]
              - …
            - `permament` boolean, required
            - `companyId` string
          - `attendeeMeetingCancelledStatus` 'useCompanyTemplate' | 'useMeetingTypeTemplate' | 'disabled', required: @todo migrate to boolean, only disabled does something
          - `attendeeMeetingCancelled` EmailTemplate, required
            - `category` 'bookingConfirmed' | 'bookingCanceled' | 'bookingRescheduled' | 'other', required
            - `content` EmailTemplateContent[], required
              - …
            - `createdAt` string, date-time, required
            - `updatedAt` string, date-time, required
            - `deletedAt` string, date-time, nullable
            - `reminderChannel` 'email' | 'sms' | 'whatsapp', required: Channel that the message is intended for. There are different requirements for each channel. For example, "sms" has a shorter character limit.
            - `id` string, required
            - `name` string, required
            - `reminderActions` ReminderAction[]
              - …
            - `permament` boolean, required
            - `companyId` string
          - `hostMeetingCancelledStatus` 'useCompanyTemplate' | 'useMeetingTypeTemplate' | 'disabled', required: @todo migrate to boolean, only disabled does something
          - `hostMeetingCancelled` EmailTemplate, required
            - `category` 'bookingConfirmed' | 'bookingCanceled' | 'bookingRescheduled' | 'other', required
            - `content` EmailTemplateContent[], required
              - …
            - `createdAt` string, date-time, required
            - `updatedAt` string, date-time, required
            - `deletedAt` string, date-time, nullable
            - `reminderChannel` 'email' | 'sms' | 'whatsapp', required: Channel that the message is intended for. There are different requirements for each channel. For example, "sms" has a shorter character limit.
            - `id` string, required
            - `name` string, required
            - `reminderActions` ReminderAction[]
              - …
            - `permament` boolean, required
            - `companyId` string
          - `attendeeMeetingRescheduledStatus` 'useCompanyTemplate' | 'useMeetingTypeTemplate' | 'disabled', required: @todo migrate to boolean, only disabled does something
          - `attendeeMeetingRescheduled` EmailTemplate, required
            - `category` 'bookingConfirmed' | 'bookingCanceled' | 'bookingRescheduled' | 'other', required
            - `content` EmailTemplateContent[], required
              - …
            - `createdAt` string, date-time, required
            - `updatedAt` string, date-time, required
            - `deletedAt` string, date-time, nullable
            - `reminderChannel` 'email' | 'sms' | 'whatsapp', required: Channel that the message is intended for. There are different requirements for each channel. For example, "sms" has a shorter character limit.
            - `id` string, required
            - `name` string, required
            - `reminderActions` ReminderAction[]
              - …
            - `permament` boolean, required
            - `companyId` string
          - `hostMeetingRescheduledStatus` 'useCompanyTemplate' | 'useMeetingTypeTemplate' | 'disabled', required: @todo migrate to boolean, only disabled does something
          - `hostMeetingRescheduled` EmailTemplate, required
            - `category` 'bookingConfirmed' | 'bookingCanceled' | 'bookingRescheduled' | 'other', required
            - `content` EmailTemplateContent[], required
              - …
            - `createdAt` string, date-time, required
            - `updatedAt` string, date-time, required
            - `deletedAt` string, date-time, nullable
            - `reminderChannel` 'email' | 'sms' | 'whatsapp', required: Channel that the message is intended for. There are different requirements for each channel. For example, "sms" has a shorter character limit.
            - `id` string, required
            - `name` string, required
            - `reminderActions` ReminderAction[]
              - …
            - `permament` boolean, required
            - `companyId` string
          - `bringalongMeetingConfirmationStatus` 'useCompanyTemplate' | 'useMeetingTypeTemplate' | 'disabled', required: @todo migrate to boolean, only disabled does something
          - `bringalongMeetingConfirmation` EmailTemplate, required
            - `category` 'bookingConfirmed' | 'bookingCanceled' | 'bookingRescheduled' | 'other', required
            - `content` EmailTemplateContent[], required
              - …
            - `createdAt` string, date-time, required
            - `updatedAt` string, date-time, required
            - `deletedAt` string, date-time, nullable
            - `reminderChannel` 'email' | 'sms' | 'whatsapp', required: Channel that the message is intended for. There are different requirements for each channel. For example, "sms" has a shorter character limit.
            - `id` string, required
            - `name` string, required
            - `reminderActions` ReminderAction[]
              - …
            - `permament` boolean, required
            - `companyId` string
          - `hostMeetingReassignedStatus` 'useCompanyTemplate' | 'useMeetingTypeTemplate' | 'disabled', required: @todo migrate to boolean, only disabled does something
          - `hostMeetingReassigned` EmailTemplate, required
            - `category` 'bookingConfirmed' | 'bookingCanceled' | 'bookingRescheduled' | 'other', required
            - `content` EmailTemplateContent[], required
              - …
            - `createdAt` string, date-time, required
            - `updatedAt` string, date-time, required
            - `deletedAt` string, date-time, nullable
            - `reminderChannel` 'email' | 'sms' | 'whatsapp', required: Channel that the message is intended for. There are different requirements for each channel. For example, "sms" has a shorter character limit.
            - `id` string, required
            - `name` string, required
            - `reminderActions` ReminderAction[]
              - …
            - `permament` boolean, required
            - `companyId` string
          - `attendeeMeetingHostChangedStatus` 'useCompanyTemplate' | 'useMeetingTypeTemplate' | 'disabled', required: @todo migrate to boolean, only disabled does something
          - `attendeeMeetingHostChanged` EmailTemplate, required
            - `category` 'bookingConfirmed' | 'bookingCanceled' | 'bookingRescheduled' | 'other', required
            - `content` EmailTemplateContent[], required
              - …
            - `createdAt` string, date-time, required
            - `updatedAt` string, date-time, required
            - `deletedAt` string, date-time, nullable
            - `reminderChannel` 'email' | 'sms' | 'whatsapp', required: Channel that the message is intended for. There are different requirements for each channel. For example, "sms" has a shorter character limit.
            - `id` string, required
            - `name` string, required
            - `reminderActions` ReminderAction[]
              - …
            - `permament` boolean, required
            - `companyId` string
          - `attendeeMeetingCancelRequestStatus` 'useCompanyTemplate' | 'useMeetingTypeTemplate' | 'disabled', required: @todo migrate to boolean, only disabled does something
          - `attendeeMeetingCancelRequest` EmailTemplate, required
            - `category` 'bookingConfirmed' | 'bookingCanceled' | 'bookingRescheduled' | 'other', required
            - `content` EmailTemplateContent[], required
              - …
            - `createdAt` string, date-time, required
            - `updatedAt` string, date-time, required
            - `deletedAt` string, date-time, nullable
            - `reminderChannel` 'email' | 'sms' | 'whatsapp', required: Channel that the message is intended for. There are different requirements for each channel. For example, "sms" has a shorter character limit.
            - `id` string, required
            - `name` string, required
            - `reminderActions` ReminderAction[]
              - …
            - `permament` boolean, required
            - `companyId` string
          - `attendeeMeetingRescheduleRequestStatus` 'useCompanyTemplate' | 'useMeetingTypeTemplate' | 'disabled', required: @todo migrate to boolean, only disabled does something
          - `attendeeMeetingRescheduleRequest` EmailTemplate, required
            - `category` 'bookingConfirmed' | 'bookingCanceled' | 'bookingRescheduled' | 'other', required
            - `content` EmailTemplateContent[], required
              - …
            - `createdAt` string, date-time, required
            - `updatedAt` string, date-time, required
            - `deletedAt` string, date-time, nullable
            - `reminderChannel` 'email' | 'sms' | 'whatsapp', required: Channel that the message is intended for. There are different requirements for each channel. For example, "sms" has a shorter character limit.
            - `id` string, required
            - `name` string, required
            - `reminderActions` ReminderAction[]
              - …
            - `permament` boolean, required
            - `companyId` string
          - `confirmationAttachmentConfig` object[]
            - `type` 'library' | 'form_field'
            - `fileAssetId` string, nullable
            - `dataFieldName` string, nullable
            - `filename` string, nullable
          - `reminderTemplate` EmailTemplate, required
            - `category` 'bookingConfirmed' | 'bookingCanceled' | 'bookingRescheduled' | 'other', required
            - `content` EmailTemplateContent[], required
              - …
            - `createdAt` string, date-time, required
            - `updatedAt` string, date-time, required
            - `deletedAt` string, date-time, nullable
            - `reminderChannel` 'email' | 'sms' | 'whatsapp', required: Channel that the message is intended for. There are different requirements for each channel. For example, "sms" has a shorter character limit.
            - `id` string, required
            - `name` string, required
            - `reminderActions` ReminderAction[]
              - …
            - `permament` boolean, required
            - `companyId` string
          - `reminderRecipient` 'guest-all' | 'host-all' | 'everyone' | 'company-user' | 'custom-email' | 'booked-by' | 'form-recipient' | 'form-sender' | 'deal-owner' | 'deal-primary-contact' | 'deal-contacts' | 'lead-contact', required
          - `followupRecipient` 'guest-all' | 'host-all' | 'everyone' | 'company-user' | 'custom-email' | 'booked-by' | 'form-recipient' | 'form-sender' | 'deal-owner' | 'deal-primary-contact' | 'deal-contacts' | 'lead-contact', required
          - `id` number, required
          - `meetingType` MeetingType (recursive)
          - `meetingTypeTemplate` MeetingTypeTemplate (recursive)
          - `confirmation` EmailTemplateContent[], required
            - `locale` string, required
            - `title` string, required
            - `content` string, required
            - `document` EmailTemplateDocumentV1
              - …
          - `reminder` MeetingTypeNotificationConfig, required
            - `enable` boolean, required
            - `timing` number, required
            - `content` EmailTemplateContent, required
              - …
            - `attachmentConfig` object[]
              - …
          - `followup` MeetingTypeNotificationConfig, required
            - `enable` boolean, required
            - `timing` number, required
            - `content` EmailTemplateContent, required
              - …
            - `attachmentConfig` object[]
              - …
          - `sms` MeetingTypeNotificationConfig, required
            - `enable` boolean, required
            - `timing` number, required
            - `content` EmailTemplateContent, required
              - …
            - `attachmentConfig` object[]
              - …
        - `communicationSettingsId` number, nullable, required
        - `availabilityId` string
        - `companyId` string, required: Not null
        - `reminderIds` string[], required
        - `createdBy` User
          - `zoomEncryptionType` object: Zoom meeting encryption type preference. - 'enhanced_encryption': Allows web browser joining (recommended) - 'e2ee': End-to-end encryption, requires Zoom client - null: Use Zoom account default settings
          - `timezone` string, required: User timezone affects times shown in notifications, UI etc. It is set to the chosen timezone after onboarding is completed. `utc` timezone may suggest that onboarding was not completed yet or for the user.
          - `language` 'en' | 'de' | 'fr' | 'es' | 'no' | 'nl' | 'it' | 'pl' | 'se' | 'tr' | 'da', required
          - `seatTier` 'basic' | 'essentials' | 'growth' | 'teams' | 'light' | 'suite' | 'premium' | 'enterprise': The tier this seat is billed and entitled at, when it is lower than the company's own. `null` — the overwhelming majority, and every user that existed before this was added — means the seat simply follows the company tier, which is how billing worked when there was only one tier per account. A value here pins the seat lower: a Suite or Premium account should not have to buy Suite for a colleague who only books meetings. Only ever below the account tier. Nothing here can raise a seat above what the company pays for, because entitlements are the intersection of the two (see `mergeSeatAccess`).
          - `viewerScope` 'company' | 'teams': How much a {@link UserType.VIEWER} may read. Ignored for every other type. `company` sees the whole account, `teams` only the members of the workspaces they are assigned to via `analyticsViewerWorkspaces`. Explicit rather than inferred from "has any assigned workspace": an admin who creates a team-scoped viewer and has not picked the teams yet would otherwise be handing out company-wide access by omission. A `teams` viewer with nothing assigned sees nothing, which is the safe end of that mistake.
          - `notetakerEnabled` boolean, required: Send the notetaker to this host's meetings unless something more specific says otherwise. The bottom of the chain — a meeting type or a single meeting can still override it in either direction. Defaults to false and must stay that way: the bot is a visible third participant recording people who did not book the call, and Germany is a two-party-consent country. Recording is something a host turns on.
          - `notetakerRecordExternal` boolean, required: Whether the notetaker also covers meetings read off this host's connected calendars, or only meetergo bookings. On by default, which keeps today's behaviour: switching the notetaker on has always meant the whole calendar. Off narrows `notetakerEnabled` to bookings — and stops the calendar mirror storing this host's external meetings at all, so the narrower choice is also the more private one. Meaningless while `notetakerEnabled` is false.
          - `notetakerLanguage` 'en' | 'de' | 'fr' | 'es' | 'no' | 'nl' | 'it' | 'pl' | 'se' | 'tr' | 'da'
          - `notetakerEmailTranscript` boolean, required: Mail this host the recording when it is ready. On by default, which is the opposite of `notetakerEnabled` above and for a different question. That switch decides whether a bot joins somebody else's call, so its absence has to read as no. This one decides whether a host gets their own recording in their own inbox after they already asked for it, and a host who switched recording on and hears nothing afterwards assumes it did not work. The mail goes to the host alone and carries the summary and a link, never the transcript itself or a copy to the other people on the call: those are decisions about somebody else's words, and they belong to a sharing action rather than to a default.
          - `notetakerAdvanceNotice` boolean, required: Email attendees ahead of this host's recorded meetings. On by default: the advance notice is the disclosure attendees get when nothing else reaches them, so silence is something a host opts into, not something that happens to them. Off only quiets the dedicated advance email — the confirmation footer, the calendar sentence and the notice in the meeting itself are not this setting's to remove.
          - `preCallBriefEmail` boolean, nullable: Email me the pre-call brief before each of my meetings. Three states, not two. Null means the host has never answered, so the workspace's own default decides; true and false are the host overriding it either way. Without the null an admin switching the workspace on could never reach anybody, because every existing row would already read as a deliberate "no".
          - `meetingTypes` MeetingType[]: Meeting types that user owns
          - `meetingTypeTemplates` MeetingTypeTemplate[]
          - `availabilities` Availability[]: Availabilities that user owns
            - `timezone` string, required
            - `id` string, required
            - `name` string, required
            - `schedule` WeeklySchedule, required
              - …
            - `useExplicitAvailability` boolean, required: When enabled, calendar events with the specified title are offered as bookable slots IN ADDITION to the weekly schedule (they behave like positive exceptions, see `UserAvailabilityService`). The weekly grid stays editable. Not to be confused with `scheduleSource`, which decides where the grid itself comes from.
            - `scheduleSource` object, required: Where the weekly schedule comes from. `manual` is the user typing it; `outlook` means it is read from the mailbox's Outlook working hours and the editor refuses direct schedule/timezone edits until switched back. Never read during slot calculation: to the availability engine an Outlook-sourced schedule is just a schedule.
            - `scheduleSourceConnectionId` string, nullable
            - `scheduleSyncedAt` string, date-time, nullable: Last time Outlook was consulted for this schedule (success or not).
            - `scheduleSyncError` object, nullable: Why the last consultation of Outlook could not update the schedule.
            - `explicitAvailabilityEventTitle` string, nullable: The calendar event title to look for when useExplicitAvailability is enabled. Events with this title will be treated as available booking slots.
            - `userId` string, required
            - `availabilityExceptions` AvailabilityException[]
              - …
            - `createdAt` string, date-time, required
            - `updatedAt` string, date-time, required
            - `deletedAt` string, date-time, nullable
            - `meetingType` MeetingType (recursive)
            - `meetingTypeTemplate` MeetingTypeTemplate (recursive)
            - `resourceChannels` ResourceChannel[], required
              - …
          - `appointments` Appointment[]
            - `start` string, required
            - `end` string, required
            - `isCancelled` boolean, required: Determines whether appointment was cancelled
            - `spots` string, nullable: Per-appointment capacity for group bookings. Copied from meetingType.spots at creation time. Can be reduced to limit new bookees without cancelling existing attendees. When null, falls back to meetingType.spots. TODO: Ideally spots should be part of MeetingInfo (alongside groupBooking) so it gets copied naturally via the meetingInfo spread. Kept as top-level for now to avoid refactoring the existing meetingType.spots column + V4 API DTOs.
            - `rescheduledAt` string, date-time: Timestamp when appointment was rescheduled. Null if appointment is not rescheduled.
            - `rescheduledBy` string, nullable: Email address of the attendee, host, or operator who last rescheduled it.
            - `rescheduleCount` number, required: Number of times this appointment has been rescheduled. Used as the ICS SEQUENCE number so calendar clients recognize updates.
            - `bookedByUserId` string, nullable
            - `emailDeliveryIssues` object[], nullable: Mails the provider could not deliver for this appointment, one entry per address and kind. Written from AhaSend bounce webhooks so a typo in the attendee's address is visible before the appointment is missed.
              - …
            - `location` string
            - `scheduledReminders` ScheduledReminder[]
              - …
            - `createdAt` string, date-time, required
            - `updatedAt` string, date-time, required
            - `deletedAt` string, nullable
            - `couponCode` string: Coupon code applied to this booking's payment (null if no coupon used)
            - `couponDiscountAmount` number: Discount amount applied via coupon (in the payment currency)
            - `note` string
            - `transcription` string, nullable: Full meeting transcription in markdown format
            - `summary` string, nullable: AI-generated summary of the meeting in markdown format
            - `actualStartAt` string, date-time, nullable: When the conversation actually ran, as whatever was in the call witnessed it: the first captured word for a recording, the first person in the room for a Connect call. `start` and `end` say when the meeting was booked for; these say what happened. Null until something that was there reports, and permanently null for a call nothing attended.
            - `actualEndAt` string, date-time, nullable
            - `attendanceCheckedAt` string, date-time, nullable: When something that could have witnessed the call finished looking. What tells "nobody came" apart from "nothing was watching": a past booking with this set and no `actualStartAt` is one a notetaker or the Connect room waited for and nobody joined, which the dashboard offers as a no-show to confirm. Never marks the no-show itself — that reaches the contact and their automations, and stays a person's decision.
            - `miraBrief` string, nullable: Mira's pre-meeting brief: who is coming, what was discussed last time, what is open. Written once on first request and kept, so opening the booking twice does not pay for the model twice.
            - `miraBriefAt` string, date-time, nullable
            - `occurrenceNumber` number, nullable: Position of this appointment within the recurring series (1-based). Null for non-recurring appointments.
            - `isBundleBooking` boolean, required
            - `id` string, required
            - `secret` string, required
            - `ics` string, required
            - `meetingInfo` MeetingInfo, required
              - …
            - `hostingInfo` HostingInfo, required
              - …
            - `cancel` BookingActionInfo, required
              - …
            - `crmOptions` MeetingCRMOptions, required
              - …
            - `bookedBy` User (recursive)
            - `utmSource` string, nullable
            - `utmMedium` string, nullable
            - `utmCampaign` string, nullable
            - `utmContent` string, nullable
            - `utmTerm` string, nullable
            - `referrerUrl` string, nullable
            - `sourceChannel` object, nullable
            - `formRecipientId` string, nullable: `FormRecipient.id` when a personal form link routed this booking. Without it nothing connects an appointment to the person a printed link was minted for, so a returning recipient could only be offered a second calendar. With it they are shown the booking they already hold. Plain uuid, no FK: an appointment is a real commitment and must survive the deletion of the form that routed it.
            - `attendees` Attendee[]: `cascade: true` exists to INSERT attendees together with a new appointment. Never `save()` an EXISTING appointment with a loaded `attendees` array: the cascade diffs against a stale snapshot and orphan-nullifies attendees linked concurrently (group-booking joins). Link/unlink attendee rows individually instead.
              - …
            - `attendeeIds` string[], required
            - `roundRobinEntries` RoundRobinEntry[]
              - …
            - `meetingType` MeetingType (recursive)
            - `meetingTypeId` string, required: @todo should not be nullable, but prod has some null values also recently
            - `bookingBlockId` string, nullable, required: The booking block this appointment was booked into, set only when the invitee arrived through that block's customer link. It is the sole answer to "which bookings are in this reserved day", and deleting the day cancels exactly these. Matching on host and time instead would sweep in ordinary meetings that merely overlap. Deliberately no foreign key: the row must outlive the block it names.
            - `hostIds` string[], required
            - `companyId` string, required
            - `resolvableErrors` AppointmentResolvableError[]
              - …
            - `bufferReservations` BufferReservation[]
              - …
            - `paymentId` string
            - `recapSharedAt` string, date-time, nullable: When the host turned this meeting's recap into a shareable link, or null while it is private. A timestamp rather than a boolean because "when did we start sharing this" is the question asked after a recap turns up somewhere unexpected. Sharing is off until the host asks for it: a transcript is the most sensitive thing the product stores, and a link that exists by default is a link that leaks by default.
            - `notetakerNoticeEmailedAt` string, date-time, nullable: When the invitees were told by email that this meeting will be recorded. Stamped by the confirmation email when its footer carried the recording disclosure, and otherwise by the advance-notice sweep when it sends the dedicated notice 24 hours ahead. One column, two writers, one rule: a null here on a meeting that will be recorded is a notice still owed.
            - `preCallBriefWarmedAt` string, date-time, nullable: When the structured Connect brief was generated ahead of the call. Bookkeeping for the warming sweep, not a third brief: the text itself lives in the cache the in-call panel already reads, and this is only how the sweep knows it has done a booking. Null means the panel would still pay for the model on first open, which is the wait this removes.
            - `recurringSeries` RecurringSeries
              - …
            - `recurringSeriesId` string, nullable
            - `bundle` MeetingTypeBundle
              - …
            - `bundleId` string, nullable
            - `bundleItems` AppointmentBundleItem[]: Bundle items for this appointment (details of each meeting type in the bundle). Only populated for bundle bookings.
              - …
          - `mainHostAppointment` Appointment[]
            - `start` string, required
            - `end` string, required
            - `isCancelled` boolean, required: Determines whether appointment was cancelled
            - `spots` string, nullable: Per-appointment capacity for group bookings. Copied from meetingType.spots at creation time. Can be reduced to limit new bookees without cancelling existing attendees. When null, falls back to meetingType.spots. TODO: Ideally spots should be part of MeetingInfo (alongside groupBooking) so it gets copied naturally via the meetingInfo spread. Kept as top-level for now to avoid refactoring the existing meetingType.spots column + V4 API DTOs.
            - `rescheduledAt` string, date-time: Timestamp when appointment was rescheduled. Null if appointment is not rescheduled.
            - `rescheduledBy` string, nullable: Email address of the attendee, host, or operator who last rescheduled it.
            - `rescheduleCount` number, required: Number of times this appointment has been rescheduled. Used as the ICS SEQUENCE number so calendar clients recognize updates.
            - `bookedByUserId` string, nullable
            - `emailDeliveryIssues` object[], nullable: Mails the provider could not deliver for this appointment, one entry per address and kind. Written from AhaSend bounce webhooks so a typo in the attendee's address is visible before the appointment is missed.
              - …
            - `location` string
            - `scheduledReminders` ScheduledReminder[]
              - …
            - `createdAt` string, date-time, required
            - `updatedAt` string, date-time, required
            - `deletedAt` string, nullable
            - `couponCode` string: Coupon code applied to this booking's payment (null if no coupon used)
            - `couponDiscountAmount` number: Discount amount applied via coupon (in the payment currency)
            - `note` string
            - `transcription` string, nullable: Full meeting transcription in markdown format
            - `summary` string, nullable: AI-generated summary of the meeting in markdown format
            - `actualStartAt` string, date-time, nullable: When the conversation actually ran, as whatever was in the call witnessed it: the first captured word for a recording, the first person in the room for a Connect call. `start` and `end` say when the meeting was booked for; these say what happened. Null until something that was there reports, and permanently null for a call nothing attended.
            - `actualEndAt` string, date-time, nullable
            - `attendanceCheckedAt` string, date-time, nullable: When something that could have witnessed the call finished looking. What tells "nobody came" apart from "nothing was watching": a past booking with this set and no `actualStartAt` is one a notetaker or the Connect room waited for and nobody joined, which the dashboard offers as a no-show to confirm. Never marks the no-show itself — that reaches the contact and their automations, and stays a person's decision.
            - `miraBrief` string, nullable: Mira's pre-meeting brief: who is coming, what was discussed last time, what is open. Written once on first request and kept, so opening the booking twice does not pay for the model twice.
            - `miraBriefAt` string, date-time, nullable
            - `occurrenceNumber` number, nullable: Position of this appointment within the recurring series (1-based). Null for non-recurring appointments.
            - `isBundleBooking` boolean, required
            - `id` string, required
            - `secret` string, required
            - `ics` string, required
            - `meetingInfo` MeetingInfo, required
              - …
            - `hostingInfo` HostingInfo, required
              - …
            - `cancel` BookingActionInfo, required
              - …
            - `crmOptions` MeetingCRMOptions, required
              - …
            - `bookedBy` User (recursive)
            - `utmSource` string, nullable
            - `utmMedium` string, nullable
            - `utmCampaign` string, nullable
            - `utmContent` string, nullable
            - `utmTerm` string, nullable
            - `referrerUrl` string, nullable
            - `sourceChannel` object, nullable
            - `formRecipientId` string, nullable: `FormRecipient.id` when a personal form link routed this booking. Without it nothing connects an appointment to the person a printed link was minted for, so a returning recipient could only be offered a second calendar. With it they are shown the booking they already hold. Plain uuid, no FK: an appointment is a real commitment and must survive the deletion of the form that routed it.
            - `attendees` Attendee[]: `cascade: true` exists to INSERT attendees together with a new appointment. Never `save()` an EXISTING appointment with a loaded `attendees` array: the cascade diffs against a stale snapshot and orphan-nullifies attendees linked concurrently (group-booking joins). Link/unlink attendee rows individually instead.
              - …
            - `attendeeIds` string[], required
            - `roundRobinEntries` RoundRobinEntry[]
              - …
            - `meetingType` MeetingType (recursive)
            - `meetingTypeId` string, required: @todo should not be nullable, but prod has some null values also recently
            - `bookingBlockId` string, nullable, required: The booking block this appointment was booked into, set only when the invitee arrived through that block's customer link. It is the sole answer to "which bookings are in this reserved day", and deleting the day cancels exactly these. Matching on host and time instead would sweep in ordinary meetings that merely overlap. Deliberately no foreign key: the row must outlive the block it names.
            - `hostIds` string[], required
            - `companyId` string, required
            - `resolvableErrors` AppointmentResolvableError[]
              - …
            - `bufferReservations` BufferReservation[]
              - …
            - `paymentId` string
            - `recapSharedAt` string, date-time, nullable: When the host turned this meeting's recap into a shareable link, or null while it is private. A timestamp rather than a boolean because "when did we start sharing this" is the question asked after a recap turns up somewhere unexpected. Sharing is off until the host asks for it: a transcript is the most sensitive thing the product stores, and a link that exists by default is a link that leaks by default.
            - `notetakerNoticeEmailedAt` string, date-time, nullable: When the invitees were told by email that this meeting will be recorded. Stamped by the confirmation email when its footer carried the recording disclosure, and otherwise by the advance-notice sweep when it sends the dedicated notice 24 hours ahead. One column, two writers, one rule: a null here on a meeting that will be recorded is a notice still owed.
            - `preCallBriefWarmedAt` string, date-time, nullable: When the structured Connect brief was generated ahead of the call. Bookkeeping for the warming sweep, not a third brief: the text itself lives in the cache the in-call panel already reads, and this is only how the sweep knows it has done a booking. Null means the panel would still pay for the model on first open, which is the wait this removes.
            - `recurringSeries` RecurringSeries
              - …
            - `recurringSeriesId` string, nullable
            - `bundle` MeetingTypeBundle
              - …
            - `bundleId` string, nullable
            - `bundleItems` AppointmentBundleItem[]: Bundle items for this appointment (details of each meeting type in the bundle). Only populated for bundle bookings.
              - …
          - `workspaces` Workspace[]
            - `connectWaitingRoom` ConnectWaitingRoomSettings
              - …
            - `integrationPermissions` object: Workspace-level integration permission overrides. Can override company settings (allow or deny specific integrations).
            - `customBookingCSS` string: Custom CSS for booking and confirmation pages. When set, this overrides the company-level customBookingCSS for this workspace's meeting types. Applied to both booking pages and confirmation/reschedule/cancel pages.
            - `createdAt` string, date-time, required
            - `updatedAt` string, date-time, required
            - `deletedAt` string, nullable
            - `id` string, required
            - `name` string, required
            - `slug` string, required: Slug must be unique
            - `picture` string: Full url to workspace picture hosted statically
            - `description` string
            - `primaryColor` string
            - `logoUrl` string
            - `language` 'en' | 'de' | 'fr' | 'es' | 'no' | 'nl' | 'it' | 'pl' | 'se' | 'tr' | 'da'
            - `salesforceStudioId` string: Salesforce Studio__c Record ID Used for Küche&Co integration to link Cases to Studios
            - `useCompanyDefaultColor` boolean, required
            - `useCompanyDefaultLanguage` boolean, required
            - `useCompanyDefaultLogo` boolean, required
            - `useCompanyDefaultContactInfo` boolean, required
            - `showTeamSection` boolean, required
            - `showServicesSection` boolean, required
            - `showCompanyDetails` boolean, required
            - `showContactInfo` boolean, required
            - `emailAddress` string
            - `phone` string
            - `website` string
            - `address` string
            - `privacyUrl` string
            - `imprintUrl` string
            - `emailSenderName` string: Email sender name. Only name part of sender string without email.
            - `emailSenderAddress` string: Email sender address. Only email part of sender string. Only active if custom smtp is active. Otherwise this is ignored.
            - `enableCustomLegalText` 'Enable' | 'Disable' | 'Inherit', required: Enable/disable custom legal text
            - `customLegalText` string: Custom legal text HTML, shown above booking button if enabled
            - `reviewSettings` WorkspaceReviewSettings
              - …
            - `company` Company
              - …
            - `companyId` string, required
            - `users` User[]
            - `adminUsers` User[]
            - `analyticsViewers` User[]: Analytics-only viewers of this team. They can see this workspace's analytics (scoped to its members) but get no admin or edit rights — deliberately separate from `adminUsers`, which the meeting-type edit gates key off. Used for the "analytics for employees" role.
            - `meetingTypes` MeetingType[]
            - `queues` Queue[]
              - …
            - `reminders` Reminder[]
              - …
            - `forms` Form[]
          - `bookingLinkMeetingType` MeetingType (recursive)
          - `calgentRequireApproval` boolean, required: Hold every booking for the host to allow before it reaches the calendar. Off by default: the assistant exists to remove the back and forth, and approval puts a step back in. On for hosts who want the assistant to negotiate but not to commit.
          - `id` string, required: Must be uuid of existing cognito user, i.e. from token `payload.sub`. All values in this row are valid UUIDs, but it is improperly typed as varchar. It should be "uuid". Migrating all values to uuid works without issues, but ALL FKs have to be rewritten as well.
          - `companyId` string, nullable: Always defined as company is now created immediately upon registration. Only undefined when user is initially created. Can refactor to be non nullable but need to refactor RegisterController as well.
          - `company` Company
            - `name` string, required
            - `slug` string, required
            - `description` string, required
            - `logo` string
            - `language` string, required
            - `allowedLanguages` string[]
            - `allowAITranslation` boolean
            - `timezone` string, required: Company timezone acts as default for new users and other presets. It is set after onboarding is completed to the owner's timezone chosen during onboarding. If not set, it defaults to UTC. If timezone is UTC it may suggest that onboarding was not completed.
            - `referralId` string
            - `tier` 'basic' | 'essentials' | 'growth' | 'teams' | 'light' | 'suite' | 'premium' | 'enterprise', required
            - `subscriptionStatus` 'active' | 'past_due' | 'unpaid' | 'canceled' | 'incomplete' | 'incomplete_expired' | 'trialing', required
            - `preferredCurrency` 'USD' | 'EUR': User's preferred currency for billing. If null, detected currency from billing address country is used.
            - `users` string[], required: Comma-seperated IDs of users.
            - `type` 'solo' | 'team', required: Reflects solo/team choice during onboarding but doesn't affect anything else
            - `emailSender` 'custom-smtp' | 'microsoft-smtp': Sender to use for sending emails. Defaults to null which uses the default sender. If a sender is configured the configuration must still be fetched. If there is an error with configuration, fall back to default and notify.
            - `primaryColor` string, required
            - `useBrandStyling` boolean, required
            - `hideMeetergoBranding` boolean, required
            - `businessCardTheme` BusinessCardTheme
              - …
            - `enforceBusinessCardTheme` boolean, required: When true, the company theme overrides every member's own card design.
            - `googleAnalyticsMeasurementId` string, nullable: Google Analytics 4 Measurement ID (e.g., G-XXXXXXXXXX)
            - `gtmContainerId` string, nullable: Google Tag Manager Container ID (e.g., GTM-XXXXXXX)
            - `gtmServerContainerUrl` string, nullable: Custom server-side GTM loader URL (e.g., https://metrics.example.com/gtm.js). When set, the booking page loads the GTM container from this first-party endpoint instead of googletagmanager.com.
            - `matomoUrl` string, nullable: Base URL of the company Matomo instance (e.g. https://stats.example.com). Booking pages load the Matomo tracker from here when a Site ID is also set.
            - `matomoSiteId` string, nullable: Matomo Site ID of the tracked website, as shown in the Matomo UI.
            - `googleActionsCenterEnabled` boolean, required: Enable Reserve with Google integration
            - `googleActionsCenterMeetingTypeIds` string[], nullable: Meeting type IDs for Reserve with Google
            - `connectWaitingRoom` ConnectWaitingRoomSettings
              - …
            - `featureAccess` FeatureAccess, required
              - …
            - `detectedCurrency` 'USD' | 'EUR', required: User's preferred currency for billing. If null, detected currency from billing address country is used.
            - `effectiveCurrency` 'USD' | 'EUR', required: User's preferred currency for billing. If null, detected currency from billing address country is used.
            - `useNoReplyAddress` boolean, required
            - `sendEmailsAsPlainText` boolean, required: When enabled, outgoing emails for this company are sent as plain text instead of HTML. The HTML body is converted to text and replaces the payload; templates and React Email layouts are still rendered first and then stripped. Used by customers whose mail servers/recipients mangle rich HTML or who need accessibility/compliance-grade plain messages.
            - `integrationPermissions` object: Granular per-integration permissions. Controls which integrations are available to company members. Workspace-level overrides can further refine these settings.
            - `outlookConnectionRequirementScopes` OutlookConnectionRequirementScope[], required: Where the "host needs a working Microsoft connection" requirement applies. Empty array = no enforcement. See `OutlookConnectionRequirementScope` for the meaning of each scope. Default empty for backwards compatibility.
            - `outlookConnectionRequirementTypes` OutlookConnectionType[], required: Which Microsoft connection types are accepted as "active" when any scope in `outlookConnectionRequirementScopes` is enabled. A host needs at least one matching active connection. Defaults to both Graph and Exchange Teams.
            - `storageUsedBytes` number, required: Total storage used by this company in bytes. Updated when files are uploaded or deleted.
            - `defaultLandingPage` string, nullable: Company-level setting for the default page users see after login. When null, defaults to /meeting-types.
            - `miraSettings` MiraSettings
              - …
            - `id` string, required
            - `usersRelation` User[]
            - `createdAt` string, date-time, required
            - `updatedAt` string, date-time, required
            - `deletedAt` string, date-time, nullable
            - `owner` string, required
            - `emailDomain` string: Top level domain of email address Only used for team type companies If undefined, public email is used which can be considered as solo user initially
            - `cancelsAt` string, date-time: If subscription is canceled, date is set to cancelation date. Null if not canceled.
            - `stripeCustomerId` string
            - `stripeSubscriptionId` string, nullable
            - `prorationBehaviorCreateProration` boolean, required: How proration is handled in stripe. Default is false, which corresponds to `always_invoice`, which bills subscription changes immediately. If set to true, use `create_prorations`, which bills on the next invoice. Currently this is only set manually for enterprise clients with SLA.
            - `samlIdp` string: Defined if company uses enterprise SSO. This is the identifier passed to cognito. A SAML IDP must be created in cognito. Currently this is only set manually for enterprise clients.
            - `requireMfa` boolean, required: Every member must sign in with a second factor. Enforced through Keycloak required actions (`MfaEnforcementService`): members without an authenticator app or passkey are made to enroll at their next login. Never set on a company with `samlIdp`; their identity provider owns MFA.
            - `billingAddress` CompanyBillingAddress, required
              - …
            - `lifetimePremium` boolean, required
            - `trialEndDate` string
            - `onboardingTrialExtendedAt` string, date-time, nullable, required: Server-owned redemption marker. Shared by all users and onboarding links.
            - `showTrialOverModal` boolean, required
            - `maxUsers` number, required
            - `maxPartners` number, required: Maximum number of partner **users** allowed for this company. NOTE: "Partner users" here are a seat role inside a Company — they don't count toward seat limits and can't access billing or host events. This is NOT the `Reseller` concept (an external organisation that provisions meetergo accounts). See `resellerId` for that relation.
            - `showDataPolicyLink` boolean, required
            - `hideDataPolicyCheckbox` boolean, required
            - `enableWithdrawalFunction` boolean, required: Master switch for the statutory withdrawal function (§ 356a BGB, from 19.06.2026). Publishes the public withdrawal page, the embed widget and the "Vertrag widerrufen" link in the booking pages' legal footer. Which bookings actually offer a withdrawal button is scoped per meeting type via `MeetingType.enableWithdrawalButton`, because only paid B2C distance contracts carry the statutory right.
            - `withdrawalIntroText` string, nullable, required: Replaces the opening sentence of the public withdrawal page. Null keeps the built-in one, which is translated into every booking language; a custom text is shown as typed, in whatever language it was written, the same trade-off `customLegalText` already makes. Exists because the built-in sentence states the statutory 14 days as fact, and a trader who grants longer is then bound by a period their own page contradicts. Validated against {@link findShortenedWithdrawalPeriod} so the escape hatch cannot be used to announce a shorter one.
            - `withdrawalPolicyLink` string, nullable, required: The trader's own Widerrufsbelehrung, linked under the intro text. The alternative to restating the terms on our page: link them where they are already maintained.
            - `dataPolicyLink` string, nullable, required
            - `imprintLink` string, nullable, required
            - `hideEmptyWeekend` boolean, required
            - `useFormalBookingLanguage` boolean, required
            - `allowAttendeeDataDeletion` boolean, required
            - `allowNotetakerRecording` boolean, required: Whether anyone in this workspace may have the notetaker record a meeting. A gate, not a default: it only ever subtracts. An admin closes it and no host, meeting type or single meeting in the workspace can reopen it, which is what makes it usable as the compliance control it exists to be. There is deliberately no "record everything" direction — the bot is a visible third participant recording people who never signed up for meetergo, and Germany is a two-party-consent country, so switching recording *on* stays a decision each host makes for their own calls. Default true because closing it is the exceptional act; the entitlement above it and the host default below it both already start at "no".
            - `preCallBriefEmailDefault` boolean, required: Whether hosts here are emailed their pre-call brief unless they say otherwise. The workspace's answer, which a host can override either way. Default false so no existing workspace starts mailing briefs because a release shipped; an admin turning it on is the deliberate act that starts it.
            - `notetakerBotName` string, nullable: What the notetaker is called in the participant list, or `null` for ours. Identity rather than configuration: the name is the notice everyone on the call who never booked anything actually receives, and on a customer's own call our brand names the wrong company. Null means the platform default, so a workspace that never thought about it still discloses something a participant can check against the list. Validated on the way in ({@link parseBotName}) rather than at dispatch: a name the capture backend refuses would fail minutes before the meeting, with nobody watching.
            - `metadata` CompanyMetaData
              - …
            - `customBookingCSS` string, required
            - `customConfirmationPageCSS` string, required
            - `isSoloFeaturesUnlocked` boolean, required
            - `metaPixelId` string, nullable
            - `tiktokPixelId` string, nullable
            - `usercentricsSettingsId` string, nullable: Usercentrics CMP Settings-ID. Presence = integration connected.
            - `usercentricsConfig` object, nullable: Options for the Usercentrics integration (validated jsonb, see parseUsercentricsConfig).
            - `appointmentDeleteTimer` number, nullable, required: Time in minutes. Default 90 days
            - `forms` Form[]
            - `reminders` Reminder[]
              - …
            - `meetingTypes` MeetingType[]
            - `meetingTypeTemplates` MeetingTypeTemplate[]
            - `appointments` Appointment[]
              - …
            - `emailTemplates` EmailTemplate[]
              - …
            - `workspaces` Workspace[]
              - …
            - `queues` Queue[]
              - …
            - `dataFields` DataField[]
              - …
            - `emailTemplateSelection` EmailTemplateSelection
              - …
            - `invites` CompanyInvite[]
              - …
            - `hubspotConnection` HubspotConnection
              - …
            - `pipedriveConnection` PipedriveConnection
              - …
            - `closeConnection` CloseConnection
              - …
            - `centralStationCrmConnection` CentralStationCrmConnection
              - …
            - `ameiseConnection` AmeiseConnection
              - …
            - `abAgentaConnection` AbAgentaConnection
              - …
            - `salesforceConnection` SalesforceConnection
              - …
            - `slackConnection` SlackConnection
              - …
            - `intercomMessengerConnection` IntercomMessengerConnection
              - …
            - `hubSubscription` HubSubscription
              - …
            - `crmSubscription` CrmSubscription
              - …
            - `whatsappSubscription` WhatsappSubscription
              - …
            - `klickTippConnection` KlicktippConnection
              - …
            - `smartWeCRMConnection` SmartWeCRMConnection
              - …
            - `stripeFeatureConnection` StripeFeatureConnection
              - …
            - `paypalFeatureConnection` PaypalFeatureConnection
              - …
            - `mollieFeatureConnection` MollieFeatureConnection
              - …
            - `aircallConnection` AircallConnection
              - …
            - `reviewSettings` ReviewSettings
              - …
            - `referralSettings` ReferralSettings
              - …
            - `groups` Group[]
              - …
            - `provisionalBookings` ProvisionalBookingPayload[]
              - …
            - `voiceTrialExpiresAt` string, date-time, nullable, required
            - `voiceBilling` object, required
              - …
            - `commissionPercentage` number, required: Affiliate commission percentage for the company's referral/partner user program. This is about *partner users* inside a Company and the Cello affiliate program — NOT the `Reseller` entity's commission (which lives on `Reseller.commissionPercentage`).
            - `resellerId` string, nullable: Reseller that provisioned this Company (e.g. Placetel). Nullable: Companies registered through the regular signup flow have no reseller. Replaces the legacy `metadata.partner` string marker. Set during provisioning via the unified `signUpNewAdmin` flow. Used by the reseller dashboard to scope its queries to the reseller's own companies.
            - `reseller` Reseller
              - …
            - `emailFromName` string: Value to use as from email name. If not defined, company name should be used.
            - `footerEmail` string, nullable, required: Contact shown in the email footer. Without these the footer falls back to the company OWNER's personal contact email/phone, which leaks a person where a role address belongs (JoFinanz, 2026-08-24). Precedence in the renderer: workspace override → these → owner. Null = today's behavior.
            - `footerPhone` string, nullable, required
            - `permissions` PermissionSettings, required
              - …
            - `doubleOptIn` boolean, required: Double opt in feature, default disabled.
            - `enableCustomLegalText` boolean, required: Enable/disable custom legal text
            - `customLegalText` string: Custom legal text HTML, shown above booking button if enabled
            - `requireInvite` boolean, required
            - `flag` number: Used to flag suspicious accounts or ban. Smallint is used as to not expose any descriptive value. Currently, only two values are used. `null` = Account is not flagged `1` = Banned. Account is banned from doing anything.
            - `registrationIp` string, nullable
            - `signupChannel` string, nullable: Lead-source attribution captured on the marketing site (first touch on meetergo.com) and handed over at signup via the `mg_attribution` cookie. Written once by POST /me/signup-complete for the admin who created the company; never overwritten. Channel is the classified bucket (paid_search | organic_search | ai_assistant | social | referral | …).
            - `signupChannelSource` string, nullable: Normalized source of the first touch, e.g. "google", "chatgpt", "linkedin".
            - `signupSource` string, nullable: Legacy signup-source bucket (utm_source_medium or referrer-derived).
            - `signupReferrer` string, nullable: External referrer hostname of the first marketing-site touch.
            - `signupLandingPage` string, nullable: Landing page path of the first marketing-site touch.
            - `signupSourceUrl` string, nullable: Page the signup click happened on (source_url param).
            - `signupUtmSource` string, nullable
            - `signupUtmMedium` string, nullable
            - `signupUtmCampaign` string, nullable
            - `signupUtmTerm` string, nullable
            - `signupUtmContent` string, nullable
            - `signupFirstTouchAt` string, date-time, nullable: When the lead first touched the marketing site.
            - `finishedOnboarding` boolean, required: Determines whether company has completed onboarding
            - `requireHostConfirmation` boolean, required: Require host confirmation feature, default disabled. When enabled, hosts need to confirm before the appointment is created.
            - `provisionalBookingExpiryHours` number: Expiry time for provisional bookings in hours. If null, uses the default of 72 hours.
            - `enableNextBooking` boolean, required
            - `enableCookieBanner` boolean, required
            - `useDedicatedIP` boolean, required: Enable dedicated IP support for Exchange connections. When true, Exchange traffic will be routed through a proxy to ensure all requests come from a single determined IP. @todo store the actual proxy credentials to be able to support different proxies per client.
            - `useCustomSmtpDedicatedIP` boolean, required: Enable dedicated IP support for Custom SMTP connections. When true, Custom SMTP traffic will be routed through a proxy to ensure all emails originate from the configured dedicated IP. This applies to all SMTP configurations for this company. Proxy is used during both verification and email sending.
            - `sallyEnabled` boolean, required: When enabled, invite@sally.io is automatically added to online meetings as an attendee for AI meeting transcription.
            - `defaultDomainEntity` CustomDomain
              - …
            - `defaultDomain` string
            - `jitsiCustomDomain` string, nullable: Custom domain for Jitsi Meet video conferencing (e.g., 'meet.example.com') When set, Jitsi rooms will use this domain instead of the default meet.jit.si Format: https://{customDomain}/{roomId}
            - `lowStorageNotifiedAt` string, date-time, nullable: When low storage notification was last sent (null = not sent). Used to prevent duplicate notifications.
            - `crmSettings` object, nullable: Per-company CRM configuration that is too small to deserve its own table: today the lost-reason list and whether one is mandatory. Unset means "never configured" and resolves to the built-in reasons, so every existing account keeps the list it already had.
          - `activeCompanyId` string, nullable: Which company this user is currently operating in, for users who hold memberships in companies other than their own (partner admins). Server-owned on purpose. This used to live in the browser's localStorage and ride every request as an `x-meetergo-company-id` header, which meant the client asserted its own authorization context: a value left behind by an earlier session kept being sent, the api refused every request with it (including `/me`), and the app could not boot far enough to correct itself. Nothing could reconcile it, because nothing but the browser knew it existed (reported 2026-08-18). Null means "my own company". A value here is a preference, never a permission: membership is re-validated on every request and this column is cleared when it no longer holds.
          - `email` string: Email of the user. Email is null when user is a resource. If resource is converted to user, email is set.
          - `contactEmail` string, nullable: Verified contact email shown to attendees (Reply-To on booking confirmations). When set, it overrides `email` for outbound mail but does not affect auth/login. Required for OAuth users who cannot change `email` via Cognito but want a different customer-facing address. Verified via OTP before being stored.
          - `isAdmin` boolean, required
          - `groups` Group[]: Groups the user is in
            - `id` string, required
            - `companyId` string, required: Relation to company with FK, cascade delete, index
            - `company` Company
              - …
            - `name` string, required: Group name/title
            - `users` User[]: Non-admin users relation. A soft limit should be enforced.
            - `admins` User[]: Admins of the group. Admins should only be in this relation and not a user as well. A soft limit should be enforced.
            - `meta` DateMeta, required
              - …
          - `groupsAdmin` Group[]: Groups the user is admin and in
            - `id` string, required
            - `companyId` string, required: Relation to company with FK, cascade delete, index
            - `company` Company
              - …
            - `name` string, required: Group name/title
            - `users` User[]: Non-admin users relation. A soft limit should be enforced.
            - `admins` User[]: Admins of the group. Admins should only be in this relation and not a user as well. A soft limit should be enforced.
            - `meta` DateMeta, required
              - …
          - `familyName` string, required: Family name/lastname
          - `givenName` string, required: Given name/firstname. In the case of Resource, this is resource name
          - `picture` string: Ful url to user picture hosted statically
          - `createdAt` string, date-time, required
          - `updatedAt` string, date-time, required
          - `deletedAt` string, date-time, nullable
          - `lastLoginAt` string, date-time, nullable
          - `lastApiActivityAt` string, date-time, nullable: Last time a programmatic API call (PAT or API key) resolved to this user. The "≥1 API call attributed to the user" signal for reseller seat-activity billing (Placetel contract §4.2) — the limb that bookings and `lastLoginAt` don't cover for API-driven seats. Stamped best-effort on PAT/API-key auth; the write is a conditional UPDATE that no-ops after the first of the day.
          - `onboardingQualifiedAt` string, date-time, nullable: First qualifying onboarding action (meeting-type / availability / workflow configuration) within 72h of signup. Write-once, claimed via a conditional UPDATE so the `onboarding_qualified` analytics event and its consent-gated Meta CAPI dispatch fire exactly once per user.
          - `title` string, required
          - `anonymousBooking` boolean, required
          - `exemptFromOutlookConnectionRequirement` boolean, required: When true, this host is exempt from the company-wide Microsoft/Outlook connection requirement and stays bookable even without a working connection. Set per host by a company admin. See `isHostEligibleUnderOutlookRequirement`.
          - `anonymousCalendarActivity` boolean, required
          - `keepCancelledCalendarEvents` boolean, required: When true, cancelling an appointment keeps the synced calendar event in the host's calendar instead of deleting it: the event is marked cancelled (title prefixed, e.g. "Abgesagt: …") and set to free/transparent so it no longer blocks availability. Lets hosts keep a record of cancelled meetings for time tracking. Default off preserves the historic delete behavior. Honored by `CalendarSyncService.syncAppointmentCancel`.
          - `slug` string, required
          - `showGettingStartedList` boolean, required
          - `recieveEmailMarketing` boolean, required: User opted in to recieve marketing emails
          - `miraBudgetOverride` number, nullable: A per-seat monthly AI spend cap (USD) that replaces the one their plan tier would give them, set by an operator from the ops console. The tier caps in `MIRA_TIERS` are deliberately tight, so a heavy but legitimate user can exhaust one mid-month and silently drop to the free model lane. This is the lever that fixes that case without a deploy and without moving every other customer on the same plan. Null — everyone, normally — means the seat follows its tier. It is stored here rather than on the LiteLLM customer row because both gateways reconcile that row back to the tier value on every request; this column is what they reconcile *to*.
          - `miraBudgetOverrideUntil` string, date-time, nullable: When the override lapses back to the tier cap. Null means it does not. Evaluated on read, so no job is involved: an expired override simply stops being returned, and the next request reconciles the gateway back down.
          - `miraBudgetOverrideReason` string, nullable: Why the operator raised it. Shown in the ops console beside the value.
          - `userStatus` object, required
          - `referralId` string
          - `personalPage` PersonalPage, required
            - `useCustomColors` boolean, required
            - `primaryColor` string, required
            - `secondaryColor` string, required
            - `headerImage` string, nullable, required
            - `theme` BusinessCardTheme
              - …
            - `blocks` CardBlock[], nullable: Ordered content blocks (headline, text, video, file, divider) shown on the card. Sanitized in updatePersonaPage.
              - …
            - `businessCardDraft` object, nullable: Staged, not-yet-published design edits: { theme?, blocks? }. Null means no unpublished changes. Never served on public surfaces.
            - `description` string, required
            - `onlineProfiles` OnlineProfiles, required
              - …
            - `meetingTypes` MeetingType[]
            - `showAllMeetingTypes` boolean, required: If true, show all user meeting types on business card. If false, show only selected meeting types.
            - `showMeetingsSection` boolean, required: If true, the card renders the automatic meetings section (heading, "show all" toggle, its own list) above the content blocks. Cards created since the block editor took over start without it: booking options are placed as `meetingType` blocks instead, so images and text can sit between them. Backfilled to true for every card that already showed at least one booking option.
            - `showContactExchange` boolean, required: If true, the card offers visitors the contact-exchange form beside "save contact". Owners who only want to hand out their own details switch it off.
            - `meetingTypeOrder` string[]
          - `metadata` UserMetaData
            - `academy` Academy
              - …
            - `preferences` string[]
            - `teamSize` string
            - `position` string
            - `department` string
            - `skipOnboarding` boolean
            - `onboardingFinished` boolean
            - `tutorialSteps` TutorialSteps
              - …
            - `campaignPriority` string
            - `role` string
            - `segment` string
            - `betaAccess` string[]
            - `onboardingChecklist` OnboardingChecklist
              - …
            - `freeEmail` boolean: Whether the user email is from a free email provider
            - `oauthEmail` string: Stores the original email when a user changes their email. Used as a fallback during OAuth federation to match users who changed their email after signing up via Google/Facebook/Microsoft.
            - `suiteApps` string[]: Suite apps shown in this user's sidebar, in display order. Falls back to company.metadata.enabledApps, then to the legacy preference personas.
            - `sidebarShortcuts` string[]: Optional non-app destinations shown in this user's sidebar.
            - `visitedApps` string[]: Suite apps whose first-run intro this user has already seen.
            - `suiteAppSuggestionsDismissed` boolean: Whether this user dismissed the post-first-booking app suggestions on Home. Once set the card never comes back: it is a one-shot prompt at the one moment the user has proof the product works, not a recurring nag.
            - `aiPhoneAssistantPromoDismissed` boolean: Whether this user permanently dismissed the AI Phone Assistant beta prompt.
          - `calendarSyncProviders` CalendarSync, required
            - `id` string, required
            - `type` 'google' | 'outlook' | 'icloud' | 'caldav' | 'exchange' | 'nextcloud' | 'smart-we' | 'salesforce', required
          - `enableHostMeetingLimits` boolean, required
          - `hostMeetingLimits` object, nullable
          - `analyticsViewerWorkspaces` Workspace[]: Workspaces this user is an analytics-only viewer of (see `Workspace.analyticsViewers`). Grants scoped analytics, no edit rights.
            - `connectWaitingRoom` ConnectWaitingRoomSettings
              - …
            - `integrationPermissions` object: Workspace-level integration permission overrides. Can override company settings (allow or deny specific integrations).
            - `customBookingCSS` string: Custom CSS for booking and confirmation pages. When set, this overrides the company-level customBookingCSS for this workspace's meeting types. Applied to both booking pages and confirmation/reschedule/cancel pages.
            - `createdAt` string, date-time, required
            - `updatedAt` string, date-time, required
            - `deletedAt` string, nullable
            - `id` string, required
            - `name` string, required
            - `slug` string, required: Slug must be unique
            - `picture` string: Full url to workspace picture hosted statically
            - `description` string
            - `primaryColor` string
            - `logoUrl` string
            - `language` 'en' | 'de' | 'fr' | 'es' | 'no' | 'nl' | 'it' | 'pl' | 'se' | 'tr' | 'da'
            - `salesforceStudioId` string: Salesforce Studio__c Record ID Used for Küche&Co integration to link Cases to Studios
            - `useCompanyDefaultColor` boolean, required
            - `useCompanyDefaultLanguage` boolean, required
            - `useCompanyDefaultLogo` boolean, required
            - `useCompanyDefaultContactInfo` boolean, required
            - `showTeamSection` boolean, required
            - `showServicesSection` boolean, required
            - `showCompanyDetails` boolean, required
            - `showContactInfo` boolean, required
            - `emailAddress` string
            - `phone` string
            - `website` string
            - `address` string
            - `privacyUrl` string
            - `imprintUrl` string
            - `emailSenderName` string: Email sender name. Only name part of sender string without email.
            - `emailSenderAddress` string: Email sender address. Only email part of sender string. Only active if custom smtp is active. Otherwise this is ignored.
            - `enableCustomLegalText` 'Enable' | 'Disable' | 'Inherit', required: Enable/disable custom legal text
            - `customLegalText` string: Custom legal text HTML, shown above booking button if enabled
            - `reviewSettings` WorkspaceReviewSettings
              - …
            - `company` Company
              - …
            - `companyId` string, required
            - `users` User[]
            - `adminUsers` User[]
            - `analyticsViewers` User[]: Analytics-only viewers of this team. They can see this workspace's analytics (scoped to its members) but get no admin or edit rights — deliberately separate from `adminUsers`, which the meeting-type edit gates key off. Used for the "analytics for employees" role.
            - `meetingTypes` MeetingType[]
            - `queues` Queue[]
              - …
            - `reminders` Reminder[]
              - …
            - `forms` Form[]
          - `reminders` Reminder[]
            - `meetingTypes` MeetingType[]
            - `meetingTypeTemplates` MeetingTypeTemplate[]
            - `forms` Form[]
            - `pipelines` Pipeline[]
              - …
            - `workspace` Workspace
              - …
            - `scheduledReminders` ScheduledReminder[]
              - …
            - `createdAt` string, date-time, required
            - `updatedAt` string, date-time, required
            - `deletedAt` string, nullable
            - `id` number, required
            - `name` string, required
            - `enabled` boolean, required
            - `scope` object, required
            - `triggers` ReminderTrigger[], required
              - …
            - `companyId` string, required
            - `workspaceId` string
            - `userId` string: Maybe shouldnt be nullable
          - `queues` Queue[]
            - `type` 'simpleRoundRobin' | 'advancedRoundRobin' | 'equalDistribution', required
            - `roundRobinEntries` RoundRobinEntry[], required
              - …
            - `meetingType` MeetingType (recursive)
            - `qualifiers` Qualifier[], nullable
              - …
            - `createdAt` string, date-time, required
            - `updatedAt` string, date-time, required
            - `deletedAt` string, nullable
            - `id` string, required
            - `workspace` Workspace
              - …
            - `workspaceId` string
            - `oldMeetingType` MeetingType (recursive)
            - `meetingTypeId` string, required: Currently, there are several fields with value null in prod. I'm not sure if that does anything. I suspect that all rows with null meeting type id are orphaned. @todo confirm theory and migrate to non nullable
            - `userCapacities` UserCapacity[], required
              - …
            - `userPriorities` UserPriority[], required
              - …
            - `userCustomLinks` UserCustomLink[], required: Per-host overrides resolved by `CalendarLinkService.addMeetingLink` (CUSTOM channel).
              - …
            - `maxLeadThreshold` number, required: Maximum number of bookings a host can be ahead of the least-booked host before their availability is hidden. Ensures fair distribution.
            - `distributionPeriod` object, required: Period over which bookings are counted for equal distribution. Counts reset at the start of each period.
            - `prioritizeNearTermAvailability` boolean, required: When true, if fairness filtering (maxLeadThreshold) would push the next available slot more than 14 days beyond the meeting type's minimum booking notice, temporarily include over-lead hosts so bookers aren't penalized by fairness enforcement. Disable only if strict fairness must never yield to booker-visible availability.
            - `userGroups` QueueUserGroup[], required
              - …
            - `userGroupIds` string[], required
            - `companyId` string, required: Not null
            - `users` User[]
            - `userIds` string[], required
          - `queueUserGroups` QueueUserGroup[]
            - `createdAt` string, required
            - `updatedAt` string, date-time, required
            - `deletedAt` string, nullable
            - `id` string, required
            - `name` string, required
            - `capacity` number, required
            - `users` User[], required
            - `userIds` string[], required
            - `queue` Queue
              - …
            - `queueId` string, required
            - `mainGroupHost` User (recursive)
            - `mainGroupHostId` string, nullable
          - `forms` Form[]
          - `googleConnections` GoogleConnection[]
            - `id` string, required
            - `sub` string, required
            - `primary` boolean, required
            - `email` string, required
            - `idToken` string, required
            - `refreshToken` string, required
            - `accessToken` string, required
            - `scope` string, required: Scopes as reported by google api, seperated by whitespace.
            - `accessTokenExpiration` string, required
            - `primaryCalendar` string, required
            - `selectedCalendars` string[], required
            - `validateAvailability` boolean, required
            - `user` User (recursive)
            - `userId` string, required
            - `registeredWebhooks` GoogleRegisteredWebhook[]
              - …
            - `disableAttendeeNotification` boolean
            - `cancelIfDeclinedOrDeleted` boolean, required: If true, the meetergo appointment will be cancelled if the attendee declines or deletes the meeting in Google calendar.
            - `requiresReauth` boolean, required: Set when the refresh token is revoked or credentials become invalid. The user must reconnect via OAuth to restore syncing. TODO: Apply this pattern to Outlook, CalDAV, and other connection types.
            - `syncBuffersToCalendar` boolean, required: Whether buffer events should be synced to this calendar connection
            - `lastErrorCode` string, nullable, required: Health-tracking fields powering the integration health dashboard and the stale-integration cron. Non-PII normalized error code ("auth_revoked", "rate_limited", "network_error", etc.) — never raw provider payloads.
            - `lastErrorAt` string, date-time, nullable, required
            - `lastNotifiedAt` string, date-time, nullable, required: When the user was last emailed about this connection being broken. Used by the stale-integration cron to throttle reminders to once per incident — reset to null on successful reconnection.
          - `caldavConnections` CaldavConnection[]
            - `email` string, required
            - `userId` string, required
            - `url` string, required
            - `selectedCalendars` CalDAVCalendarInfo[], required
              - …
            - `validateAvailability` boolean, required
            - `primaryCalendar` string, required
            - `provider` string, required: Caldav provider, i.e. "mailbox.org". Some providers need special handling. This is an enum but DB schema is a string because likely the enum will change often
            - `disableAttendeeNotification` boolean, required
            - `skipCache` boolean, required: If true, skip caching and always fetch fresh calendar data. Useful for troubleshooting stale availability issues.
            - `syncBuffersToCalendar` boolean, required: Whether buffer events should be synced to this calendar connection
            - `requiresReauth` boolean, required: When true, the connection credentials are invalid. Prevents repeated error notifications and skips availability checks until the user reconnects. Reset to false on successful reconnection.
            - `lastErrorCode` string, nullable, required: Health-tracking fields powering the integration health dashboard and the stale-integration cron. See GoogleConnection for the full pattern.
            - `lastErrorAt` string, date-time, nullable, required
            - `lastNotifiedAt` string, date-time, nullable, required
          - `webexConnection` UserWebexConnection
            - `userId` string, required
            - `refreshToken` string, required
            - `refreshTokenExpiration` string, date-time, required
            - `accessToken` string, required
            - `accessTokenExpiration` string, date-time, required
          - `kmeetIntegration` KMeetIntegration
            - `calendarId` number, nullable: Selected Infomaniak calendar ID for room creation. Null until user completes setup.
            - `customDomain` string, nullable: Custom kMeet domain (e.g. 'terra.estate' -> kmeet.terra.estate). Null = use default.
            - `roomOptions` object
            - `id` string, required
            - `userId` string, required
            - `user` User (recursive)
            - `createdAt` string, date-time, required
            - `updatedAt` string, date-time, required
          - `nextcloudTalkIntegration` NextcloudTalkIntegration
            - `id` string, required
            - `userId` string, required
            - `user` User (recursive)
            - `serverUrl` string, required: Base instance URL, e.g. 'https://cloud.example.com' (no trailing slash).
            - `username` string, required: Nextcloud login name used for Basic auth against the Spreed OCS API.
            - `createdAt` string, date-time, required
            - `updatedAt` string, date-time, required
          - `openTalkIntegration` OpenTalkIntegration
            - `id` string, required
            - `userId` string, required
            - `user` User (recursive)
            - `controllerUrl` string, required: Controller (API) base URL, e.g. 'https://controller.example.com'.
            - `webBaseUrl` string, required: Web frontend base URL used to build guest links, e.g. 'https://meet.example.com'.
            - `tokenUrl` string, required: Full Keycloak token endpoint, e.g. 'https://accounts.example.com/auth/realms/main/protocol/openid-connect/token'.
            - `clientId` string, required: OIDC client id used for the password grant.
            - `username` string, required: Service-user login (email) for the password grant.
            - `createdAt` string, date-time, required
            - `updatedAt` string, date-time, required
          - `alfaviewIntegration` AlfaviewIntegration
            - `id` string, required
            - `userId` string, required
            - `user` User (recursive)
            - `companyId` string, required: alfaview company (account) ID the API key belongs to.
            - `clientId` string, required: Alias of the API key (sent as `clientId` when authenticating).
            - `createdAt` string, date-time, required
            - `updatedAt` string, date-time, required
          - `graphConnections` UserGraphConnection[]
            - `blockEventTypes` BlockEventTypes, required
              - …
            - `id` string, required
            - `email` string, required
            - `userId` string, required
            - `user` User (recursive)
            - `primary` boolean, required
            - `refreshToken` string, nullable, required
            - `accessToken` string, nullable, required
            - `accessTokenExpiration` string, nullable, required
            - `canHostOnlineMeetings` boolean, required
            - `validateAvailability` boolean, required
            - `selectedCalendars` GraphCalendarInfo[], required
              - …
            - `primaryCalendar` string, required
            - `registeredWebhooks` GraphRegisteredWebhook[], required
              - …
            - `disableAttendeeNotification` boolean, required: New experimental setting to disable attendee notifications. This results in attendee not being added to host's calendar invite.
            - `enableCache` boolean, required: If true, fetches availabilities from cache. Otherwise from Microsoft Graph.
            - `cancelIfDeclinedOrDeleted` boolean, required: If true, the meetergo appointment will be cancelled if the attendee declines or deletes the meeting in Outlook calendar.
            - `requiresReauth` boolean, required: If true, the refresh token is invalid and the user needs to re-authorize. Connection is kept (preserving calendar settings) instead of being deleted.
            - `syncBuffersToCalendar` boolean, required: Whether buffer events should be synced to this calendar connection
            - `scope` string, nullable: Scopes as reported by Microsoft OAuth, space-separated. Null for pre-existing connections.
            - `lastErrorCode` string, nullable, required: Health-tracking fields powering the integration health dashboard and the stale-integration cron. See GoogleConnection for the full pattern.
            - `lastErrorAt` string, date-time, nullable, required
            - `lastNotifiedAt` string, date-time, nullable, required
            - `roomEmailAddress` string, nullable: When set, this connection is a "room connection": availability is read for this Microsoft 365 room/resource mailbox (this SMTP address) via the Graph `getSchedule` free/busy API. The token stored on this connection belongs to the real licensed "reader" user (an admin/host in the same tenant) who completed OAuth with the `Calendars.Read.Shared` scope — the room mailbox itself never authenticates (Microsoft blocks interactive sign-in on rooms). Null for every normal connection, which keeps the existing calendarView read path untouched. See {@link isRoomConnection}.
          - `exchangeTeamsConnections` ExchangeTeamsConnection[]
            - `blockEventTypes` BlockEventTypes, required
              - …
            - `id` string, required
            - `userId` string, required
            - `graphUserId` string, required
            - `email` string
            - `primary` boolean, required
            - `refreshToken` string, nullable, required
            - `accessToken` string, nullable, required
            - `accessTokenExpiration` string, nullable, required
            - `canHostOnlineMeetings` boolean, required: For new connections having OnlineMeeting.ReadWrite scope Can create meeting on teams for exchange/outlook account
            - `validateAvailability` boolean, required
            - `selectedCalendars` GraphCalendarInfo[], required
              - …
            - `primaryCalendar` string, required
            - `skipCache` boolean, required: If true, skip caching and always fetch fresh calendar data. Useful for troubleshooting stale availability issues.
            - `syncBuffersToCalendar` boolean, required: Whether buffer events should be synced to this calendar connection
          - `linkandoConnection` LinkandoConnection
            - `userId` string, required
            - `refreshToken` string
            - `accessToken` string, required
            - `apiDomain` string, required
            - `email` string
            - `tenant` string
            - `image` string
            - `accessTokenExpiration` string, required
          - `smartWeCalendarConnections` SmartWeCalendarConnection[]
            - `id` string, required
            - `userId` string, required
            - `email` string, required
            - `accessToken` string, required
            - `refreshToken` string, required
            - `tokenType` string, required
            - `scope` string, required
            - `expiresAfter` number, required
            - `createdAt` string, date-time, required
            - `updatedAt` string, date-time, required
            - `skipCache` boolean, required: If true, skip caching and always fetch fresh calendar data. Useful for troubleshooting stale availability issues.
            - `syncBuffersToCalendar` boolean, required: Whether buffer events should be synced to this calendar connection
          - `exchangeConnections` UserExchangeConnection[]
            - `id` string, required
            - `userId` string, required
            - `latestWorkingEndpoint` string, required: Last endpoint that was successfully called
            - `username` string, required: Exact username to use as username (i.e. combined domain\user or email)
            - `email` string, required: Exchange email of user
            - `validateAvailability` boolean, required
            - `useImpersonation` boolean, required: Whether to use impersonation (service account accessing another user's calendar)
            - `impersonatedEmail` string: Email of the user to impersonate (when useImpersonation is true)
            - `calendarFolderId` string: Calendar folder ID for Exchange 2025+ compatibility. - NULL for Exchange 2019 and earlier (uses WellKnownFolderName.Calendar) - Set automatically during connection if standard method fails
            - `skipCache` boolean, required: If true, skip caching and always fetch fresh calendar data. Useful for troubleshooting stale availability issues.
            - `emailSyncEnabled` boolean, required: If true, this Exchange connection is also used to sync emails into the CRM. Opt-in only: defaults to false so existing calendar-only connections are never touched by the email sync pipeline.
            - `emailSyncEnabledAt` string, date-time, nullable, required: Set when emailSyncEnabled is first activated.
            - `requiresReauth` boolean, required: True once the stored credentials are rejected by the server (401 on a rotated password is the common case). The connection is kept so the host can re-enter the password; availability skips it until then. Same contract as `UserGraphConnection.requiresReauth`.
            - `lastErrorCode` string, nullable, required: Health-tracking fields powering the integration health dashboard and the stale-integration cron. See GoogleConnection for the full pattern.
            - `lastErrorAt` string, date-time, nullable, required
            - `lastNotifiedAt` string, date-time, nullable, required
          - `appleConnections` UserAppleConnection[]
            - `username` string, required
            - `userId` string, required
            - `key` string, required: Encrypted app-specific password generated in apple account
            - `selectedCalendars` AppleCalendarInfo[], required: The calendars whose events are read for availability. Written at connect time and updated from the settings flow. Entries carry only `displayName` and `url`; the read path skips entries missing either (`AppleService.getICloudCalendarEvents`). An empty array means no calendar is read, so this connection blocks nothing. There is no per-calendar toggle: `validateAvailability` is a connection-level column and gates the whole list.
              - …
            - `validateAvailability` boolean, required
            - `primaryCalendar` string, required
            - `disableAttendeeNotification` boolean, required
            - `ignoreAllDayAppointments` boolean, required: if enabled, all day events will be marked as free. Otherwise, busy
            - `skipCache` boolean, required: If true, skip caching and always fetch fresh calendar data. Useful for troubleshooting stale availability issues.
            - `syncBuffersToCalendar` boolean, required: Whether buffer events should be synced to this calendar connection
            - `requiresReauth` boolean, required: When true, the connection credentials are invalid. Prevents repeated "reconnect calendar" notifications and skips availability checks until the user reconnects. Reset to false on successful reconnection.
            - `lastErrorCode` string, nullable, required: Health-tracking fields powering the integration health dashboard and the stale-integration cron. See GoogleConnection for the full pattern.
            - `lastErrorAt` string, date-time, nullable, required
            - `lastNotifiedAt` string, date-time, nullable, required
          - `salesforceUserMappings` SalesforceUserMapping[]
            - `id` string, required
            - `userId` string, required
            - `user` User (recursive)
            - `companyId` string, required
            - `company` Company
              - …
            - `salesforceUserId` string, required: Salesforce User.Id
            - `salesforceUserEmail` string, required: Salesforce user email (for display purposes)
            - `validateAvailability` boolean, required: If true, include Salesforce calendar events in availability checks
            - `createdAt` string, date-time, required
            - `updatedAt` string, date-time, required
          - `salesforceAutoConnectOptOut` boolean, required: This member disconnected their Salesforce calendar themselves. Disconnecting deletes the mapping row, which leaves nothing to tell the company-wide auto-connect apart from a member it has never seen. Without this flag it would re-create the mapping on its next run and the member could not stay disconnected. Connecting again clears it.
          - `defaultAvailability` Availability
            - `timezone` string, required
            - `id` string, required
            - `name` string, required
            - `schedule` WeeklySchedule, required
              - …
            - `useExplicitAvailability` boolean, required: When enabled, calendar events with the specified title are offered as bookable slots IN ADDITION to the weekly schedule (they behave like positive exceptions, see `UserAvailabilityService`). The weekly grid stays editable. Not to be confused with `scheduleSource`, which decides where the grid itself comes from.
            - `scheduleSource` object, required: Where the weekly schedule comes from. `manual` is the user typing it; `outlook` means it is read from the mailbox's Outlook working hours and the editor refuses direct schedule/timezone edits until switched back. Never read during slot calculation: to the availability engine an Outlook-sourced schedule is just a schedule.
            - `scheduleSourceConnectionId` string, nullable
            - `scheduleSyncedAt` string, date-time, nullable: Last time Outlook was consulted for this schedule (success or not).
            - `scheduleSyncError` object, nullable: Why the last consultation of Outlook could not update the schedule.
            - `explicitAvailabilityEventTitle` string, nullable: The calendar event title to look for when useExplicitAvailability is enabled. Events with this title will be treated as available booking slots.
            - `userId` string, required
            - `availabilityExceptions` AvailabilityException[]
              - …
            - `createdAt` string, date-time, required
            - `updatedAt` string, date-time, required
            - `deletedAt` string, date-time, nullable
            - `meetingType` MeetingType (recursive)
            - `meetingTypeTemplate` MeetingTypeTemplate (recursive)
            - `resourceChannels` ResourceChannel[], required
              - …
          - `defaultAvailabilityId` string
          - `aircallUserId` string
          - `phone` string: Phone number in profile. Migrated from cognito.
          - `userType` 'standard' | 'resource' | 'api-platform' | 'partner' | 'viewer', required
          - `provisionalBookings` ProvisionalBookingPayload
            - `id` string, required: Generated ID
            - `dto` BookingDto, required
              - …
            - `locationSelectionContext` object, nullable, required: Trusted Finder selection retained across confirmation flows.
- … truncated; see the full OpenAPI document linked below

## Other responses

- `400`: The request did not validate. `message` lists the constraints that failed.
- `401`: Missing, malformed, or expired credentials.
- `403`: Authenticated, but not allowed: the plan does not include this feature, or the token is scoped away from it.
- `404`: No such resource in your account. Resources belonging to another account are reported the same way.
- `429`: Rate limited. Back off and retry.

---

[API](https://skmtc.dev/meetergo/apis/meetergo-platform-api.md) · [All operations](https://skmtc.dev/meetergo/apis/meetergo-platform-api/llms.txt) · [OpenAPI document](https://skmtc.dev/meetergo/apis/meetergo-platform-api/revisions/b5d66cd8be67?raw)
