google-calendar-lookup-availability implementation guide

---
availability: INSTALLABLE
installation_asset_uuid: 310b98af-3bc1-41d5-9678-12e1ccb20a37
description: Find a time that works for everyone before scheduling a meeting.
name: Find Availability
purple_chat_link: https://marketplace.moveworks.com/purple-chat?conversation=%7B%22messages%22%3A%5B%7B%22role%22%3A%22user%22%2C%22parts%22%3A%5B%7B%22richText%22%3A%22Find+a+45-minute+slot+for+a+meeting+with+Jordan+Smith+and+Sarah+Jenkins+tomorrow+between+1+PM+and+5+PM.%22%7D%5D%7D%2C%7B%22role%22%3A%22assistant%22%2C%22parts%22%3A%5B%7B%22reasoningSteps%22%3A%5B%7B%22status%22%3A%22success%22%2C%22richText%22%3A%22%3Cp%3ESearching+for+Jordan+Smith+and+Sarah+Jenkins...%3C%2Fp%3E%22%7D%5D%7D%2C%7B%22richText%22%3A%22%3Cp%3EI+found+two+people+matching+%3Cstrong%3ESarah+Jenkins%3C%2Fstrong%3E+in+your+directory.+Which+one+would+you+like+to+check%3F%3C%2Fp%3E%22%7D%2C%7B%22citations%22%3A%5B%7B%22connectorName%22%3A%22moveworks%22%2C%22citationTitle%22%3A%22Sarah+Jenkins+%28Marketing%29%22%7D%2C%7B%22connectorName%22%3A%22moveworks%22%2C%22citationTitle%22%3A%22Sarah+Jenkins+%28Sales%29%22%7D%5D%7D%5D%7D%2C%7B%22role%22%3A%22user%22%2C%22parts%22%3A%5B%7B%22richText%22%3A%22The+one+in+Marketing.%22%7D%5D%7D%2C%7B%22role%22%3A%22assistant%22%2C%22parts%22%3A%5B%7B%22reasoningSteps%22%3A%5B%7B%22status%22%3A%22success%22%2C%22richText%22%3A%22%3Cp%3ERetrieving+calendar+schedules+for+Jordan+Smith+and+Sarah+Jenkins+from+%3Cb%3EGoogle+Calendar%3C%2Fb%3E...%3C%2Fp%3E%22%2C%22connectorName%22%3A%22google-calendar%22%7D%5D%7D%2C%7B%22richText%22%3A%22%3Cp%3EI%27ve+checked+the+calendars+for+%3Cstrong%3EJordan+Smith%3C%2Fstrong%3E+and+%3Cstrong%3ESarah+Jenkins%3C%2Fstrong%3E.+Here+are+the+suggested+45-minute+windows+for+tomorrow%3A%3C%2Fp%3E%3Cul%3E%3Cli%3E1%3A00+PM+-+1%3A45+PM%3C%2Fli%3E%3Cli%3E3%3A30+PM+-+4%3A15+PM%3C%2Fli%3E%3Cli%3E4%3A15+PM+-+5%3A00+PM%3C%2Fli%3E%3C%2Ful%3E%3Cp%3EYou+can+use+these+times+to+coordinate+your+meeting+invite+in+%3Cstrong%3EGoogle+Calendar%3C%2Fstrong%3E.%3C%2Fp%3E%22%7D%2C%7B%22citations%22%3A%5B%7B%22connectorName%22%3A%22google-calendar%22%2C%22citationTitle%22%3A%22Jordan+Smith%22%7D%2C%7B%22connectorName%22%3A%22google-calendar%22%2C%22citationTitle%22%3A%22Sarah+Jenkins+%28Marketing%29%22%7D%5D%7D%5D%7D%5D%7D
solution_tags:
- Finance - Other
- HR - Other
- IT
- Productivity
- Sales
systems:
- google-calendar
---

# Description

Find the best time to meet by checking availability across multiple attendees — so you can schedule meetings faster without the back and forth.

# User Experience Preview

Please refer to the following [**Purple Chat**](https://marketplace.moveworks.com/purple-chat?conversation=%7B%22messages%22%3A%5B%7B%22role%22%3A%22user%22%2C%22parts%22%3A%5B%7B%22richText%22%3A%22Find+a+45-minute+slot+for+a+meeting+with+Jordan+Smith+and+Sarah+Jenkins+tomorrow+between+1+PM+and+5+PM.%22%7D%5D%7D%2C%7B%22role%22%3A%22assistant%22%2C%22parts%22%3A%5B%7B%22reasoningSteps%22%3A%5B%7B%22status%22%3A%22success%22%2C%22richText%22%3A%22%3Cp%3ESearching+for+Jordan+Smith+and+Sarah+Jenkins...%3C%2Fp%3E%22%7D%5D%7D%2C%7B%22richText%22%3A%22%3Cp%3EI+found+two+people+matching+%3Cstrong%3ESarah+Jenkins%3C%2Fstrong%3E+in+your+directory.+Which+one+would+you+like+to+check%3F%3C%2Fp%3E%22%7D%2C%7B%22citations%22%3A%5B%7B%22connectorName%22%3A%22moveworks%22%2C%22citationTitle%22%3A%22Sarah+Jenkins+%28Marketing%29%22%7D%2C%7B%22connectorName%22%3A%22moveworks%22%2C%22citationTitle%22%3A%22Sarah+Jenkins+%28Sales%29%22%7D%5D%7D%5D%7D%2C%7B%22role%22%3A%22user%22%2C%22parts%22%3A%5B%7B%22richText%22%3A%22The+one+in+Marketing.%22%7D%5D%7D%2C%7B%22role%22%3A%22assistant%22%2C%22parts%22%3A%5B%7B%22reasoningSteps%22%3A%5B%7B%22status%22%3A%22success%22%2C%22richText%22%3A%22%3Cp%3ERetrieving+calendar+schedules+for+Jordan+Smith+and+Sarah+Jenkins+from+%3Cb%3EGoogle+Calendar%3C%2Fb%3E...%3C%2Fp%3E%22%2C%22connectorName%22%3A%22google-calendar%22%7D%5D%7D%2C%7B%22richText%22%3A%22%3Cp%3EI%27ve+checked+the+calendars+for+%3Cstrong%3EJordan+Smith%3C%2Fstrong%3E+and+%3Cstrong%3ESarah+Jenkins%3C%2Fstrong%3E.+Here+are+the+suggested+45-minute+windows+for+tomorrow%3A%3C%2Fp%3E%3Cul%3E%3Cli%3E1%3A00+PM+-+1%3A45+PM%3C%2Fli%3E%3Cli%3E3%3A30+PM+-+4%3A15+PM%3C%2Fli%3E%3Cli%3E4%3A15+PM+-+5%3A00+PM%3C%2Fli%3E%3C%2Ful%3E%3Cp%3EYou+can+use+these+times+to+coordinate+your+meeting+invite+in+%3Cstrong%3EGoogle+Calendar%3C%2Fstrong%3E.%3C%2Fp%3E%22%7D%2C%7B%22citations%22%3A%5B%7B%22connectorName%22%3A%22google-calendar%22%2C%22citationTitle%22%3A%22Jordan+Smith%22%7D%2C%7B%22connectorName%22%3A%22google-calendar%22%2C%22citationTitle%22%3A%22Sarah+Jenkins+%28Marketing%29%22%7D%5D%7D%5D%7D%5D%7D) for a sample conversational experience between a user and the AI Assistant for this plugin.

# Prerequisites

Before installing and using the **Find Availability** plugin, ensure the following requirements are met.

### 1. Google Calendar Connector

This plugin requires an active **Google Calendar connector** configured with the OAuth 2.0 Authorization Code (User Consent Auth) flow.

- If you have not already set up the connector, follow the [**Google Calendar Connector Guide**](https://marketplace.moveworks.com/connectors/google-calendar) before proceeding.
- The connector must be fully configured and tested before installing this plugin.

### 2. Plugin Installation

Once the connector is ready, follow the [**plugin installation documentation**](https://help.moveworks.com/docs/ai-agent-marketplace-installation) for steps on how to install and activate the plugin in Agent Studio.

### 3. Google Workspace System Requirements

### a. End User Permissions

To find availability through this plugin, users must already have access to view calendar data in Google Workspace — the same access required to view calendars in Google Calendar.

At a minimum, end users must have:

- A licensed Google Workspace account with Google Calendar enabled
- Permission to view their own calendar

Note: Event times are automatically displayed in the user's timezone as configured in their Google account. No manual setup is required.

**Looking up another user's calendar:**

A user can only retrieve another user's calendar events if one of the following is true:

- The other user has **explicitly shared their calendar** with the authenticated user in Google Calendar, with at least a `reader` role (full event details) or `freeBusyReader` role (free/busy only, no event details)
- Your **Google Workspace admin has configured org-wide internal calendar sharing**, which sets a default sharing policy across all calendars in the domain — this is the most common reason users can look up colleagues' calendars without explicit sharing

**Note:** The level of event detail returned depends on the access role granted. A `freeBusyReader` role will only return free/busy status, not event titles or details. Check with your Google Workspace admin to confirm your organization's sharing policy..

### b. API Permissions

The Google Calendar connector uses **delegated permissions** to retrieve calendar data on behalf of the authenticated user. The following permission is required for this plugin:

| Permission | Purpose |
| --- | --- |
| `https://www.googleapis.com/auth/calendar` | Read calendar events and free/busy information for the user and attendees |

# Implementation Details

This plugin works by making a sequence of API calls and running a custom script to compute overlapping free time across all attendees. The diagram below gives a high-level picture of that flow, followed by a breakdown of each step.

### Visual Representation of How the Plugin Works

![image.png](Find%20Availability/image.png)

### API Details

This plugin uses four API calls and one custom script.

### API #1: Get Authenticated User's Timezone

Retrieves the timezone of the authenticated user from their Google Calendar settings. This is used to correctly interpret the search window provided by the user.

```bash
curl --request GET \
  --url 'https://www.googleapis.com/calendar/v3/users/me/settings/timezone' \
  --header 'Authorization: Bearer {{access_token}}' \
  --header 'Content-Type: application/json'
```

### API #2: Get Free/Busy Information

Retrieves busy time blocks for all attendees within the specified time range. This is the core availability check — it returns only when each attendee is busy, not the details of their events.

```bash
curl --request POST \
  --url 'https://www.googleapis.com/calendar/v3/freeBusy' \
  --header 'Authorization: Bearer {{access_token}}' \
  --header 'Content-Type: application/json' \
  --data '{
    "timeMin": "{{start_datetime}}",
    "timeMax": "{{end_datetime}}",
    "timeZone": "{{time_zone}}",
    "items": [{"id": "{{email}}"}, ...]
  }'
```

**Input Arguments:**

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `emails` | list of strings | Yes | List of attendee email addresses to check availability for |
| `start_datetime` | string | Yes | Start of the search range in ISO 8601 format. Example: `2026-01-26T00:00:00-08:00` |
| `end_datetime` | string | Yes | End of the search range in ISO 8601 format. Example: `2026-01-31T00:00:00-08:00` |
| `time_zone` | string | No | Timezone in IANA format, retrieved from API #1. Example: `America/Los_Angeles` |

**Key nuances:**

- The free/busy API returns **only busy time blocks** — it does not return event titles, organizers, or any other event details, regardless of calendar sharing settings.
- If an attendee's calendar is not accessible (e.g. not shared), their busy data will be empty and they will appear fully available. This is a known limitation of the Google Calendar free/busy API.

### API #3: Get Calendar Metadata for Each Attendee

Retrieves timezone and calendar metadata for each attendee. This is run in parallel for all attendees and is used to correctly localize displayed times per participant.

```bash
curl --request GET \
  --url 'https://www.googleapis.com/calendar/v3/calendars/{{user_email_addr}}' \
  --header 'Authorization: Bearer {{access_token}}' \
  --header 'Content-Type: application/json'
```

**Input Arguments:**

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `user_email_addr` | string | Yes | The email address of the attendee whose calendar metadata is being retrieved |

### API #4: Get Calendar Events for Each Attendee

Retrieves full event details for each attendee within the search window. This is run in parallel alongside API #3 and is used to enrich conflict suggestions with event context (e.g. event title, whether the attendee is the organizer, response status).

```bash
curl --request GET \
  --url 'https://www.googleapis.com/calendar/v3/calendars/{{email}}/events?timeMin={{start_date_range}}&timeMax={{end_date_range}}&singleEvents=true&orderBy=startTime&maxResults=350' \
  --header 'Authorization: Bearer {{access_token}}' \
  --header 'Content-Type: application/json'
```

**Input Arguments:**

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `email` | string | Yes | The email address of the attendee whose events are being retrieved |
| `start_date_range` | string | Yes | Start of the time range in ISO 8601 format. Example: `2026-01-26T00:00:00-08:00` |
| `end_date_range` | string | Yes | End of the time range in ISO 8601 format. Example: `2026-01-31T00:00:00-08:00` |

**Key nuances:**

- This API call is the same as used in the **Search Calendar Events** plugin. Event details are subject to the same calendar sharing permissions.
- Up to **350 events** are retrieved per attendee per request.

The AI Assistant uses these API outputs to suggest the best meeting times — prioritizing all-clear slots, and explaining trade-offs for slots with minor conflicts.

Now that you understand how the plugin works under the hood, let's walk through what it can and can't do. We recommend reading both sections before going live to ensure the best experience for your users.

# What Is In Scope for This Plugin?

This plugin supports the following capabilities:

- Find overlapping free time across multiple attendees within a specified date range
- Suggest **all-clear slots** where all attendees are fully available
- Suggest **slots with minor conflicts**, with context about whose meeting would be affected and whether it could be moved
- Support attendees across **multiple timezones**, with times displayed in each participant's local timezone
- Default meeting duration is **30 minutes** if not specified by the user

# What Is Out of Scope for This Plugin?

This plugin does **not** support the following:

- Booking or creating the meeting — handled by a separate Book a Meeting plugin.
- Attendees whose calendars are not accessible will appear fully available — the plugin cannot flag inaccessible calendars.
- Users with a very high volume of events in the requested time range may receive incomplete conflict data, as the events API is limited to returning a maximum of 350 events per attendee per request.
- Availability across attendees outside your Google Workspace organization may be incomplete, depending on external calendar sharing settings.