Skip to main content
Creates an event with the authenticated user as organizer. When attendees are given, standard iMIP invitations go out to each of them; omit the field (or pass an empty array) to create a personal event — a block of your own time such as a focus block or a travel buffer — with no invitations sent. Pass start/end as dates for an all-day event — a day off, a vacation. Pass recurrence to create a repeating series in the same call, and reminderMinutesBefore to be reminded before it starts.

Parameters

string
required
Event title. 1–200 characters.
string
required
Start datetime, ISO 8601, e.g. 2026-07-14T10:00:00+02:00 — or a date, e.g. 2026-10-03, for an all-day event. For a series, the first occurrence.
string
required
End datetime, ISO 8601. Must be after start. For an all-day event a date, and exclusive (RFC 5545): the day after the last day. A day off on October 3 is start: "2026-10-03", end: "2026-10-04". start and end must both be dates or both be date-times.
integer
Adds one reminder that fires this many minutes before the start (0 to 40,320, which is four weeks). For an all-day event the start is midnight, so 900 fires at 09:00 the day before. Omit for no reminder.
string[]
Up to 50 attendee email addresses. Each receives an invitation. Omit — or pass [] — for a personal event with no invitations.
string
default:"all"
all (default) sends invitations to the attendees; none writes the event without inviting anyone — useful when an invitation has already been sent out of band. Irrelevant without attendees.
string
A CalDAV URL from list_calendars. Defaults to the user’s default calendar.
string
Event description, up to 5,000 characters.
string
Event location, up to 500 characters.
string | object
Turns the event into a repeating series; omit for a one-off event. Two forms:Structured object:Raw RRULE string: a single-line iCalendar RRULE starting with FREQ=, up to 1,000 characters, e.g. FREQ=WEEKLY;BYDAY=TH or FREQ=DAILY;COUNT=10. UNTIL may be a date (UNTIL=20261231) or a UTC date-time (UNTIL=20261231T000000Z). Either way it is converted to match the event, as RFC 5545 requires: a date on an all-day series, and on a timed series a UTC date-time, where a date means the end of that day in the event’s time zone. Raw rules are only lightly validated — malformed rules surface as server errors.

Example

Call
Result
A personal event needs nothing but a title and a time:
Call
Result
An all-day vacation with a reminder at 09:00 the day before (an all-day event starts at 00:00, so 900 minutes back is 09:00):
Call
Result
Keep the returned uid — it identifies the event for updates, deletion, and RSVPs. To invite people to an event created without attendees, pass addedAttendees to update_calendar_event later.

Errors

  • Event end must be after its start. Nothing was created.
  • An all-day event's `end` is exclusive … — an all-day end on or before its start. The message names the right end.
  • Pass `start` and `end` both as dates … or both as date-times … — a date mixed with a date-time.
  • No calendar available to create the event in. — the user has no calendar and none was specified.
  • Calendar not found: <url> — the calendarUrl didn’t resolve.
  • Provide at most one of `until` or `count`, not both. — conflicting series bounds.