Skip to main content
Google Calendar REST API access for reading and managing events on a connected user’s calendars. Use when an agent needs to check availability, list upcoming events, or create, update, and delete events — including attendee invitations and recurring events. Routes through Pipedream Connect — the user sees one Google consent screen on connect that says “Pipedream wants access” (Pipedream owns the verified OAuth client). Connects separately from Gmail: Pipedream has no combined Google app, so each Google product is its own connection. 10 example endpoints available through Lava’s AI Gateway. See the Google Calendar API docs for full documentation.
This provider requires your own credentials — connect your API key or OAuth account before use.
This is a catch-all provider — any valid URL under https://www.googleapis.com is supported. Google Calendar REST API endpoints. Construct URLs as https://www.googleapis.com/calendar/v3/{path} — common roots: calendars/primary/events, calendars/{calendarId}/events/{eventId}, users/me/calendarList, users/me/settings/timezone, freeBusy. Authentication is brokered through Pipedream Connect — the end-user sees a single “Pipedream wants to access your Google Account” consent screen on connect. Rules that prevent 400s and silent failures: timed events need start/end dateTime as RFC3339 WITH a UTC offset (e.g. 2026-06-11T09:00:00-04:00) or a timeZone field alongside; recurring events REQUIRE timeZone, and recurrence is an array of RFC5545 RRULE/RDATE/EXDATE lines with NO DTSTART or DTEND; timeMin/timeMax query params also need RFC3339 with offset. Prefer PATCH over PUT to update events — PUT replaces the whole resource and WIPES any field you omit. Listing in chronological order needs orderBy=startTime with singleEvents=true (Lava auto-adds singleEvents when you forget). Creating a Meet link via conferenceData.createRequest needs conferenceDataVersion=1 in the query (Lava auto-adds it). Attendee email notifications are controlled by the sendUpdates query param (all, externalOnly, none — default none, so invitations are NOT emailed unless you ask). The Lava gateway requires a JSON body on every non-GET call — for endpoints that take no body (quickAdd, delete), send an empty object as body_json. See https://developers.google.com/workspace/calendar/api/v3/reference for the full reference. The endpoints below are curated examples.

Endpoints

Get the connected user’s default time zone. Use this as a cheap auth probe after connect, and to schedule events in the user’s local time without guessing.

GET https://www.googleapis.com/calendar/v3/users/me/settings/timezone — Free
const data = await lava.gateway('https://www.googleapis.com/calendar/v3/users/me/settings/timezone', { method: 'GET' });

List the calendars on the user’s calendar list with their IDs and access roles. Use calendar IDs from here in place of ‘primary’ to read or write other calendars.

GET https://www.googleapis.com/calendar/v3/users/me/calendarList — Free
const data = await lava.gateway('https://www.googleapis.com/calendar/v3/users/me/calendarList', { method: 'GET' });

List events on a calendar. For upcoming events in chronological order, pass timeMin (RFC3339 with offset), singleEvents=true, and orderBy=startTime. Responses are projected to scheduling essentials — pass filter {“mode”: “full”} for raw event resources.

GET https://www.googleapis.com/calendar/v3/calendars/primary/events?timeMin=2026-06-11T00:00:00Z&singleEvents=true&orderBy=startTime&maxResults=25 — Free
const data = await lava.gateway('https://www.googleapis.com/calendar/v3/calendars/primary/events?timeMin=2026-06-11T00:00:00Z&singleEvents=true&orderBy=startTime&maxResults=25', { method: 'GET' });

Get a single event by ID, including full attendee and conference detail.

GET https://www.googleapis.com/calendar/v3/calendars/primary/events/{eventId} — Free
const data = await lava.gateway('https://www.googleapis.com/calendar/v3/calendars/primary/events/{eventId}', { method: 'GET' });

Create an event. Timed events need start/end dateTime in RFC3339 with an offset or a timeZone field; recurring events require timeZone and RFC5545 recurrence lines. Add sendUpdates=all to email invitations to attendees (default sends none).

POST https://www.googleapis.com/calendar/v3/calendars/primary/events?sendUpdates=all — Free
const data = await lava.gateway('https://www.googleapis.com/calendar/v3/calendars/primary/events?sendUpdates=all', {
  body: {
"summary": "Team standup",
"start": {
  "dateTime": "2026-06-15T09:00:00",
  "timeZone": "America/New_York"
},
"end": {
  "dateTime": "2026-06-15T09:30:00",
  "timeZone": "America/New_York"
},
"attendees": [
  {
    "email": "teammate@example.com"
  }
]
},
});

Create an event from a natural-language sentence in the text query param (URL-encoded), e.g. “Lunch with Sam tomorrow at noon”. Google parses the time and title. Takes no body fields — send an empty JSON object as the body.

POST https://www.googleapis.com/calendar/v3/calendars/primary/events/quickAdd?text=Lunch%20with%20Sam%20tomorrow%20at%20noon — Free
const data = await lava.gateway('https://www.googleapis.com/calendar/v3/calendars/primary/events/quickAdd?text=Lunch%20with%20Sam%20tomorrow%20at%20noon', { body: {} });

Query busy intervals across one or more calendars for a time window — the availability check before proposing a meeting time. timeMin/timeMax are RFC3339 with offset; items lists calendar IDs.

POST https://www.googleapis.com/calendar/v3/freeBusy — Free
const data = await lava.gateway('https://www.googleapis.com/calendar/v3/freeBusy', {
  body: {
"timeMin": "2026-06-15T00:00:00Z",
"timeMax": "2026-06-16T00:00:00Z",
"items": [
  {
    "id": "primary"
  }
]
},
});
PATCH https://www.googleapis.com/calendar/v3/calendars/primary/events/{eventId} — Free
const data = await lava.gateway('https://www.googleapis.com/calendar/v3/calendars/primary/events/{eventId}', { method: 'PATCH', body: {"summary":"Renamed event"} });

Replace an event entirely. PUT has no patch semantics — any field omitted from the body is wiped, and start/end are required. GET the event first, modify, then PUT it back; prefer PATCH for partial changes.

PUT https://www.googleapis.com/calendar/v3/calendars/primary/events/{eventId} — Free
const data = await lava.gateway('https://www.googleapis.com/calendar/v3/calendars/primary/events/{eventId}', {
  method: 'PUT',
  body: {
"summary": "Updated meeting",
"start": {
  "dateTime": "2026-06-15T10:00:00",
  "timeZone": "America/New_York"
},
"end": {
  "dateTime": "2026-06-15T11:00:00",
  "timeZone": "America/New_York"
}
},
});

Delete an event. Returns an empty 204 response on success. Add sendUpdates=all to email cancellations to attendees. Takes no body fields — send an empty JSON object as the body.

DELETE https://www.googleapis.com/calendar/v3/calendars/primary/events/{eventId}?sendUpdates=all — Free
const data = await lava.gateway('https://www.googleapis.com/calendar/v3/calendars/primary/events/{eventId}?sendUpdates=all', { method: 'DELETE', body: {} });

Next Steps

All Providers

Browse all supported AI providers

Forward Proxy

Learn how to construct proxy URLs and authenticate requests