uid plus only the fields you want to change; every field you omit keeps its stored value. Rescheduling a meeting is uid + start. Renaming one is uid + title; to rename a calendar itself, use update_calendar. To put an event on a different calendar, use move_calendar_events. Nothing you don’t mention is touched — a recurring series stays recurring, attendees invited elsewhere stay invited, the location survives.
There is no full-replacement mode. Because omission means “keep”, clearing a field needs an explicit empty value:
A call that names no changeable field at all (just a
uid) is rejected.
Times. An explicit end always wins. Omitting end while moving start keeps the event’s stored duration — “push the standup an hour later” is a two-field call and won’t silently stretch the meeting. Omitting both keeps the stored time.
All-day events. A partial edit keeps an all-day event all-day: renaming it or changing its reminder leaves its dates alone, and a date-only start moves it while keeping its length in days. To switch an event between all-day and timed, pass both start and end, as dates (end exclusive) or as date-times. With only one of them, the other side’s clock time or length would have to be made up, so the edit is refused. timeZone does not affect all-day dates.
Reminders. Reminders the event already has, including ones written by another client, carry over unchanged unless you pass reminderMinutesBefore. A number replaces all of them with one reminder, and "none" removes them. A call that changes only the reminder edits the reminders in place: attendees keep their responses and are not notified. On a series, that replaces the reminder on every occurrence, including ones you changed individually. To change one occurrence’s reminder, pass its recurrenceId. On a series with attendees, that works only once the occurrence has individual changes, because creating them would reset the attendees’ responses to it.
Attendees. attendees replaces the whole list. addedAttendees / removedAttendees change specific addresses against the stored list instead, so you can drop one person without reading the list back first. They cannot be combined with attendees.
One occurrence. Pass recurrenceId (the occurrence’s original start) to change a single occurrence of a repeating series; the master rule and every other occurrence stay unchanged. Omitted fields merge against that occurrence’s stored state — an override you wrote earlier if there is one, otherwise the occurrence’s own slot — so re-editing a moved occurrence never drags it back to the series’ time. Attendee deltas cannot be combined with recurrenceId (membership is a property of the series).
By default the attendees are re-notified by iMIP. Pass notify: "none" to make the edit silent — useful for a trivial change such as dropping your own duplicate address.
Parameters
All parameters ofcreate_calendar_event, each of them optional here, plus the fields below.
string
required
The event’s iCalendar UID, from
create_calendar_event or list_calendar_events. Up to 255 characters; must not contain path separators.string[]
The complete attendee list after the edit, replacing the stored one.
[] uninvites everyone and turns the event into a personal one. Omit to keep the stored attendees.string[]
Email addresses to invite on top of the stored attendees. Cannot be combined with
attendees.string[]
Email addresses to uninvite, matched case-insensitively against the stored attendees. Removing an address that isn’t invited is a no-op. Cannot be combined with
attendees.string | object
New repeat rule for the whole series, in the same shape
create_calendar_event takes. The literal string "none" collapses the series to a single event. Omit to keep the stored rule.string
default:"all"
all re-sends invitations/updates to the attendees; none makes the edit silent (the attendees on the event are not notified). A removed attendee may still receive a cancellation.string
ISO 8601 instant naming one occurrence of a repeating series (its original start) to change in isolation. For an all-day series, the occurrence’s date (
2026-06-23). Cannot be combined with recurrence or with attendee deltas.integer | "none"
Replaces every stored reminder with one that fires this many minutes before the start.
"none" removes all reminders. Omit to keep the stored ones.Examples
Reschedule a meeting an hour later, keeping its length, attendees, title and recurrence:Call
Result
Call
Result
Call
Result
Errors
Nothing to update: …— the call named no changeable field.Event not found: <uid>— no event with that UID in the target calendar.Event end must be after its start. Nothing was changed.Calendar not found: <url>— thecalendarUrldidn’t resolve.Removing those attendees would leave the event with none.— a delta removed the last attendee. To strip every attendee deliberately, passattendees: []instead.recurrenceId … does not match an occurrence of this series— the instant must equal an occurrence’s original start (its date, for an all-day series).This series is not all-day; pass recurrenceId as the occurrence's original start date-time …— a daterecurrenceIdon a timed series.This series is all-day; pass recurrenceId as the occurrence's date …— a date-timerecurrenceIdon an all-day series. It is refused, not truncated, because a date-time’s calendar day depends on its offset.To switch an event between all-day and timed, pass both start and end …— only one of them was passed, in the other kind.Pass `start` and `end` both as dates … or both as date-times …— a date mixed with a date-time.An all-day event's `end` is exclusive …— an all-dayendon or before itsstart. The message names the rightend.The occurrence on <recurrenceId> was cancelled, so there is nothing to edit. Nothing was changed.— the occurrence was cancelled withdelete_calendar_event, so an override for it would be an orphan the series never shows.
- Individually-customized occurrences. A whole-event edit would flatten them. Edit the occurrence directly with
recurrenceId, or re-specify the whole event (start,end,title,attendeesandrecurrence) to deliberately replace the series — note that this escape hatch does discard the customizations. - Cancelled occurrences. A series with an occurrence cancelled via
delete_calendar_eventcan’t be edited as a whole event: the rebuild would restore the cancelled instance and re-invite everyone to it. - An attendee stored in a non-email address format. Pass the complete
attendeeslist instead. - An event stored with a
DURATIONand no end. Passstartandend. - A moved series that contradicts its repeat rule. Moving
startonto a weekday the kept rule doesn’t list (e.g. a Friday underBYDAY=TU) would add one occurrence rather than move the series. Passrecurrencewith the new rule as well.
What an edit still does not preserve
A whole-event edit rebuilds the VEVENT, which resets attendee response status (PARTSTAT) to needs-action. This predates partial updates and applies to every edit, including a one-field one. Reminders (VALARM) are carried over unchanged.