---
title: "Zoom meeting API for calendar events · Workwae"
description: "Create, move and delete Zoom meetings from calendar events on Google, Microsoft 365 and CalDAV, with per-user or server-to-server hosting."
url: https://workwae.com/providers/zoom
---

Providers

# Zoom meetings that follow your calendar events.

Set `onlineMeetingService: "zoom"` on an event. Workwae creates the meeting, writes the join link into the event, and moves or deletes it with the event.

What Zoom requires

## A Marketplace app and a host for each meeting.

These points are from Zoom’s developer docs, as of October 2026.

### User-level OAuth

A user app signs the user in and gets an access token that expires after one hour, with a [refresh token](https://workwae.com/glossary#refresh-token) to renew it. Meetings are hosted by that user. [Zoom OAuth](https://developers.zoom.us/docs/integrations/oauth/)

### Server-to-Server OAuth

An internal app for one account uses the `account_credentials` grant. Its token lives one hour and there is no refresh token, so the app asks again. [Server-to-Server OAuth](https://developers.zoom.us/docs/internal-apps/s2s-oauth/)

### Scopes in the app

Zoom takes granular scopes from the app’s Marketplace configuration, not from the request. An administrator authorizes what a server app may use. [Server-to-Server OAuth](https://developers.zoom.us/docs/internal-apps/s2s-oauth/)

### Rate limits

Limits apply per account and are shared by every app installed on it, by request type (Light, Medium, Heavy) and plan. [Rate limits](https://developers.zoom.us/docs/api/rate-limits/)

What Workwae does

## Meeting lifecycle tied to the event.

### Create, move, delete

A new event with the field creates a meeting and sets `onlineMeetingUrl`. A new subject, start, end or rule moves the meeting. Deleting or cancelling the event deletes it. This works on Google, Microsoft 365 and [CalDAV](https://workwae.com/glossary#caldav) accounts.

### Three ways to host

A user grant through Workwae’s Zoom app, a user grant through your own Zoom OAuth app, or a Server-to-Server app that hosts for every mailbox in the organization as the Zoom user with the mailbox’s address. A grant is tried first, then the server app.

### Recurring series

A series gets a recurring meeting. Zoom repeats daily, weekly on chosen weekdays, or monthly on a day or one weekday, up to 60 times, with an interval of at most 99 days, 50 weeks or 10 months. Other rules are refused as `meeting_recurrence_unsupported` before anything is created.

### Reauthorization

A refused call is retried once with a fresh token. If it is refused again, the grant is marked `reauth_required` and a `meeting_connection.reauth_required` webhook names the host. Mail and calendar sync keep running. A user who removes the app in the Zoom Marketplace has their grants deleted.

SDK

## Connect a user, then create the event.

A connect session returns a hosted page where the user signs in at Zoom. Meetings are a module that every plan offers; a workspace’s owner switches it on.

zoom.tszoom.py

```ts
const { url } = await workwae.meetingConnectSessions.create({
  accountId,
  service: "zoom",
  redirectUri: "https://app.example.com/settings/meetings",
  state: "user-42",
});

const event = await workwae.calendarEvents.create({
  accountId,
  calendarId,
  subject: "Customer onboarding",
  start: { dateTime: "2026-11-03T15:00:00", timeZone: "America/Chicago" },
  end: { dateTime: "2026-11-03T15:45:00", timeZone: "America/Chicago" },
  onlineMeetingService: "zoom",
});
event.onlineMeetingUrl; // the Zoom join link
```

```python
from datetime import datetime

session = workwae.meeting_connect_sessions.create(
    account_id=account_id,
    service="zoom",
    redirect_uri="https://app.example.com/settings/meetings",
    state="user-42",
)
url = session.url

event = workwae.calendar_events.create(
    account_id=account_id,
    calendar_id=calendar_id,
    subject="Customer onboarding",
    start={"date_time": datetime(2026, 11, 3, 15, 0), "time_zone": "America/Chicago"},
    end={"date_time": datetime(2026, 11, 3, 15, 45), "time_zone": "America/Chicago"},
    online_meeting_service="zoom",
)
event.online_meeting_url  # the Zoom join link
```

FAQ

## Questions teams ask.

**Does Workwae read recordings or participants?**

No. It only creates, updates and deletes meetings and looks up the host. It never reads recordings, chat, transcripts or participant lists.

**What if the mailbox has no Zoom user?**

A server app needs a Zoom user with the mailbox’s address. Without one the event is refused with `meeting_host_missing`. A server app is used only where the provider vouches for the address, so a password IMAP account needs its user’s own grant.

**Can an event have both a Teams or Meet link and Zoom?**

No. Only one of `onlineMeeting`, `onlineMeetingUrl` and `onlineMeetingService` may be set, or the call answers `multiple_meeting_options`.

**Does deleting the app delete meetings?**

No. Disconnecting a grant or removing a server app leaves existing meetings and their links on the events.

Early access

## Add video links without running a Zoom integration.

Tell us whether your users sign in to Zoom themselves or an admin hosts for them.

[Request early access](https://workwae.com/early-access/) [See meetings](https://workwae.com/features/meetings)
