Overview
Vexa joins Zoom meetings with the Zoom Meeting SDK, captures audio, and sends it through the transcription pipeline.Important Caveats (Approval + Who You Can Join)
Marketplace approval takes time
If you want your Zoom app to join meetings across other users/accounts, you generally need to submit it for Zoom Marketplace review and approval. This process can take weeks to months.Before approval: expect “your meetings only”
Before your Zoom app is approved (and depending on Zoom policy and account settings), you should assume you can reliably join only meetings created/hosted by you personally (the account that owns/authorizes the app). Use this for development and internal testing.Hosted service status
The hosted Vexa service Zoom app is not approved at the time of writing, so Zoom bots from the hosted service should be treated as limited to the authorizing user’s own meetings until approval is complete.1. Create and Configure the Zoom App
- Open Zoom App Marketplace.
- Click
Develop->Build App. - Select
General App. - Select management model:
User-managed(recommended): each user authorizes their own Zoom account.Admin-managed: account admin authorizes for users in their org.
- In
Features->Embed, enableMeeting SDK. - In
Features->Surface, enable only products you use:Meetings(required for standard bot usage)Webinars(optional, only if you support webinar joins)- Leave unrelated in-client surfaces disabled unless you actually use them.
| Field | Example |
|---|---|
| App name | Vexa Meeting Bot |
| Short description | Real-time meeting transcription |
| Company | Your Organization |
| Developer contact | maintainer@your-domain.com |
2. OAuth Configuration
Set redirect URL(s) to where your dashboard serves Zoom callback UI:- Production example:
https://dashboard.your-domain.com/auth/zoom/callback - Local dashboard dev:
http://localhost:3001/auth/zoom/callback
ZOOM_OAUTH_REDIRECT_URI
https://your-domain.com/webhooks/zoom/deauthorize
3. Scopes (Exact Matrix)
Scopes are configured in the Zoom app itself. The current dashboard OAuth start route does not append ascope query parameter and relies on the app-configured scopes.
| Scope | Required | Used by current code | Notes |
|---|---|---|---|
user:read:token | Yes for external Zoom meetings | Yes | Required to mint OBF via GET /v2/users/me/token?type=onbehalf... |
user:read:zak | No | No | Only needed if you implement a ZAK-based join path (not used in current Vexa flow) |
4. Environment Variables
Backend/bot runtime:201 initially, but the meeting quickly transitions joining -> failed with an error_details message containing Zoom SDK native addon is not available (tracked in #128).
Implementation detail:
- Dashboard and bot-manager resolve OAuth credentials with fallback:
ZOOM_OAUTH_CLIENT_ID/SECRET->ZOOM_CLIENT_ID/SECRET. - Dashboard state signing secret fallback is:
ZOOM_OAUTH_STATE_SECRET->NEXTAUTH_SECRET->VEXA_ADMIN_API_KEY.
5. OBF Flow in This Codebase
Current behavior when creating a Zoom bot:- If request includes
zoom_obf_token, backend uses it directly. - Otherwise backend reads stored user Zoom OAuth tokens.
- If access token is expired, backend refreshes it via
POST https://zoom.us/oauth/token. - Backend mints OBF via:
GET https://api.zoom.us/v2/users/me/token?type=onbehalf&meeting_id={MEETING_ID}. - Bot passes OBF to SDK join as
onBehalfToken.
vexa/services/bot-manager/app/main.pyvexa/services/bot-manager/app/zoom_obf.pyvexa/services/vexa-bot/core/src/types.tsvexa/services/vexa-bot/core/src/platforms/zoom/sdk-manager.tsvexa/services/vexa-bot/core/src/platforms/zoom/native/src/zoom_wrapper.cppVexa-Dashboard/src/app/api/zoom/oauth/start/route.tsVexa-Dashboard/src/app/api/zoom/oauth/complete/route.ts
6. Quick Verification
Internal/same-account check:- User completes Zoom OAuth in dashboard.
- User starts Zoom bot without manual
zoom_obf_token. - Bot-manager mints OBF and bot joins.
- Bot remains valid only while the authorizing user is present.
7. Security Rules
- Never commit Zoom client secrets, access tokens, refresh tokens, or OBF tokens.
- Never commit raw portal exports/snapshots containing account or credential data.
- If any credential is exposed, rotate it in Zoom immediately.