# Update an event

Partially updates an event. When participants are provided, exactly one
must be flagged `is_organizer` and exactly one `is_creator`, with unique `user_id`.
Requires `SITE_CALENDAR:WRITE`.

Endpoint: PATCH /calendar/events/{eventId}
Version: 1.4.0
Security: bearerAuth

## Security:

  - `bearerAuth` (unknown)
    http bearer opaque

## Path parameters:

  - `eventId` (integer, required)
    ID of the event to update.

## Request fields (application/json):

  - `type` (string | null)

  - `starts_at` (string | null)
    Example: 2026-01-15T09:00:00Z

  - `ends_at` (string | null)
    Example: 2026-01-15T10:00:00Z

  - `all_day` (boolean | null)

  - `title` (string | null)

  - `location` (string | null)

  - `location_geo` (object | null)

  - `location_geo.lat` (number, required)

  - `location_geo.lng` (number, required)

  - `sequence_duration` (integer | null)

  - `gathering_gauge` (integer | null)

  - `commute_duration` (integer | null)

  - `communicate_location` (boolean | null)

  - `is_confidential` (boolean | null)

  - `remind_time_in_min` (integer | null)

  - `appointment_mode` (string | null)
    Enum: "OFFICE", "PHONE", "PRODUCT", "VISIO", null

  - `participants` (array | null)

  - `participants.user_id` (integer, required)
    Identifier of the participating user (agent). Must be unique within the
participants list.

  - `participants.is_creator` (boolean, required)
    Marks the participant who created the event. Exactly one participant in the
list must have this set to true.

  - `participants.is_organizer` (boolean, required)
    Marks the participant who owns/hosts the event (its primary agenda).
Exactly one participant in the list must have this set to true.

  - `products` (array | null)

  - `contacts` (array | null)

  - `notes` (string | null)

  - `visio_url` (string | null)

  - `immo360_organizer_url` (string | null)

  - `immo360_participation_url` (string | null)

  - `archived` (boolean | null)

  - `parent_id` (integer | null)

  - `recurrence` (object | null)
    iCalendar RRULE-style recurrence definition. When present, `dtstart`, `freq`
and `interval` are required. The `by*` arrays follow the
[RFC 5545](https://datatracker.ietf.org/doc/html/rfc5545) recurrence semantics.

  - `recurrence.dtstart` (string, required)
    First occurrence start, UTC datetime in format `YYYY-MM-DDTHH:MM:SSZ`.
    Example: 2026-01-15T09:00:00Z

  - `recurrence.freq` (string, required)
    Recurrence frequency.
    Enum: "yearly", "monthly", "weekly", "daily", "hourly", "minutely", "secondly"

  - `recurrence.interval` (integer, required)
    Interval between occurrences in units of `freq`
(e.g. `freq: weekly`, `interval: 2` = every two weeks).

  - `recurrence.count` (integer | null)
    Total number of occurrences to generate. Mutually exclusive with `until`.

  - `recurrence.until` (string | null)
    End date of the recurrence (inclusive), UTC `YYYY-MM-DDTHH:MM:SSZ`.
Mutually exclusive with `count`.
    Example: 2026-12-31T23:59:59Z

  - `recurrence.bymonth` (array | null)
    Months of the year the event applies to (1 = January … 12 = December).

  - `recurrence.bymonthday` (array | null)
    Days of the month (1..31, or negative to count from the end of the month,
e.g. -1 = last day).

  - `recurrence.bynmonthday` (array | null)
    Negative-indexed days of the month (counted from the end).

  - `recurrence.byyearday` (array | null)
    Days of the year (1..366, or negative from the end of the year).

  - `recurrence.byweekno` (array | null)
    ISO week numbers of the year (1..53, or negative from the end).

  - `recurrence.byweekday` (array | null)
    Days of the week the event recurs on, as two-letter codes
(MO, TU, WE, TH, FR, SA, SU).

  - `recurrence.bynweekday` (array | null)
    Ordinal weekday rules as `[weekday_index, position]` pairs, where
weekday_index is 0=Monday … 6=Sunday and position is the occurrence within
the month (e.g. `[1, 2]` = the second Tuesday). Used for monthly-by-day patterns.

  - `recurrence.bysetpos` (array | null)
    Selects the Nth occurrence(s) within the set produced by the other `by*`
rules (e.g. -1 = the last matching day of the period).

  - `recurrence.exdate` (array | null)
    Exception dates to exclude from the generated series, each a UTC datetime
`YYYY-MM-DDTHH:MM:SSZ`.

## Response 200:

  - `200` (unknown)
    Event updated

## Response 200 fields (application/json):

  - `data` (object)
    A calendar event. The set of populated fields depends on the event type and
on the information supplied when the event was created.

  - `data.id` (integer)
    Unique identifier of the event.

  - `data.type` (string)
    Event type key (matches the `key` of an entry from the event types list).
    Example: VISIT

  - `data.starts_at` (string)
    Event start, UTC datetime (`YYYY-MM-DDTHH:MM:SSZ`).
    Example: 2026-01-15T09:00:00Z

  - `data.ends_at` (string)
    Event end, UTC datetime (`YYYY-MM-DDTHH:MM:SSZ`).
    Example: 2026-01-15T10:00:00Z

  - `data.all_day` (boolean)
    True when the event lasts the whole day and the time portion is not significant.

  - `data.title` (string | null)
    Title displayed on the event.

  - `data.location` (string | null)
    Address or place where the event takes place.

  - `data.location_geo` (object | null)
    Geographic coordinates of the location, when known.

  - `data.location_geo.lat` (number)
    Latitude in decimal degrees.
    Example: 48.8566

  - `data.location_geo.lng` (number)
    Longitude in decimal degrees.
    Example: 2.3522

  - `data.sequence_duration` (integer | null)
    Duration of a single booking slot, in minutes.

  - `data.gathering_gauge` (integer | null)
    Maximum number of attendees that can book the same slot.

  - `data.commute_duration` (integer | null)
    Travel time reserved before the event, in minutes.

  - `data.communicate_location` (boolean | null)
    Whether the location may be shared with attendees.

  - `data.is_confidential` (boolean | null)
    When true, the event details are hidden from non-participants; the slot still shows as busy.

  - `data.remind_time_in_min` (integer | null)
    Reminder lead time before the event start, in minutes.

  - `data.appointment_mode` (string | null)
    How the appointment is conducted:
- `OFFICE`: at the agency office
- `PHONE`: by phone
- `PRODUCT`: on-site at the property
- `VISIO`: video conference
    Enum: "OFFICE", "PHONE", "PRODUCT", "VISIO", null

  - `data.participants` (array)
    Users (agents) attending the event.

  - `data.participants.ext_user_id` (integer)
    Identifier of the participating user (agent).

  - `data.participants.is_creator` (boolean)
    True for the participant who created the event.

  - `data.participants.is_organizer` (boolean)
    True for the participant who owns/hosts the event.

  - `data.products` (array)
    Property listings linked to the event.

  - `data.products.ext_product_id` (string)
    Identifier of the linked property listing.

  - `data.products.ext_domain_id` (string)
    Identifier of the domain the listing belongs to.

  - `data.contacts` (array)
    Contacts (customers) linked to the event.

  - `data.contacts.ext_contact_id` (string)
    Identifier of the linked contact.

  - `data.contacts.ext_domain_id` (string)
    Identifier of the domain the contact belongs to.

  - `data.notes` (string | null)
    Free-text notes attached to the event.

  - `data.visio_url` (string | null)
    Link to the video-conference room (used when `appointment_mode` is `VISIO`).

  - `data.immo360_organizer_url` (string | null)
    Link used by the agent to host the live/virtual visit.

  - `data.immo360_participation_url` (string | null)
    Link shared with attendees to join the live/virtual visit.

  - `data.archived` (boolean | null)
    True when the event has been archived (hidden from default listings but restorable).

  - `data.parent_id` (integer | null)
    Identifier of the parent event when this entry is an occurrence of a recurring series.

  - `data.recurrence` (object | null)
    Recurrence definition of the event, when it is part of a recurring series.

## Response 401:

  - `401` (unknown)
    Authentication required

## Response 401 fields (application/json):

  - `error` (object)

  - `error.code` (string, required)

  - `error.message` (string, required)

## Response 403:

  - `403` (unknown)
    Insufficient permissions

## Response 403 fields (application/json):

  - `error` (object)

  - `error.code` (string, required)

  - `error.message` (string, required)

## Response 404:

  - `404` (unknown)
    Resource not found

## Response 404 fields (application/json):

  - `error` (object)

  - `error.code` (string, required)

  - `error.message` (string, required)

## Response 422:

  - `422` (unknown)
    Validation failed

## Response 422 fields (application/json):

  - `error` (object)

  - `error.code` (string)
    Enum: "VALIDATION_ERROR"

  - `error.message` (string)

  - `error.details` (array)

  - `error.details.field` (string)

  - `error.details.message` (string)

