Skip to main content

Events API

List Events​

Retrieves calendar events from all connected providers (Google Calendar, Microsoft Outlook, Apple Calendar, CalDAV) for the authenticated user.

Fetches events from multiple calendar providers simultaneously with support for pagination, filtering by date range and specific calendars, and handling of recurring events. Returns events from all supported calendar providers, sorted by start time within each page, with "load more" functionality using nextPageToken tokens.

Endpoint: GET /events

Request Parameters​

pageSizenumber

Number of events to fetch per request. Maximum value is capped at 1000.

Default: 250
startstring

ISO date string to filter events starting from this date. Date strings are automatically normalized to handle malformed ISO 8601 formats. When omitted, the range starts 30 days before the time of the request — except for Google accounts under the free-busy scope, where it starts at the time of the request.

Default: 30 days before now
endstring

ISO date string to filter events ending before this date. Date strings are automatically normalized to handle malformed ISO 8601 formats. When omitted, the range ends 90 days after the time of the request — except for Google accounts under the free-busy scope, where it ends 30 days after it.

Default: 90 days after now
calendarIdsstring

JSON stringified object of calendar IDs per provider. If not provided, events from all calendars will be fetched.

Calendar IDs that are not associated with the authenticated user's connected accounts will be silently ignored.

Example
'{"google":["john.andrew@mobiscroll.com"],"microsoft":[],"apple":[],"caldav":[]}'
Default: undefined
nextPageTokenstring

Base64 encoded JSON pagination state object containing token information for each provider (Google, Microsoft, Apple, CalDAV). This parameter should be passed as-is from the previous response when loading more events. It does not carry the other filters: send the same start, end, calendarIds and singleEvents with every page.

Default: undefined
singleEventsboolean

Controls how recurring events are returned:

  • true - Expands recurring events into individual instances within the specified time range
  • false - Returns only the master recurring event (series definition) without individual occurrences
Default: true

Response​

eventsArray<CalendarEvent>

Array of calendar events from all supported calendar providers, sorted chronologically by start time within this page. Each CalendarEvent object contains:

providerstring

Provider name: 'google', 'microsoft', 'apple', or 'caldav'

idstring

Event ID

calendarIdstring

Calendar ID

titlestring

Event title/summary

descriptionstring

Event description or notes (optional)

startDate

Event start date/time

endDate

Event end date/time

allDayboolean

True if all-day event

recurringEventIdstring

ID of the recurring event series (if this is an instance of a recurring event) (optional)

colorstring

Event background color (optional)

locationstring

Event location (optional)

attendeesArray<EventAttendee>

Array of event attendees (optional).

For Google this mirrors the event's guest list exactly as Google returns it: nothing is added and nothing is inferred. An event with no guests has an empty array, and the organizer appears only when Google itself lists them among the guests.

One consequence worth planning for: when an event is organised by a group calendar, Google often does list that calendar's address among the guests, flagged organizer: true. Those addresses end in @group.calendar.google.com with a varying prefix, and they are not mailboxes. If you render or count guests, or send mail to them, filter them out on your side — this happens whenever the event was organised by a group calendar, regardless of which calendar you read the event from.

For Microsoft, iCloud and CalDAV, where the protocol keeps the organizer outside the guest list, the organizer is added as an entry flagged organizer: true. The provider's full organizer record is always available under original.

Each object contains:

emailstring

Attendee email address

statusstring

Response status: 'accepted', 'declined', 'tentative', or 'none'

organizerboolean

True if this attendee is the event organizer (optional)

customobject

Custom key-value pairs for additional event data (optional)

conferencestring

Conference meeting URL (optional).

conferenceDataobject

Provider-specific conference metadata returned by the API (optional). Use this when you need details beyond the conference link.

providerstring

Conference provider identifier, which depends on the calendar provider. Google: the conference solution type Google reports, for example hangoutsMeet for Google Meet or addOn for a link added through the API or an add-on, and google-meet when Google reports no type. Microsoft: teams. Apple and CalDAV: caldav.

Additional fields vary by provider and are returned as-is when available. Typical examples:

  • Google: entryPoints, conferenceSolution, conferenceId
  • Microsoft: provider meeting details from Graph (for example join URL-related fields)
  • Apple/CalDAV: usually only provider
availabilitystring

Event availability: 'busy' or 'free' (optional)

privacystring

Event privacy: 'public', 'private', or 'confidential' (optional)

statusstring

Event status: 'confirmed', 'tentative', or 'cancelled' (optional)

lastModifiedstring

ISO 8601 timestamp of when the event was last modified (optional)

linkstring

Public event link (optional)

originalobject

Original event object from the provider

pageSizenumber

Number of events per page.

nextPageTokenstring

Base64 encoded pagination state for the next request. Pass this value as the nextPageToken parameter when loading more events. Only included in the response if more events are available.

infoobject

Status of each provider queried for this page, keyed by provider name, for example "google": "Google returned results" and "microsoft": "No Microsoft account connected". A provider that returned an error appears here with its error message; its events are left out of this page, and later pages of the same listing do not query it again. The values are informational text — do not parse them. Providers that were not queried for this page are absent.

Error Responses​

  • 400 - Bad Request. Invalid nextPageToken parameters
  • 401 - Unauthorized. Invalid or missing bearer token
  • 500 - Internal Server Error. Provider error or unexpected failure

Examples​

Fetch initial events with date range filter
GET /events?pageSize=50&start=2025-10-01T00:00:00Z&end=2025-10-31T23:59:59Z
Response
{
"events": [
{
"id": "event123",
"title": "Team Meeting",
"start": "2025-10-15T10:00:00Z",
"end": "2025-10-15T11:00:00Z",
"provider": "google",
"allDay": false,
"location": "Conference Room A",
"color": "#9fc6e7",
"lastModified": "2026-03-10T13:36:08.000Z"
}
],
"pageSize": 50,
"nextPageToken": "eyJnb29nbGUiOnsidG9rZW4iOnsiY2FsMTIzIjp7Im5leHRQYWdlVG9rZW4iOiJhYmMifX0sImlzRGVwbGV0ZWQiOmZhbHNlfX0=",
"info": {
"google": "Google returned results",
"microsoft": "No Microsoft account connected",
"apple": "No Apple account connected",
"caldav": "Caldav returned no events"
}
}
Load more events using nextPageToken (same filters)
GET /events?pageSize=50&start=2025-10-01T00:00:00Z&end=2025-10-31T23:59:59Z&nextPageToken=eyJnb29nbGUiOnsidG9rZW4iOnsiY2FsMTIzIjp7Im5leHRQYWdlVG9rZW4iOiJhYmMifX0sImlzRGVwbGV0ZWQiOmZhbHNlfX0=
Filter by specific calendars
GET /events?pageSize=25&calendarIds=%7B%22google%22:%5B%22john.andrew%40mobiscroll.com%22%5D,%22microsoft%22:%5B%5D,%22apple%22:%5B%5D,%22caldav%22:%5B%5D%7D
Get recurring event series masters (not expanded)
GET /events?pageSize=50&singleEvents=false
info
  • Events are sorted by start time within each page only. Providers fill a page one after another (Google, Microsoft, Apple, then CalDAV), so a later page can contain events that start before events on an earlier page. If the order across pages matters, fetch every page and sort the combined result
  • The pageSize is shared by all providers, not applied per provider
  • Send the same start, end, calendarIds and singleEvents with every page — the nextPageToken does not carry them
  • A provider that fails does not fail the request: its events are left out, the response is still 200, and info reports the error for that provider. Check info before treating a short or empty page as complete
  • Maximum pageSize is capped at 1000 events
  • The nextPageToken token is Base64 encoded and should be passed as-is to subsequent requests
  • Each provider (Google, Microsoft, Apple, CalDAV) tracks its own pagination state independently
  • The nextPageToken parameter is only included in the response when more events are available
  • Date strings are automatically normalized to handle malformed ISO 8601 formats before parsing
  • The color property contains the background color value directly (not an object)
  • Conference links are returned in the conference string field
  • All event endpoints return events in the unified CalendarEvent format across all supported calendar providers
Conference raw data examples

The conferenceData field stores provider-specific raw meeting metadata.

Google
{
"conferenceData": {
"conferenceId": "abc-defg-hij",
"entryPoints": [
{
"entryPointType": "video",
"uri": "https://meet.google.com/abc-defg-hij"
}
]
}
}
Microsoft
{
"onlineMeeting": {
"joinUrl": "https://teams.microsoft.com/l/meetup-join/...",
"conferenceId": "123456789"
}
}

Create Event​

Creates a new calendar event in the specified calendar for the authenticated user.

Supports creating single events or recurring events with recurrence rules. The event is created in the provider's calendar system (Google Calendar, Microsoft Outlook, Apple Calendar, or CalDAV) based on the calendar ID.

Endpoint: POST /event

Request Body​

providerstringRequired

Calendar provider where the event will be created. One of: 'google', 'microsoft', 'apple', or 'caldav'.

calendarIdstringRequired

The calendar identifier where the event will be created.

titlestringRequired

The event title/summary.

startstringRequired

ISO date string for the event start time.

endstringRequired

ISO date string for the event end time.

descriptionstring

Event description or notes.

Default: undefined
locationstring

Event location (address, meeting room, etc.).

Default: undefined
allDayboolean

Whether this is an all-day event.

Default: false
attendeesstring[]

Array of attendee email addresses.

Default: undefined
recurrenceobject

Recurrence rule for creating a recurring event series. Object with the following properties:

frequencystringRequired

Recurrence frequency: 'DAILY', 'WEEKLY', 'MONTHLY', or 'YEARLY'

intervalnumber

Interval between occurrences (e.g., 2 for every 2 weeks)

countnumber

Number of occurrences. Use either count or until, not both.

untilstring

Last date of the series, in the iCalendar (RFC 5545) basic format YYYYMMDDTHHMMSSZ in UTC, for example 20261231T235959Z — not ISO 8601 with dashes and colons. For Google, Apple and CalDAV the value is written into the recurrence rule unchanged, so another format can be rejected by the provider or produce a wrong series. Microsoft uses only the date part. Use either count or until, not both: Connect does not check this, and the providers handle the combination differently.

byDaystring[]

Array of weekday codes: ['MO', 'TU', 'WE', 'TH', 'FR', 'SA', 'SU']

byMonthDaynumber[]

Array of days of the month (1-31)

byMonthnumber[]

Array of months (1-12)

Default: undefined
customobject

Custom key-value pairs for additional event data.

Default: undefined
External IDs

If you need to associate provider-generated event IDs with your own domain entities, store your external/business ID in custom (for example custom.externalEventId = "icoll-rdv-123").

conferencestring

Conference meeting URL (optional). Backward compatibility is preserved for legacy conference string usage.

Default: undefined
conferenceDataobject

Extra conference options and provider-specific metadata (optional).

providerstring

Optional. Not used when the event is written — the calendar provider decides the conference type. In the response, conferenceData.provider is the value the provider reports, as described for GET /events.

autoGenerateboolean

Set to true to auto-generate a provider meeting link when supported. When autoGenerate is true, conference and other conferenceData fields are ignored.

Default: undefined
availabilitystring

Event availability: 'free' or 'busy'.

Default: undefined
privacystring

Event privacy: 'public', 'private', or 'confidential'.

Default: undefined
statusstring

Event status: 'confirmed', 'tentative', or 'cancelled'.

Default: undefined

Response​

Returns 201 Created with the created event as a CalendarEvent object at the root of the body, with no wrapper. As in GET /events, conference is the meeting URL as a string and conferenceData is an object with the conference provider and the provider-specific details. The most used fields:

idstring

The event ID — the same identifier GET /events returns and PUT /event and DELETE /event accept. Store it as-is and pass it back unchanged.

titlestring

The event title.

startDate

The event start date/time.

endDate

The event end date/time.

Error Responses​

A 400 response has a message field with the reason.

  • 400 - Bad Request. Missing provider, calendarId, title, start or end, an invalid provider, or the provider could not create the event — for example Calendar not found, No connected Google account has access to this calendar or Failed to create event
  • 401 - Unauthorized. Invalid or missing bearer token
  • 403 - Forbidden. The access token's scope does not allow writes (Write access denied for current scope), or no connected account granted calendar access — see Scopes
  • 500 - Internal Server Error. Unexpected failure

Examples​

Create a simple event
POST /event
Content-Type: application/json
{
"provider": "google",
"calendarId": "primary",
"title": "Team Meeting",
"description": "Discuss project updates",
"start": "2025-11-01T10:00:00Z",
"end": "2025-11-01T11:00:00Z",
"location": "Conference Room A",
"conference": {
"url": "https://meet.google.com/abc-defg-hij",
"provider": "google-meet"
}
}
Response (201 Created)
{
"provider": "google",
"id": "event123abc",
"calendarId": "primary",
"title": "Team Meeting",
"start": "2025-11-01T10:00:00.000Z",
"end": "2025-11-01T11:00:00.000Z",
"allDay": false,
"location": "Conference Room A",
"conference": "https://meet.google.com/abc-defg-hij",
"conferenceData": {
"provider": "addOn",
"entryPoints": [
{ "entryPointType": "video", "uri": "https://meet.google.com/abc-defg-hij" }
],
"conferenceSolution": { "key": { "type": "addOn" } }
},
"attendees": [],
"color": "#9fc6e7",
"availability": "busy",
"privacy": "public",
"status": "confirmed",
"lastModified": "2026-03-10T13:36:08.000Z",
"link": "https://calendar.google.com/calendar/event?eid=...",
"original": {
"kind": "calendar#event",
"etag": "\"3366428166344000\"",
"id": "event123abc",
"summary": "Team Meeting"
...
}
}
Create a recurring event
POST /event
Content-Type: application/json
{
"provider": "microsoft",
"calendarId": "AAMkAGVmMDEz...",
"title": "Weekly Standup",
"start": "2025-11-01T09:00:00Z",
"end": "2025-11-01T09:30:00Z",
"allDay": false,
"recurrence": {
"frequency": "WEEKLY",
"interval": 1,
"count": 10,
"byDay": ["MO", "WE", "FR"]
}
}
Create an all-day event
POST /event
Content-Type: application/json
{
"provider": "apple",
"calendarId": "https://caldav.icloud.com/.../calendars/...",
"title": "Conference",
"start": "2025-11-15T00:00:00Z",
"end": "2025-11-16T00:00:00Z",
"allDay": true,
"description": "Annual tech conference"
}
info
  • The provider parameter must match the calendar provider of the calendarId
  • For recurring events, either count or until can be specified, but not both
  • The byDay property is typically used with WEEKLY frequency
  • All-day events should have start and end times at midnight (00:00:00)
  • The fields present in the returned event, and the contents of original and conferenceData, vary by provider (Google, Microsoft, Apple, CalDAV)

Update Event​

Updates an existing calendar event.

Supports updating single events, recurring event series, or individual instances of recurring events. For recurring events, you can specify whether to update only the current instance, all following instances, or the entire series.

Endpoint: PUT /event

Request Body​

providerstringRequired

Calendar provider where the event exists. One of: 'google', 'microsoft', 'apple', or 'caldav'.

eventIdstringRequired

The event identifier to update — the id returned by GET /events or POST /event.

calendarIdstringRequired

The calendar identifier containing the event.

recurringEventIdstring

The ID of the recurring event series. Required when updating an instance of a recurring event.

Default: undefined
updateModestring

Controls which events in a recurring series are updated:

  • 'this' - Update only this specific instance
  • 'following' - Update this and all following instances
  • 'all' - Update all instances in the series

Only applicable for recurring events. If not specified, updates the single event or series master.

Default: undefined
titlestring

The event title/summary.

startstring

ISO date string for the event start time.

endstring

ISO date string for the event end time.

descriptionstring

Event description or notes.

locationstring

Event location.

allDayboolean

Whether this is an all-day event.

attendeesstring[]

Array of attendee email addresses.

customobject

Custom key-value pairs for additional event data.

conferencestring

Conference meeting URL update (optional).

conferenceDataobject

Extra conference options and provider-specific metadata update (optional).

providerstring

Optional. Not used when the event is written — the calendar provider decides the conference type. In the response, conferenceData.provider is the value the provider reports, as described for GET /events.

autoGenerateboolean

Set to true to auto-generate a provider meeting link when supported. When autoGenerate is true, conference and other conferenceData fields are ignored.

Conference update behavior by provider
  • google: supports conference and conferenceData.autoGenerate
  • microsoft: supports conferenceData.autoGenerate (Teams link generation); manual conference is ignored for online meeting generation
  • apple and caldav: support conference; conferenceData.autoGenerate is ignored
  • conferenceData.autoGenerate takes precedence over conference when both are provided
  • conferenceData.provider is not used when writing; responses report the provider's own value (for example hangoutsMeet, addOn, teams or caldav)
availabilitystring

Event availability: 'free' or 'busy'.

privacystring

Event privacy: 'public', 'private', or 'confidential'.

statusstring

Event status: 'confirmed', 'tentative', or 'cancelled'.

recurrenceobject

Recurrence rule for updating recurring event properties. Same structure as create recurrence.

Response​

Returns 200 OK with the updated event as a CalendarEvent object at the root of the body, with no wrapper — the same shape as the Create Event response.

Error Responses​

A 400 response has a message field with the reason.

  • 400 - Bad Request. Missing provider, eventId or calendarId, an invalid provider, or the provider could not update the event — for example Event not found, Calendar not found or Failed to update event
  • 401 - Unauthorized. Invalid or missing bearer token
  • 403 - Forbidden. The access token's scope does not allow writes (Write access denied for current scope), or no connected account granted calendar access — see Scopes
  • 500 - Internal Server Error. Unexpected failure

Examples​

Update a simple event
PUT /event
Content-Type: application/json
{
"provider": "google",
"eventId": "event123abc",
"calendarId": "primary",
"title": "Updated Team Meeting",
"start": "2025-11-01T14:00:00Z",
"end": "2025-11-01T15:00:00Z",
"conference": {
"url": "https://meet.google.com/new-room-link",
"provider": "google-meet"
}
}
Update a single instance of a recurring event
PUT /event
Content-Type: application/json
{
"provider": "microsoft",
"eventId": "instance456",
"recurringEventId": "series123",
"calendarId": "AAMkAGVmMDEz...",
"updateMode": "this",
"title": "Standup - Special Topic Today",
"start": "2025-11-01T09:00:00Z",
"end": "2025-11-01T10:00:00Z"
}
Update all future occurrences
PUT /event
Content-Type: application/json
{
"provider": "apple",
"eventId": "recurring-event-id",
"calendarId": "https://caldav.icloud.com/.../calendars/...",
"updateMode": "following",
"location": "New Conference Room B"
}
info
  • The provider parameter must match the calendar provider where the event exists
  • For recurring events, use recurringEventId and updateMode to control update scope
  • Only include fields you want to update; omitted fields remain unchanged
  • When using updateMode: 'this' on a recurring event, a new exception instance may be created
  • The updateMode parameter behavior may vary slightly between providers
caution

For apple and caldav, "omitted fields remain unchanged" applies only to custom, and only for apple — resending custom on an apple update merges it with the stored value, but on caldav it replaces the stored value instead, so include the complete object each time. Every other omitted field, and any calendar property set directly in Apple Calendar that Connect does not expose (alarms, categories, organizer details), is not preserved and is removed by the update. To avoid losing data on these two providers, read the event with GET /events first and include every field you want kept in the update call, not only the ones you are changing.


Delete Event​

Deletes a calendar event.

Supports deleting single events, recurring event series, or individual instances of recurring events. For recurring events, you can specify whether to delete only the current instance, all following instances, or the entire series.

Endpoint: DELETE /event

Request Body​

Send the parameters as a JSON body. If the body is empty, they are read from the query string instead, for example DELETE /event?provider=google&calendarId=primary&eventId=event123abc. A non-empty body takes precedence, and the query string is then ignored.

providerstringRequired

Calendar provider where the event exists. One of: 'google', 'microsoft', 'apple', or 'caldav'.

eventIdstringRequired

The event identifier to delete — the id returned by GET /events or POST /event.

calendarIdstringRequired

The calendar identifier containing the event.

recurringEventIdstring

The ID of the recurring event series. Required when deleting an instance of a recurring event.

Default: undefined
deleteModestring

Controls which events in a recurring series are deleted:

  • 'this' - Delete only this specific instance
  • 'following' - Delete this and all following instances
  • 'all' - Delete all instances in the series

Only applicable for recurring events. If not specified, deletes the single event or entire series.

Default: undefined

Response​

Returns 204 No Content with an empty body.

Error Responses​

A 400 response has a message field with the reason.

  • 400 - Bad Request. Missing provider, eventId or calendarId, an invalid provider, or the provider could not delete the event — for example Event not found, Calendar not found or Failed to delete event
  • 401 - Unauthorized. Invalid or missing bearer token
  • 403 - Forbidden. The access token's scope does not allow writes (Write access denied for current scope), or no connected account granted calendar access — see Scopes
  • 500 - Internal Server Error. Unexpected failure

Examples​

Delete a simple event
DELETE /event
Content-Type: application/json
{
"provider": "google",
"eventId": "event123abc",
"calendarId": "primary"
}
Response
HTTP/1.1 204 No Content
Delete a single instance of a recurring event
DELETE /event
Content-Type: application/json
{
"provider": "microsoft",
"eventId": "instance456",
"recurringEventId": "series123",
"calendarId": "AAMkAGVmMDEz...",
"deleteMode": "this"
}
Delete entire recurring series
DELETE /event
Content-Type: application/json
{
"provider": "apple",
"eventId": "recurring-event-id",
"calendarId": "https://caldav.icloud.com/.../calendars/...",
"deleteMode": "all"
}
info
  • The provider parameter must match the calendar provider where the event exists
  • For recurring events, use recurringEventId and deleteMode to control deletion scope
  • Deleting with deleteMode: 'this' creates an exception (cancelled instance) in the series
  • Deleting with deleteMode: 'all' removes the entire recurring series
  • Deleted events cannot be recovered through the API
  • The deleteMode parameter behavior may vary slightly between providers