Everything an AI agent can do with the Google Calendar API.

A reference guide for building AI agents: every method, how to authenticate, and the permissions each one needs.

Endpoints31
API versionv3
Last updated23 June 2026
Orientation

How the Google Calendar API works.

The Google Calendar API is how an app or AI agent works with a person's calendars: reading and creating events, checking when people are free or busy, organizing the calendars a user follows, and managing who is allowed to see or change a calendar. Access is granted through OAuth, where the scopes a token carries decide which calendars it can reach and whether it can only read or also write. Google can push a notification to an app whenever a watched calendar changes, so it learns about activity without repeatedly asking.

31Endpoints
7Capability groups
13Read
18Write
12Permissions
Authentication
Every call authenticates with an OAuth 2.0 access token sent as 'Authorization: Bearer '. A token can represent a single user who has consented, or an app's own service account, which in Google Workspace can be granted domain-wide delegation to act as users across the organization. There is no API-key path for reading or writing private calendar data.
Permissions
Access is governed by OAuth scopes, each a full URL under https://www.googleapis.com/auth/. They range from broad (calendar, full read and write across every calendar the user can reach) to narrow (calendar.events for events only, calendar.events.readonly for read-only events, calendar.acls for sharing rules, calendar.events.freebusy for availability only, calendar.settings.readonly for settings). A .readonly scope cannot write. Picking the narrowest scope that covers the work limits what a token can reach.
Versioning
The API has one version, v3, carried in the request path under /calendar/v3. There is no dated version header. New behavior, like the secondary-calendar ownership transfer added in June 2026, ships through the release notes as additive changes rather than a new version number, so an integration pins to v3 and tracks the notes.
Data model
The API is resource-oriented JSON over HTTPS at https://www.googleapis.com/calendar/v3. The core resources are calendars (the calendars themselves), events (nested under a calendar), the calendar list (the calendars a user has added to their own view), acl (the rules that say who can reach a calendar), free/busy (an availability lookup), settings, and colors. Watch requests open push-notification channels on the resources that support them.
Connect & authenticate

Connection & authentication methods.

How an app or AI agent connects to Google Calendar determines what it can reach. There is a route for making calls, a route for receiving change notifications, and a hosted server that exposes Calendar tools to agents, and each is governed by the OAuth grant behind it and the scopes that grant carries.

Ways to connect

REST API (v3)

The Calendar API answers at https://www.googleapis.com under the /calendar/v3 path, taking JSON request bodies and returning JSON. A call authenticates with an OAuth 2.0 access token in the Authorization header, and lists page through a pageToken with an optional nextSyncToken for incremental sync.

Best forConnecting an app or AI agent to Google Calendar.
Governed byThe OAuth access token and the scopes it carries.
Docs ↗

Push notifications (watch)

A watch request on events, the calendar list, sharing rules, or settings opens a notification channel, and Google then POSTs to the channel's HTTPS address each time the resource changes. The notification says the resource changed rather than carrying the new data, so the app re-fetches. A channel is closed with channels.stop.

Best forReceiving change notifications at an app or AI agent.
Governed byThe OAuth token used to open the channel and the address registered on it.
Docs ↗

MCP server (Model Context Protocol)

Google's hosted Calendar MCP server at https://calendarmcp.googleapis.com/mcp/v1 lets an agent call Calendar through the Model Context Protocol. It authenticates with OAuth 2.0 and exposes eight tools: create_event, delete_event, get_event, update_event, list_calendars, list_events, respond_to_event, and suggest_time. It is in the Google Workspace Developer Preview Program, not yet generally available.

Best forConnecting an AI agent to Google Calendar through MCP.
Governed byThe OAuth grant and the scopes it carries.
Docs ↗
Authentication

OAuth 2.0 (user consent)

A user signs in and consents to the requested scopes, and the app receives an access token that acts as that user and reaches only what those scopes allow. This is the standard way an app or AI agent connects to one person's calendars.

TokenOAuth access token (per user)
Best forActing on behalf of an individual user
Docs ↗

Service account

A service account is an app's own identity that calls the API without a person present, useful for backend automation. It can reach a calendar that has been shared with it, and in Google Workspace it can be granted domain-wide delegation to act as users across the organization.

TokenService account credentials (OAuth 2.0)
Best forServer-to-server automation with no user present
Docs ↗

Domain-wide delegation

A Google Workspace administrator authorizes a service account to impersonate users across the domain for chosen scopes, so the app can act as any user without each user consenting. It is a broad grant reserved for trusted backend integrations.

TokenService account impersonating a user
Best forOrganization-wide automation across many users
Docs ↗
Capability map

What an AI agent can do in Google Calendar.

The Google Calendar API is split into areas an agent can act on, such as events, calendars, the user's calendar list, sharing rules, and free/busy lookups. Each area has its own methods and its own scopes, and some reach far more than others.

Endpoint reference

Every Google Calendar API method.

Filter by method, access, or permission, or search any path. Select a row for version detail, rate limits, the related webhook event, and the source.

MethodEndpointWhat it doesAccessPermissionVersion

Events

List, read, create, update, move, import, and delete events on a calendar, add an event from a line of text, and list the occurrences of a recurring event.11

Reading needs one of the read scopes: https://www.googleapis.com/auth/calendar.events.readonly, calendar.events, calendar.readonly, or calendar. A nextSyncToken in the response lets a later call return only what changed.

Acts onevent
Permission (capability)calendar.events.readonly
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Full scope URL: https://www.googleapis.com/auth/calendar.events.readonly. The broader calendar.events, calendar.readonly, or calendar scope also works.

Acts onevent
Permission (capability)calendar.events.readonly
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Full scope URL: https://www.googleapis.com/auth/calendar.events. The broader calendar scope also works. Inviting attendees can send them email.

Acts onevent
Permission (capability)calendar.events
VersionAvailable since the API’s base version
Webhook eventevents-changed
Rate limitStandard limits apply

Full scope URL: https://www.googleapis.com/auth/calendar.events. A full update overwrites unset fields, where patch changes only the fields sent.

Acts onevent
Permission (capability)calendar.events
VersionAvailable since the API’s base version
Webhook eventevents-changed
Rate limitStandard limits apply

Full scope URL: https://www.googleapis.com/auth/calendar.events. Patch is the safe way to change shared properties, since it leaves other fields untouched.

Acts onevent
Permission (capability)calendar.events
VersionAvailable since the API’s base version
Webhook eventevents-changed
Rate limitStandard limits apply

Full scope URL: https://www.googleapis.com/auth/calendar.events. Deleting an event with attendees can notify them.

Acts onevent
Permission (capability)calendar.events
VersionAvailable since the API’s base version
Webhook eventevents-changed
Rate limitStandard limits apply

Full scope URL: https://www.googleapis.com/auth/calendar.events. Google parses the text into a timed event.

Acts onevent
Permission (capability)calendar.events
VersionAvailable since the API’s base version
Webhook eventevents-changed
Rate limitStandard limits apply

Full scope URL: https://www.googleapis.com/auth/calendar.events. Only single, non-recurring events can be moved between calendars.

Acts onevent
Permission (capability)calendar.events
VersionAvailable since the API’s base version
Webhook eventevents-changed
Rate limitStandard limits apply

Full scope URL: https://www.googleapis.com/auth/calendar.events. Unlike insert, import is for adding a private copy of an existing event, not creating a new invitation.

Acts onevent
Permission (capability)calendar.events
VersionAvailable since the API’s base version
Webhook eventevents-changed
Rate limitStandard limits apply

Full scope URL: https://www.googleapis.com/auth/calendar.events.readonly. Returns each dated instance of the recurring series.

Acts onevent
Permission (capability)calendar.events.readonly
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Full scope URL: https://www.googleapis.com/auth/calendar.events.readonly. Watch needs the same read scope as listing events. The notification says the resource changed; the app then re-fetches.

Acts onevent
Permission (capability)calendar.events.readonly
VersionAvailable since the API’s base version
Webhook eventevents-changed
Rate limitStandard limits apply

Calendars

Read, create, update, and delete calendars themselves, clear a primary calendar, and transfer ownership of a secondary calendar.6

Full scope URL: https://www.googleapis.com/auth/calendar.calendars.readonly. The broader calendar.readonly or calendar scope also works.

Acts oncalendar
Permission (capability)calendar.calendars.readonly
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Authorized scopes: https://www.googleapis.com/auth/calendar.calendars, calendar, or calendar.app.created.

Acts oncalendar
Permission (capability)calendar.calendars
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Authorized scopes: https://www.googleapis.com/auth/calendar.calendars or calendar.

Acts oncalendar
Permission (capability)calendar.calendars
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Authorized scopes: https://www.googleapis.com/auth/calendar.calendars or calendar. The primary calendar cannot be deleted; use clear instead.

Acts oncalendar
Permission (capability)calendar.calendars
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Full scope URL: https://www.googleapis.com/auth/calendar. Clear empties the primary calendar of all its events at once.

Acts oncalendar
Permission (capability)calendar
VersionAvailable since the API’s base version
Webhook eventevents-changed
Rate limitStandard limits apply

Authorized scopes: https://www.googleapis.com/auth/calendar or calendar.calendars. Requires the Manage Calendars administrator privilege. Added 18 June 2026.

Acts oncalendar
Permission (capability)calendar.calendars
VersionIntroduced 2026-06-18
Webhook eventNone
Rate limitStandard limits apply

Calendar list

List, read, add, update, and remove the calendars that appear in the user's own calendar list.5

Full scope URL: https://www.googleapis.com/auth/calendar.calendarlist.readonly. The calendar list is the set of calendars a user has added to their own view, separate from the calendars themselves.

Acts oncalendar list entry
Permission (capability)calendar.calendarlist.readonly
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Full scope URL: https://www.googleapis.com/auth/calendar.calendarlist.readonly. The broader calendar.readonly or calendar scope also works.

Acts oncalendar list entry
Permission (capability)calendar.calendarlist.readonly
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Full scope URL: https://www.googleapis.com/auth/calendar.calendarlist. Adding to the list does not create a calendar; it subscribes the user to one that already exists.

Acts oncalendar list entry
Permission (capability)calendar.calendarlist
VersionAvailable since the API’s base version
Webhook eventcalendarlist-changed
Rate limitStandard limits apply

Full scope URL: https://www.googleapis.com/auth/calendar.calendarlist.

Acts oncalendar list entry
Permission (capability)calendar.calendarlist
VersionAvailable since the API’s base version
Webhook eventcalendarlist-changed
Rate limitStandard limits apply

Full scope URL: https://www.googleapis.com/auth/calendar.calendarlist. Removing the entry unsubscribes the user but does not delete the underlying calendar.

Acts oncalendar list entry
Permission (capability)calendar.calendarlist
VersionAvailable since the API’s base version
Webhook eventcalendarlist-changed
Rate limitStandard limits apply

Sharing rules (Acl)

List, read, create, update, and delete the rules that say who can see or change a calendar.4

Full scope URL: https://www.googleapis.com/auth/calendar.acls.readonly. The broader calendar.acls or calendar scope also works. Each rule grants a person, group, or domain one of none, freeBusyReader, reader, writer, or owner.

Acts onacl rule
Permission (capability)calendar.acls.readonly
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Full scope URL: https://www.googleapis.com/auth/calendar.acls.readonly.

Acts onacl rule
Permission (capability)calendar.acls.readonly
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Full scope URL: https://www.googleapis.com/auth/calendar.acls. The broader calendar scope also works. A writer or owner rule grants edit access to the whole calendar.

Acts onacl rule
Permission (capability)calendar.acls
VersionAvailable since the API’s base version
Webhook eventacl-changed
Rate limitStandard limits apply

Full scope URL: https://www.googleapis.com/auth/calendar.acls.

Acts onacl rule
Permission (capability)calendar.acls
VersionAvailable since the API’s base version
Webhook eventacl-changed
Rate limitStandard limits apply

Free/busy

Query when a set of calendars is busy or free over a time window, without reading the events themselves.1

Least-privilege scope: https://www.googleapis.com/auth/calendar.events.freebusy. The broader calendar.readonly or calendar scope also works. It returns busy blocks only, not event titles or details.

Acts onfree/busy response
Permission (capability)calendar.events.freebusy
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Settings & colors

Read a user's Calendar settings, such as time zone, and read the global color palette for calendars and events.3

Full scope URL: https://www.googleapis.com/auth/calendar.settings.readonly. The broader calendar.readonly or calendar scope also works.

Acts onsetting
Permission (capability)calendar.settings.readonly
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Full scope URL: https://www.googleapis.com/auth/calendar.settings.readonly.

Acts onsetting
Permission (capability)calendar.settings.readonly
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Authorized scopes: https://www.googleapis.com/auth/calendar.readonly or calendar. The palette is read-only and referenced by the colorId on calendars and events.

Acts oncolor palette
Permission (capability)calendar.readonly
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Notification channels

Stop a push-notification channel that was opened by a watch request.1

Needs a scope that can read the watched resource, such as https://www.googleapis.com/auth/calendar.events.readonly. The request carries the channel id and resourceId returned when the channel was opened.

Acts onchannel
Permission (capability)calendar.events.readonly
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply
No endpoints match those filters.
Webhooks

Webhook events.

Google Calendar can notify an app or AI agent when a watched resource changes, instead of the app repeatedly asking. A watch request opens a notification channel, and Google then posts a message to the channel's HTTPS address each time the resource changes.

EventWhat it signalsTriggered by
Events changedFires when an event on a watched calendar is created, updated, moved, imported, or deleted. The notification reports that the events collection changed; the app re-lists with its sync token to learn what changed./calendars/{calendarId}/events
/calendars/{calendarId}/events/{eventId}
/calendars/{calendarId}/events/{eventId}
/calendars/{calendarId}/events/{eventId}
/calendars/{calendarId}/events/quickAdd
/calendars/{calendarId}/events/{eventId}/move
/calendars/{calendarId}/events/import
/calendars/{calendarId}/events/watch
/calendars/{calendarId}/clear
Calendar list changedFires when the user's calendar list changes, such as a calendar being added, updated, or removed from their view./users/me/calendarList
/users/me/calendarList/{calendarId}
/users/me/calendarList/{calendarId}
Sharing rules changedFires when a calendar's access-control rules change, such as a sharing rule being added or removed./calendars/{calendarId}/acl
/calendars/{calendarId}/acl/{ruleId}
No events match that search.
Rate limits & pagination

Rate limits, pagination & request size.

Google Calendar limits how fast an app or AI agent can call, through a sliding per-minute quota counted per project and per user, with a separate much larger daily ceiling per project.

Request rate

Google Calendar meters requests by a sliding per-minute quota rather than a per-method cost. A project gets 10,000 requests per minute, and each user within a project gets 600 requests per minute, with a separate daily ceiling of 1,000,000 requests per project. Going over returns 403 with rateLimitExceeded or userRateLimitExceeded, or 429 when too many requests arrive at once. The guidance is to retry with exponential backoff, computed as min((2^n) plus a random number of milliseconds, a maximum of 32 or 64 seconds, where n grows with each attempt, so retries spread out instead of arriving together.

Pagination

List methods page through results with a pageToken: each response carries a nextPageToken to fetch the following page, and the maxResults parameter sets the page size. The events list also returns a nextSyncToken once the full result has been read, and passing it on a later call returns only the entries that changed since, which is incremental sync. An expired sync token returns 410 fullSyncRequired, meaning the stored data must be wiped and re-synced.

Request size

Responses are JSON. The events list defaults to 250 results per page and allows up to 2,500, while other collections have their own defaults. There is no single documented overall payload size limit across the API.

Errors

Status codes & error handling.

The status codes an agent should handle, and what to do about each.

StatusCodeMeaningWhat to do
400badRequestA required field or parameter is missing, a value is invalid, or the combination of fields is invalid.Read the error message, fix the request, and do not retry it unchanged.
401authErrorThe access token is missing, expired, or invalid.Refresh the access token, or have the user re-authenticate through OAuth 2.0, then retry.
403rateLimitExceeded / userRateLimitExceededThe per-minute request rate was exceeded, for the project or for a single user.Slow down and retry with exponential backoff; raise the per-user quota in the Google Cloud console if it is consistently hit.
403quotaExceeded / forbiddenForNonOrganizerA Calendar protection limit was reached, or a shared event property was changed by someone who is not the event's organizer.Review the Calendar usage limits, or have the organizer make the change and use patch to touch only the fields needed.
404notFoundThe specified calendar, event, or rule was not found, or the token cannot see it.Confirm the id and that the token's scopes reach the resource, then retry with backoff.
409duplicate / conflictThe identifier already exists, or a batched item conflicts with another item in the same batch.Use a new id or switch to update, or retry the remaining batch items on their own.
410fullSyncRequiredThe sync token is no longer valid, so an incremental sync cannot continue.Discard the stored sync token and data, then run a full sync from scratch to get a fresh token.
412conditionNotMetThe etag in the If-Match header no longer matches the resource's current etag, so it changed since it was read.Re-fetch the resource to get the current etag, reapply the change, and resend.
429rateLimitExceededToo many requests were sent in a short window.Back off with exponential delay and jitter, then retry.
500backendErrorAn unexpected error occurred on Google's side while processing the request.Retry with exponential backoff; if it persists, the issue is server-side.
Versioning & freshness

Version history.

The Google Calendar API has one version, v3, carried in the request path. New behavior ships through dated release notes rather than a new version number.

Version history

What changed, and when

Latest versionv3
v3Current version
Calendar API v3 (current and only version)

The Google Calendar API has a single version, v3, carried in the request path. There is no dated version header. New behavior ships as additive changes announced in the release notes, so an integration pins to v3 and tracks the notes for changes. The entries below are notable dated changes from the release notes, newest first.

What changed
  • 18 June 2026: secondary-calendar ownership transfer added through the Calendars.transferOwnership method.
  • 1 June 2026: a new writerWithoutPrivateAccess access level announced, giving read and write on non-private events while private events show as busy only.
  • 1 May 2026: API usage quotas restructured under a new tiering model aligned with Google Workspace agent tools.
  • 22 April 2026: the Model Context Protocol server for Google Calendar entered developer preview.
2025-10-27Feature update
Secondary calendars get a single data owner

Announced 27 October 2025 and effective 10 November 2025: each secondary calendar now has a single data owner, only the data owner can delete a calendar, and ownership transfers were initially restricted to UI changes (later opened to the API in June 2026).

What changed
  • Secondary calendars now have a single data owner.
  • Only the data owner can delete a calendar.
2024-08-05Feature update
Birthday event type added

Announced 5 August 2024 and effective 17 September 2024: birthdays surface as a birthday eventType with annual recurrence and a limited set of supported properties. A November 2024 follow-up exposed birthdayProperties for event data and contact references.

What changed
  • Birthdays exposed as a birthday eventType with annual recurrence.
  • birthdayProperties later added for event-specific data and contact references.
2024-05-17Feature update
Batch conflicts now return 409

Announced 17 May 2024 and effective 3 June 2024: a batched operation whose item conflicts with another item in the same batch returns HTTP 409 Conflict, and the guidance is to retry the remaining items separately.

What changed
  • Batched operations return 409 Conflict when items in the batch conflict.
  • Guidance to exclude completed items and retry the rest separately.

An integration pins to v3 and tracks the release notes for additive changes.

Google Calendar API release notes ↗
Questions

Google Calendar API, answered.

Which OAuth scope should an agent ask for?+
The narrowest one that covers the work. To create and edit events on calendars the user can reach, calendar.events is enough; to only read events, calendar.events.readonly. The full calendar scope grants read and write across every calendar, including sharing rules and settings, so it is far more than most agents need. Availability-only checks can use calendar.events.freebusy, which returns busy blocks but no event details. Every scope is a full URL under https://www.googleapis.com/auth/.
What's the difference between a calendar and the calendar list?+
A calendar is the underlying object that holds events, addressed under /calendars. The calendar list is the personalized set of calendars a user has added to their own view, addressed under /users/me/calendarList, along with per-user display choices like color and notifications. Adding a calendar to the list subscribes the user to a calendar that already exists; it does not create one. Removing it unsubscribes the user without deleting the calendar.
How does an agent receive changes instead of polling?+
Through a watch request, which opens a push-notification channel on events, the calendar list, sharing rules, or settings. Google then POSTs to the channel's registered HTTPS address each time the resource changes. The notification reports that the resource changed rather than carrying the new data, so the app re-fetches, typically by re-listing events with its sync token to learn exactly what changed. A channel is closed with channels.stop, and channels also expire on their own.
How does incremental sync work?+
When the events list is read in full, the response includes a nextSyncToken. Passing that token on a later list call returns only the entries that have changed since, instead of the whole calendar again, which is incremental sync. If too much time passes or the token is otherwise invalidated, the call returns 410 fullSyncRequired, and the stored data must be wiped and re-synced from scratch to get a fresh token.
What are the rate limits?+
Google Calendar counts requests against a sliding per-minute quota: 10,000 per minute for a project and 600 per minute for each user within it, plus a daily ceiling of 1,000,000 per project. Exceeding a per-minute limit returns 403 rateLimitExceeded or userRateLimitExceeded, or 429 when requests arrive too fast. The fix is exponential backoff with jitter, and the per-user quota can be raised in the Google Cloud console if it is consistently the bottleneck.
Can an app connect without a user signing in?+
Yes, through a service account, which is the app's own identity and calls the API with no person present. A service account can reach a calendar that has been shared with it directly. In Google Workspace, an administrator can grant the service account domain-wide delegation, letting it act as any user in the organization for chosen scopes, which is a broad grant suited to trusted backend automation.
Related

More scheduling API guides for agents

What is Bollard AI?

Control what every AI agent can do in Google Calendar.

Bollard AI sits between a team's AI agents and Google Calendar. Grant each agent exactly the access it needs, read or write, resource by resource, and every call is checked and logged.

  • Set read, write, or full access per agent, never a shared Google Calendar key.
  • Denied by default, so an agent reaches only what has been explicitly allowed.
  • Every call recorded in plain English: who, what, where, and the decision.
Google Calendar
Scheduling Agent
Read availability ResourceOffReadFull use
Create events ActionOffReadFull use
Change calendar sharing ResourceOffReadFull use
Per-agent access, set in Bollard AI, not in Google Calendar