# Calendar API: bots that schedule themselves from Google Calendar and Outlook

> Schedule meeting bots from Google Calendar and Microsoft 365: read-only OAuth, real-time reschedule and cancel sync, recurring series, auto-join, and every endpoint.

Source: https://meetstream.ai/calendar-api

The MeetStream Calendar API connects a calendar once. Bots then join every meeting on it, on schedule, with nobody sending a link.

- Google Calendar
- Microsoft 365 / Outlook
- Read-only scopes
- 200 connections per user

*By Sidhdharth Sivasubramanian, Co-founder and CEO, MeetStream*

## Why a calendar should drive your bots

A calendar already knows when every meeting starts. Connect a user once, and it becomes the trigger rather than a copy.

*Events sync from the calendar, and a bot lands on the meeting.*

A calendar-scheduled bot is an ordinary [meeting bot](https://meetstream.ai/meeting-bot-api): same [webhooks](https://meetstream.ai/integrations/webhooks), same [per-participant recordings](https://meetstream.ai/meeting-recording-api), same [transcription engines](https://meetstream.ai/integrations/transcription).

### What does one calendar connection give you?

- **Read-only access**: Nothing is written back to Google or Microsoft.
- **Changes pushed, not polled**: Google watch channels and Microsoft change notifications.
- **Recurring series**: One, all or rolling, read from the event’s own rule.
- **Many accounts, one key**: Up to 200 connections per MeetStream user.

## Build on the calendar API

Connect an account, sync the meetings ahead, and book the ones you choose.

- **Read-only calendar access**: Nothing is written back to the calendar.
- **Events with their meeting links**: Sync reads the link and labels the platform.
- **A bot scheduled onto the meeting**: It joins one minute before the start.

- **Calendar**: Google or Outlook
- **Sync**: events and links
- **Schedule**: 1 min before start
- Bot joins
- **Webhooks**: bot.scheduled to bot.done

*Connect once, and MeetStream syncs the calendar, schedules the bot and keeps it in step with every change.*

### Google Calendar and Outlook in one API

What each provider gives you, and what you get through MeetStream.

| Capability | Google Calendar | Outlook and Microsoft 365 | MeetStream |
|---|---|---|---|
| Read-only calendar access | Yes | Yes | Yes. Nothing written back |
| Events with their meeting links | Yes | Yes | Yes. Platform labelled |
| Changes pushed, not polled | Watch channels | Change notifications | Yes. Every calendar |
| Recurring series from the rule | Yes | Yes | Yes. One, all or rolling |
| A bot scheduled onto the meeting | Calendar data only | Calendar data only | Yes. A minute before |
| Many accounts, one key | One grant each | One grant each | Yes. Up to 200 |
| One event contract, both providers | Google format | Microsoft format | Yes. The same bot events |

Colour key: green, yes amber, conditional red, provider side only

### Where the calendar endpoints live

[Calendar endpoints in the API reference](https://docs.meetstream.ai/api-reference/api-endpoints/calendar/create-calendar): Every request, response and option

[Google Calendar OAuth setup guide](https://docs.meetstream.ai/guides/calendar-integrations/google-calendar-oauth-setup): The consent flow

[Outlook calendar setup guide](https://docs.meetstream.ai/guides/calendar-integrations/outlook-calendar-setup): Azure app registration

### Schedule a bot for a set time

```bash
curl -X POST https://api.meetstream.ai/api/v1/bots/create_bot \
  -H "Authorization: Token $MEETSTREAM_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "meeting_link": "https://meet.google.com/abc-defg-hij",
    "bot_name": "Notetaker",
    "join_at": "2026-12-20T20:00:00+05:30"
  }'
```

## What happens when a meeting moves?

The join time moves with it. MeetStream listens rather than polling.

- **Changes arrive as a push**: Google watch channels and Microsoft Graph notifications.
- **Channels renew themselves**: A Google channel lasts about 30 days, renewed two days early.
- **Your webhooks still fire**: The bot sends its usual [lifecycle webhooks](https://meetstream.ai/integrations/webhooks).

- **Watch channels**: Google, per calendar
- **Graph notifications**: Outlook, per calendar
- **Renewed daily**: 03:00 UTC, before expiry

*Each channel is checked against its own client-state secret.*

Connect a [Google Calendar](https://meetstream.ai/integrations/google-calendar) or an [Outlook calendar](https://meetstream.ai/integrations/outlook) and every change arrives as a push.

| Calendar change | What MeetStream does |
|---|---|
| Meeting rescheduled | Scheduled join time moves with it |
| Meeting cancelled | Schedule deleted, bot marked Cancelled |
| Meeting moved into the past | Bot record cancelled |
| Series edited | Existing schedules rebuilt with the new times |
| New meeting added | Picked up by the next auto-schedule run |

### What happens to a recurring series?

A weekly call is one event with a recurrence rule. Three ways to cover it.

- **One occurrence**: Name the date
- **All occurrences**: The series, cap 52
- **Rolling**: Books the next one

*Rolling reads the recurrence rule and books the next meeting after each one ends.*

Daily, weekly, monthly and yearly patterns are all read from the event’s own rule.

To stop future bots, cancel every occurrence or give a start date. The [scheduling bots guide](https://docs.meetstream.ai/guides/features/scheduling-bots) has the detail.

## Double-booking safeguards

Three things stop a meeting getting two bots.

- **The API hands the bot back**: Book an event that already has a bot and you get that bot to edit.
- **Auto-schedule skips booked events**: Manual and automatic booking can both run.
- **A deduplication key**: A retry returns the original bot, and one replay is billed once.

- **409 Conflict**: With the existing bot ID
- **The job skips**: Events that carry a bot
- **Deduplication key**: A retry returns the original

*Manual and automatic scheduling can both run without doubling up.*

Bots join one minute before the start. On [Zoom](https://meetstream.ai/integrations/zoom) and Teams a host admits the bot, so allow for the lobby.

### Which meeting links are detected

A link on the event is all it takes. Sync reads it and notes the platform.

- **Zoom**: A bot joins
- **Google Meet**: A bot joins
- **Microsoft Teams**: A bot joins

*Webex, GoToMeeting, BlueJeans and Whereby links are recognised and labelled too.*

Bots join [Zoom](https://meetstream.ai/integrations/zoom), [Google Meet](https://meetstream.ai/integrations/google-meet) and [Microsoft Teams](https://meetstream.ai/integrations/microsoft-teams) meetings. Events on other platforms sync too, each one labelled.

![Scheduled bots listed in the MeetStream dashboard with platform, status and join time](https://meetstream.ai/assets/product/dashboard.png)

*Scheduled bots wait in the dashboard, with platform, status and join time. The Calendar page carries the auto-schedule toggle.*

## Three ways to schedule a bot

Start simple, and add the calendar when your product needs it.

*Events come in from the calendar, and a bot is scheduled onto each meeting.*

### One-off

- [A set time](https://docs.meetstream.ai/guides/features/scheduling-bots): Give the bot a start time and it waits.
- [A scheduled webhook](https://meetstream.ai/integrations/webhooks): It fires as soon as the bot is booked.
- [List, edit or cancel](https://meetstream.ai/meeting-bot-api): Change the booking any time before the meeting.
- [No calendar needed](https://meetstream.ai/meeting-bot-api): A one-off bot takes a link and a time, nothing more.

### Per event

- [Connect a calendar](https://meetstream.ai/integrations/google-calendar): Google Calendar or Microsoft 365 Outlook.
- [Pick the meetings](https://meetstream.ai/integrations/outlook): Book the events you choose, one at a time.
- [Whole series too](https://meetstream.ai/glossary/calendar-integration): Book every occurrence, up to a cap of 52 by default.
- [Cancel cleanly](https://meetstream.ai/integrations/webhooks): Cancel one occurrence, or everything from a date.

### Full auto-join

- [Turn it on once](https://meetstream.ai/integrations/google-calendar): Every upcoming meeting with a link then gets a bot.
- [A daily job](https://meetstream.ai/glossary/calendar-integration): It runs at midnight UTC over the next 24 hours.
- [Booked events are left alone](https://meetstream.ai/meeting-bot-api): Anything that already carries a bot is skipped.
- [Unschedule any you skip](https://meetstream.ai/integrations/webhooks): Auto-join covers everything, and you remove the rest.

## Enterprise-level security, keep your data private.

Read-only on both providers. MeetStream leaves the calendar exactly as it found it. The [security page](https://meetstream.ai/security) covers the wider controls.

- **Read-only scopes**: Google grants read access to events and calendars. Microsoft grants calendar read and user read.
- **Encrypted at rest**: Refresh tokens are encrypted at rest, one set per connection. Synced events are encrypted too.
- **Disconnect ends it**: Credentials, watch channels and scheduled bots go with the connection.

- **SOC 2**: Type 2 (Under Audit)
- **ISO 27001**: Certified
- **GDPR**: Compliant

### Which calendar permissions do you grant?

- **Read only**: Both providers
- **Encrypted at rest**: Tokens and synced events
- **Disconnect any time**: Credentials and bots go

*What a calendar connection holds, and how a user ends it.*

| Provider | What is granted |
|---|---|
| Google | Read scopes for events and calendars, plus email and profile |
| Microsoft | Calendar read, user read, and offline access for a long-lived refresh token |

### What are the calendar API limits?

- **200**: calendar connections per user
- **28 days**: default sync window ahead
- **52**: recurring occurrences per request, default cap
- **1 min**: before start, the bot joins

| What to design for | How it behaves |
|---|---|
| The auto-schedule job | Daily at midnight UTC, over the next 24 hours |
| The sync window | 28 days ahead by default. A set join time reaches three months |
| OAuth grants | Watch the connection list, and reconnect through the same flow |

A multi-tenant product holds its customers’ connections under one API key.

## Got a question? We got the answer.

Common questions about connecting a calendar, scheduling bots, and what is stored.

### What can I build with the Calendar API?

Notetakers, coaching tools, CRM enrichment and meeting analytics. Connect a calendar, and every meeting on it comes back with a recording, a transcript and speaker labels.

### Which calendars does the Calendar API support?

Google Calendar (personal or Workspace) and Microsoft 365 Outlook calendars. One MeetStream user can hold up to 200 connections across both. Each one is keyed by provider and account email.

### Can one user connect several calendar accounts?

Yes. Up to 200 connections per MeetStream user across Google and Outlook, each keyed by provider and account email, each with its own credentials.

### How far ahead can bots be scheduled?

A one-off bot with a set join time can be scheduled up to three months ahead. Calendar sync reads from one day back to 28 days forward by default, and you can widen that window on the request.

### What happens when a meeting moves or is cancelled?

Google watch channels and Microsoft Graph change notifications push the change to MeetStream. A reschedule moves the join time; a cancellation deletes the schedule and marks the bot Cancelled.

### Can I pick which meetings get a bot?

Yes. Book specific events one at a time from the schedule endpoint. Or turn on auto-schedule to cover every upcoming meeting with a link, then unschedule any you would rather skip.

### Does it detect Zoom, Google Meet and Teams links?

Yes. Sync reads the link on each event and labels the platform. Bots join Zoom, Google Meet and Microsoft Teams. Webex, GoToMeeting, BlueJeans and Whereby links are labelled too.

### Does it handle recurring meetings?

Yes. Standard iCalendar recurrence rules are read (daily, weekly, bi-weekly, monthly, yearly). Book a single occurrence, or all of them up to a limit of 52 by default. Or let MeetStream set up the next occurrence after each meeting ends.

### What calendar permissions are requested?

Read-only on both. Google grants read access to events and calendars, plus email and profile to name the account. Microsoft grants calendar read, user read and offline access. MeetStream reads the calendar and leaves it exactly as it found it.

### Where are calendar credentials stored?

OAuth refresh tokens are encrypted at rest, and synced events are stored encrypted too. The flow uses OAuth throughout, so a calendar password never reaches MeetStream.

### Why use a calendar API instead of Google and Microsoft directly?

One connection covers both providers: one set of read-only scopes, one push path for changes, one set of bot events.

### How do my end users connect their calendars in production?

Your app runs the Google or Microsoft consent flow with your own client ID, then passes the refresh token it receives to the matching connect endpoint. The localhost helper in the docs is there to get your first token while you build, and your own consent flow takes over in production.

## Let the calendar decide which meetings get a bot.

Connect once, read-only. Bots are booked, moved and cancelled with the meeting.

- Google Calendar
- Microsoft 365 Outlook
- Read-only scopes
- Recurring series
- Auto-join

## Keep exploring

- [Google Calendar setup](https://meetstream.ai/integrations/google-calendar): Integration
- [Microsoft Outlook setup](https://meetstream.ai/integrations/outlook): Integration
- [Meeting Bot API](https://meetstream.ai/meeting-bot-api): Product
- [Webhooks](https://meetstream.ai/integrations/webhooks): Integration
- [Calendar integration](https://meetstream.ai/glossary/calendar-integration): Glossary
- [AI meeting notetaker](https://meetstream.ai/use-cases/ai-meeting-notetaker): Use case

## Connect a calendar this afternoon

Read-only on Google or Outlook. Every meeting with a link gets a bot.

---

Full site index for agents: https://meetstream.ai/llms.txt
API contract (OpenAPI 3.1): https://meetstream.ai/openapi.json
MCP discovery: https://meetstream.ai/.well-known/mcp
