API · v1 · stabil
CODEMETA OSDeveloper Center
Konsole öffnen
Entity · calendar_events

Calendar Event Schema

Schema-ID
calendar_event
Collection
calendar_events
Permissions
  • Lesencalendar_event_view
  • Anlegencalendar_event_create
  • Änderncalendar_event_edit
  • Löschencalendar_event_delete
Beziehungen

Felder

Calendar Event Schema

calendar_events4 Permissions

Schema for validating calendar_event entities (collection calendar_events)

titlestringerforderlich

Event title

1–200 Zeichen
descriptionstringoptional

Event description

max 5000 Zeichennullable
startAtdatetimeerforderlich

Event start date-time (ISO format)

endAtdatetimeerforderlich

Event end date-time (ISO format)

allDaybooleanerforderlich

Whether this is an all-day event

showAsstringoptional

How this event should be shown in free/busy lookups (Outlook-compatible). Defaults to busy for timed events, free for all-day events.

freetentativebusyout_of_officeworking_elsewhere
nullable
visibilitystringoptional

Event visibility. PRIVATE events are only visible to their creator and listed participants (participants.userId). Outlook-style private-appointment flag.

PUBLICPRIVATE
Default: "PUBLIC"
locationstringoptional

Event location

max 255 Zeichennullable
participantsobject[]optional

Event participants: internal users, CRM contact persons, or external emails

Default: []nullable
typestringerforderlich
userpartyemail
userIduuidoptional
nullable
partyIduuidoptional
nullable
emailemailoptional
nullable
displayNamestringoptional
max 200 Zeichennullable
isOrganizerbooleanoptional
nullable
responseStatusstringoptional

Zu-/Absage aus Outlook (ADR 0713). Fehlt das Feld, gilt `none` — deshalb ohne Backfill. Serverseitig gepflegt: aus der Anfrage verworfen und aus dem Bestand übernommen (`entity-hooks/calendar_event.hooks.ts`), geschrieben nur vom eingehenden Abgleich. Auswertung ausschliesslich über `participantResponse()`/`hasDeclined()` aus `@codemeta/shared`.

noneacceptedtentativedeclinednull
nullable
removedParticipantKeysstring[]optional

Grabsteine für Teilnehmer, die in Codemeta bewusst entfernt wurden — Identitätsschlüssel im Format `user:<uuid>` bzw. `email:<adresse>`. Verhindert, dass der eingehende Outlook-Abgleich sie wieder einträgt (ADR 0592). Serverseitig gepflegt: `entity-hooks/calendar_event.hooks.ts` schreibt das Feld bei jeder Änderung an `participants` neu und verwirft jeden Client-Wert.

nullable
linkedPartyIduuidoptional

Linked party/company UUID (Firma)

nullable
linkedTicketIduuidoptional→ ticket

Linked ticket UUID

nullable
linkedProjectIduuidoptional→ project

Linked project UUID

nullable
linkedOpportunityIduuidoptional

Linked opportunity UUID (Vertriebschance). Set when an appointment is created from the opportunity "Termine" tab; lists events for that opportunity.

nullable
linkedTaskIduuidoptional

Linked task UUID (ADR 0219). Typed mirror of the polymorphic referenceType:"TASK" + referenceId for symmetry with linkedProjectId/linkedTicketId/linkedOpportunityId. Readers should prefer this and fall back to (referenceType === "TASK" ? referenceId : null) for older events that only carry the polymorphic pair.

nullable
linkedPerformanceReviewIduuidoptional

Linked performance_review UUID. When set, changes to this event mirror back to review.meeting and deletion resets the review to AWAITING_MEETING.

nullable
positionIduuidoptional

ADR 0310: optional project_position this appointment is billed against, mirroring task.positionId. null = no position (free appointment). Set from the project "Termine" tab so it is clear which position (and thus billingModel flat_rate/time_and_material) time booked off this event belongs to; the positionId is carried onto the time booking when the appointment is verbucht.

nullable
partyAddressIduuidoptional

Linked party address UUID — references an address entry within the linked party (for on-site appointments)

nullable
locationIduuidoptional

Linked internal location UUID (building/room from locations entity)

nullable
locationModestringoptional

ADR 0507: what kind of place the event happens at. CUSTOMER = address of the linked party (partyAddressId), OWN = one of the MSP own locations (ownAddressId), ONLINE = remote/video call without postal address. Missing on legacy events — readers derive it via resolveEventLocationMode().

CUSTOMEROWNONLINEnull
nullable
ownAddressIdstringoptional

ADR 0507: id of the selected own-company location (self-company party addresses[]._id as served by GET /self-company-locations). Only meaningful when locationMode = OWN.

max 64 Zeichennullable
travelBeforeMinutesintegeroptional

Travel time before event in minutes (Anfahrt)

0 – 480nullable
travelAfterMinutesintegeroptional

Travel time after event in minutes (Abfahrt)

0 – 480nullable
travelAutoCalculatedbooleanoptional

True when travel times were auto-computed from party.travelConfig / OpenRouteService. Set to false to suppress future auto-updates.

nullable
travelDistanceKmnumberoptional

One-way distance in km between self-company location and customer address, captured from OpenRouteService alongside travelBeforeMinutes/travelAfterMinutes. Displayed on the Anfahrt/Abfahrt strips in the calendar.

0 – 10000nullable
referenceTypestringoptional

Polymorphic reference type (Auftrag) — same as time records. HR_TICKET links events to an internal HR-Ticket (Onboarding-Termin, Probezeit-Review, ...). TRAINING_SESSION links auto-generated calendar entries to a Schulungsgruppe (WP-F). OPPORTUNITY links the event to a Vertriebschance; the dialog mirrors the id into linkedOpportunityId so the opportunity "Termine" tab and feed keep working off the typed field.

TICKETHR_TICKETPROJECTTASKCONTACT_PERSONASSETTRAINING_SESSIONOPPORTUNITY
nullable
referenceIduuidoptional

Polymorphic reference ID (Auftrag) — same as time records

nullable
assetIdsuuid[]optional

Affected asset/device UUIDs (betroffene Geräte) — lets one appointment cover multiple assets (e.g. updating several firewalls/servers). Independent of the single "Auftrag" referenceType/referenceId, which stays the primary Vorgang (ticket/project/asset).

Default: []nullable
linkedVehicleIdsuuid[]optional

Reserved vehicle UUIDs (Fahrzeuge) — prevents double-booking

Default: []nullable
driverIduuidoptional

Fleet driver UUID — set when event is a vehicle reservation

nullable
reservationStatusstringoptional

Reservation workflow status — relevant when linkedVehicleIds or linkedResourceIds is set

REQUESTEDCONFIRMEDACTIVECOMPLETEDCANCELLEDNO_SHOWnull
nullable
reservationPurposestringoptional

Purpose/reason for the reservation

max 500 Zeichennullable
vehicleRequiredbooleanoptional

ADR 0836: a vehicle is needed for this appointment. Open demand while linkedVehicleIds is empty; stays true after a vehicle is assigned so that removing the vehicle re-opens the demand.

nullable
vehiclePoolGroupstringoptional

ADR 0836: preferred fleet pool (pool NAME as in vehicle.poolGroup). Hint for the dispatcher, not a constraint.

max 100 Zeichennullable
managedEventIduuidoptional

ADR 0857: managed_event this room block belongs to

nullable
venueBlockTypestringoptional

ADR 0857: EVENT = the event itself; SETUP/TEARDOWN block the room without being billed ("blockiert ≠ berechnet")

EVENTSETUPTEARDOWNnull
nullable
optionRankintegeroptional

ADR 0857: rank of a REQUESTED block — 1 holds the slot, 2 waits behind it. Null on a REQUESTED block = unranked inquiry.

1 – 2nullable
optionExpiresAtdatetimeoptional

ADR 0857: when an option lapses; the next rank moves up

nullable
linkedResourceIdsuuid[]optional

Reserved pool resource UUIDs (rooms, devices, tools) — prevents double-booking

Default: []nullable
resourceNamestringoptional

Denormalized resource name for display

max 200 Zeichennullable
resourceCategorystringoptional

Category of the linked pool resource (denormalized)

POOL_DEVICETOOLROOMnull
nullable
bookerUserIduuidoptional

User who booked the resource (may differ from event creator)

nullable
bookerUserNamestringoptional

Denormalized booker name for display

max 200 Zeichennullable
resourceHalfDaystringoptional

Half-day mode for HALF_DAY booking resources

FULLMORNINGAFTERNOONnull
nullable
attendeeCountintegeroptional

Number of attendees (room bookings)

≥ 1nullable
cateringRequestedbooleanoptional

Whether catering was requested

nullable
cateringNotesstringoptional

Catering requests

max 1000 Zeichennullable
setupNotesstringoptional

Room setup instructions

max 1000 Zeichennullable
cancellationReasonstringoptional

Reason for cancellation

max 1000 Zeichennullable
cancelledAtdatetimeoptional

When the booking was cancelled

nullable
cancelledByuuidoptional

User who cancelled the booking

nullable
linkedToolIdsuuid[]optional

Reserved tool/equipment UUIDs (Werkzeug)

Default: []nullable
materialsobject[]optional

Planned materials for this event (linked to articles)

Default: []nullable
articleIduuiderforderlich
articleNumberstringoptional
max 50 Zeichennullable
articleNamestringerforderlich
1–200 Zeichen
quantitynumbererforderlich
≥ 0
unitstringoptional
max 50 Zeichennullable
notesstringoptional
max 500 Zeichennullable
microsoftEventIdstringoptional

Microsoft Graph Calendar event ID (synced from Outlook)

nullable
iCalUIdstringoptional

Microsoft Graph iCalUId — stable, mailbox-independent meeting identifier used to deduplicate the same meeting across attendees and across event-id rotation (ADR 0168)

nullable
microsoftChangeKeystringoptional

Microsoft Graph changeKey for echo-suppression

nullable
onlineMeetingUrlstringoptional

Teams meeting join URL

nullable
isTeamsMeetingbooleanoptional

Whether this event includes a Teams meeting

nullable
sendInvitationsbooleanoptional

Opt-in Outlook invitation for an appointment WITHOUT Teams (ADR 1008). When true, the organizer mailbox hosts the appointment as a meeting with attendees: Exchange invites the participants (subject to the tenant policy settings.calendar.inviteParticipants) and mails their updates and cancellations — exactly like a Teams meeting, but without an online meeting. Missing or null means false. Settable only on create; a PATCH that changes the stored value is rejected.

read-onlynullable
syncSourcestringoptional

Origin of the calendar event

localmicrosoft
nullable
originstringoptional

Which workflow created this event (ADR 0820). Set once at creation by the creating flow, never by the user. "repair_intake_pickup" marks the pickup appointment of a repair intake (ADR 0273 §8) — the only events that follow the repair ticket when it is reassigned. Absent on hand-made events.

repair_intake_pickupnull
nullable
lastSyncedAtdatetimeoptional

Last time this event was synced with Microsoft

nullable
appointmentNumberstringoptional

Server-assigned appointment number (sequence `calendar_event`, e.g. TRM-2026-00042). Protected — client values are ignored. Absent on appointments created before 2026-10-01.

max 50 Zeichenread-onlynullable
syncErrorstringoptional

Last outbound sync error message — cleared on the next successful sync. Written only by the worker (protected field).

max 2000 Zeichenread-onlynullable
syncStatestringoptional

Outbound sync state. `diverged` = Outlook refused a delete and still shows an appointment we removed here (ADR 0636/0661); mirrors dms_folder.syncState.

cleandivergednull
read-onlynullable
recurrenceTypestringoptional

Recurrence pattern type

nonedailyweeklymonthlyyearly
nullable
recurrenceIntervalintegeroptional

Recurrence interval (e.g. every 2 weeks)

1 – 99nullable
recurrenceDaysOfWeekinteger[]optional

Days of week for weekly recurrence (0=Sun, 1=Mon, ..., 6=Sat)

nullable
recurrenceEndDatedatetimeoptional

End date for recurrence series

nullable
recurrenceCountintegeroptional

Number of occurrences for recurrence series

1 – 365nullable
recurrenceExceptionsstring[]optional

Occurrence dates (YYYY-MM-DD, local) deleted individually out of the series. The master document itself always sits on a LIVE occurrence — deleting the FIRST one advances startAt/endAt instead of adding an exception — so day-scoped views that do not expand the series never render a cancelled date.

nullable
participantRecurrenceExceptionsobjectoptional

Per-participant occurrence removals (ADR 0714): internal userId → local YYYY-MM-DD keys the participant took out of the series FOR THEMSELVES ONLY. Server-managed via POST /calendar_events/:id/remove-occurrence; client writes are dropped. Unlike recurrenceExceptions (the organizer list, valid for everyone) this never moves the master, so the series stays intact for the other participants. Read paths return the union as the computed field viewerRecurrenceExceptions.

read-onlynullable
recurrenceSeriesIduuidoptional

UUID grouping events in the same recurrence series

nullable
remindersobject[]optional

Reminders before event start (notification triggers)

Default: []nullable
minutesBeforeintegererforderlich
0 – 10080
bookingLinkIduuidoptional

Reference to the booking link used

nullable
bookingServiceIduuidoptional

Reference to the booking service

nullable
bookingCustomerFirstNamestringoptional

Customer first name (denormalized)

max 100 Zeichennullable
bookingCustomerLastNamestringoptional

Customer last name (denormalized)

max 100 Zeichennullable
bookingCustomerEmailemailoptional

Customer email (deduplication key for party)

max 254 Zeichennullable
bookingCustomerPhonestringoptional

Customer phone in E.164-like format

max 30 Zeichennullable
bookingCustomerCompanystringoptional

Customer company name

max 200 Zeichennullable
bookingFormDataobjectoptional

Custom field answers from the booking form

nullable
bookingManagementTokenHashstringoptional

SHA-256 hash of the self-service management token

nullable
bookingManagementTokenExpiresAtdatetimeoptional

Expiry of the management token

nullable
bookingSourcestringoptional

How the booking was created

linkportaladmin
nullable
bookingConfirmedAtdatetimeoptional

When the booking was confirmed

nullable
bookingConfirmedBystringoptional

userId or "auto"

max 200 Zeichennullable
bookingCancelledViastringoptional

Who initiated the cancellation

customeradminsystem
nullable
bookingTimezonestringoptional

IANA timezone of the customer at booking time

max 100 Zeichennullable
bookingIpAddressstringoptional

Customer IP address (audit only, not exposed in API)

max 45 Zeichennullable
bookingUserAgentstringoptional

Customer user agent (audit only, not exposed in API)

max 500 Zeichennullable
bookingParticipantCountintegeroptional

Number of participants for group bookings

1 – 100nullable
bookingParticipantNamesstring[]optional

Optional list of participant names for group bookings

nullable
bookingIsGroupSlotbooleanoptional

Whether this is a group booking slot

nullable
bookingFollowUpSentAtdatetimeoptional

When the follow-up email was sent

nullable
bookingNpsRatingintegeroptional

NPS rating (0-10) provided by customer after appointment

0 – 10nullable
bookingNpsFeedbackstringoptional

Free-text feedback from NPS follow-up

max 2000 Zeichennullable
rescheduleTrackingobjectoptional

Server-maintained reschedule-policy tracking (ADR 0342, protected field). Absent on events that were never policed — readers must treat absence as crossDayMoveCount 0 (no backfill).

read-onlynullable
crossDayMoveCountintegererforderlich

Counted self cross-day moves. Approval does NOT reset this.

≥ 0
anchorStartAtdatetimeoptional

Last sanctioned start: creation, a bypass-holder move, or an approved reschedule request

nullable
logobject[]optional

Capped audit trail of policed moves (newest last)

max 20 Itemsnullable
atdatetimeerforderlich
byUserIdstringerforderlich
fromStartAtdatetimeerforderlich
toStartAtdatetimeerforderlich
crossDaybooleanerforderlich

Standard-Endpoints

Diese Resource folgt dem generischen CRUD-Vertrag der Plattform. Lesen Sie die Konventionen für Pagination, Idempotenz, Optimistic Locking und Audit. Die wichtigsten Endpoints:

  • GET /api/v1/calendar_events — Liste, paginiert + filterbar
  • GET /api/v1/calendar_events/<id> — Einzelne Entity
  • POST /api/v1/calendar_events — Anlegen
  • PATCH /api/v1/calendar_events/<id> — Teil-Update
  • DELETE /api/v1/calendar_events/<id> — Soft-Delete
  • GET /api/v1/calendar_events/<id>/timeline — Audit + Aktivitäten

Suche