User-level OAuth
A user app signs the user in and gets an access token that expires after one hour, with a refresh token to renew it. Meetings are hosted by that user. Zoom OAuth
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.
These points are from Zoom’s developer docs, as of October 2026.
A user app signs the user in and gets an access token that expires after one hour, with a refresh token to renew it. Meetings are hosted by that user. Zoom 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
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
Limits apply per account and are shared by every app installed on it, by request type (Light, Medium, Heavy) and plan. Rate limits
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 accounts.
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.
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.
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.
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.
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 linkfrom 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 linkNo. It only creates, updates and deletes meetings and looks up the host. It never reads recordings, chat, transcripts or participant lists.
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.
No. Only one of onlineMeeting, onlineMeetingUrl and onlineMeetingService may be set, or the call answers multiple_meeting_options.
No. Disconnecting a grant or removing a server app leaves existing meetings and their links on the events.
Tell us whether your users sign in to Zoom themselves or an admin hosts for them.