Skip to navigation

Update Event

Beta

Updates an event. Send only the fields to change. To make the update conditional, send the event’s current etag in If-Match: a stale value returns 412. Without If-Match the update applies to the event as it is; a change that lands while it runs returns 409 race_condition, so retry. Send If-Match when replacing attendees, so you don’t overwrite a response that arrived in the meantime.

  • One-off or series UUID: changes the event itself. For a series, the change applies to every date that has not been edited individually.
  • Dated ID (<uuid>_<slot>): changes one date (mode=single, the default) or that date and every later date (mode=future). all_day, timezone and recurrence cannot be sent for a dated ID.

Once a date has started, its start can no longer change (409 event_already_started), but its end and status can; for a one-off or series UUID, send the unchanged start with the new end. Once it has ended, only title, description, location, metadata and attendees can change. During the few seconds a date is starting, schedule changes return 409 event_starting; retry shortly.

Sends calendar.event.updated. With send_invites: true the organizer inbox also emails the updated invitation to every attendee. Requires the calendar_event_update permission.

Emailing attendees counts one send per attendee against the organization, pod and inbox send limits, charged before the change is saved; an over-limit request returns 429 rate_limit_exceeded and changes nothing.

Calendar is in private beta in US production (api.agentmail.to). It is unavailable in EU production (api.agentmail.eu). Organizations without access receive a 403.

Authentication

AuthorizationBearer

Bearer authentication of the form Bearer <token>, where token is your auth token.

Path parameters

inbox_idstringRequired
The ID of the inbox.
event_idstringRequired

ID of a calendar event. A one-off or recurring event is addressed by its UUID. One date of a recurring event is addressed by a dated ID, <uuid>_<slot>: <uuid>_t20261015T090000 for a timed date (the original wall-clock start in the event's time zone) or <uuid>_d20261015 for an all-day date. Dated IDs are stable: moving a date keeps its original ID.

Headers

If-MatchstringOptional

The event's or date's current etag, from the latest read or write response. Optional; makes the update conditional; * matches any current version.

Query parameters

modeenumOptional

Which dates a change to a dated event applies to. single (default) changes only this date. future changes this date and every later date of the series. Applies only to dated event IDs; sending mode with a one-off or series UUID is a 400.

Allowed values:

Request

This endpoint expects an object.
all_daybooleanOptional

Changing all_day requires start, end and timezone in the same request. Not accepted for dated event IDs.

attendeeslist of objectsOptional
Replaces the attendee list.
descriptionstring or nullOptional

Set to null to clear.

duration_modeenumOptional

How the event's length is kept when a date crosses a daylight-saving change.

  • exact: the event lasts the same elapsed time. Default for one-off timed events.
  • nominal: the event keeps its wall-clock end time (a 09:00 to 10:00 meeting stays 09:00 to 10:00 local time). Default for recurring timed events.

All-day events are always nominal.

Allowed values:
endstringOptional

New end. For a one-off or series UUID, send it together with start. A dated ID accepts end alone.

locationstring or nullOptional

Set to null to clear.

metadataany or nullOptional

Replaces the metadata (any JSON value, usually an object). Set to null to clear.

recurrenceobject or nullOptional

Replaces the recurrence. Set to null to turn a series into a one-off event (only when no date of it has been edited). Not accepted for dated event IDs.

send_invitesbooleanOptional

When true, emails the updated invitation to every attendee. Only the organizer (an api event) can send. Defaults to false.

startstringOptional

New start. For a one-off or series UUID, send it together with end. Not accepted with mode=future.

statusenumOptional

Status of the event. A cancelled event or date stays readable but sends no calendar.event.starting or calendar.event.ending webhooks (cancelling a date that is already running still sends its calendar.event.ending). A date cancelled by deleting its dated ID is removed from the series instead, so reading it can return 404 or 410.

Allowed values:
timezonestringOptional
New time zone. Not accepted for dated event IDs.
titlestringOptional

Response

This endpoint returns an object.
eventobject

A calendar event. The same shape is used by every response, list item and webhook. kind says whether it is a one-off event, the definition of a recurring series, or one date of a series.

operation_idstring

ID of the change this request made. The calendar.event.created, calendar.event.updated, calendar.event.deleted or calendar.event.responded webhook for the change carries the same value as its event_id, so you can match webhooks to your own requests.

Errors

400
Validation Error
403
Forbidden Error
404
Not Found Error
409
Conflict Error
410
Event Expired Error
412
Precondition Failed Error
413
Payload Too Large Error
429
Rate Limit Error