Zoom#
Zoom is registered for API sync with sync-coupled user import. It stores one Zoom Server-to-Server OAuth credential bundle per organization, requests a short-lived Zoom bearer token on demand, pulls active Zoom users and upcoming scheduled meetings into a reviewable import session, and projects each meeting into the internal integrations task-create draft for operator review.
| Capability | Method | Status |
|---|---|---|
SYNC |
Pull upcoming scheduled meetings from the Zoom API | Built |
USER_IMPORT |
Bring active Zoom account users into task-import mapping | Built as part of API sync |
CSV_IMPORT |
Upload a Zoom report export | Not built |
WEBHOOK |
Verify Zoom webhook events | Not built |
The endpoints below live under /api/v1/providers/zoom/.... They are generic:
the same routes serve any registered provider by substituting the {provider}
path segment. All routes require an organization-scoped user token (see
Authentication).
Discovery#
GET /api/v1/providers/zoom
{
"status": "success",
"data": { "provider": "zoom", "capabilities": ["SYNC", "USER_IMPORT"] }
}
Credential Verification#
Zoom uses Server-to-Server OAuth for first-ship sync. Store the Zoom app credentials as an opaque JSON string through the existing credential endpoint:
PUT /api/v1/providers/zoom/credentials?organization_id=<id>
POST /api/v1/providers/zoom/credentials/verify?organization_id=<id>
{
"secret": "{\"account_id\":\"...\",\"client_id\":\"...\",\"client_secret\":\"...\"}"
}
Verification exchanges the stored app credentials at
POST https://zoom.us/oauth/token with grant_type=account_credentials, then
probes GET /users and GET /users/{userId}/meetings. Rejected app
credentials, missing scopes, inactive apps, or malformed JSON return
invalid_api_key. Stored secrets are encrypted at rest and never returned by
the credential endpoints.
Importing From The Zoom API#
POST /api/v1/providers/zoom/imports/sync?organization_id=<id>
Uses the stored encrypted Zoom Server-to-Server OAuth credential bundle to fetch a bounded account-level scheduled-meeting import. The current generic sync endpoint has no provider-specific request body, so sync scope is fixed in the adapter.
The first shipped sync window is intentionally bounded:
- active Zoom account users only;
type=upcoming_meetingsfor scheduled, unexpired meetings;- local 90-day future review window;
- no past meeting history;
- no per-meeting detail fetch.
The adapter calls:
POST https://zoom.us/oauth/tokenGET https://api.zoom.us/v2/users?status=active&page_size=300GET https://api.zoom.us/v2/users/{userId}/meetings?type=upcoming_meetings&page_size=300
Zoom next_page_token pagination is followed within first-ship bounds. Rate
limits (429) and transient server failures are retried with bounded backoff.
Invalid app credentials, expired/rejected bearer tokens, and missing-scope
responses return credential errors.
User Mapping#
Zoom USER_IMPORT rides the sync flow. The adapter proposes mappings from
active account users returned by GET /users.
The primary matching key is the Zoom user id (sourceAccountId). Email is
secondary when present, then name. Meeting hosts are resolved through this
mapping and can become creatorId; they are not automatically assigned as task
owners or requesters.
Projection Field Coverage#
| Zoom source | TeamBoost draft field | Notes |
|---|---|---|
Meeting topic |
title |
Error if shorter than 2 characters |
| Scheduled meeting | type |
Meetings default to OTHER with a mapping note |
Meeting agenda |
description |
Uses the list response; Zoom may truncate long agendas |
| Scheduled/unexpired meeting | status |
Maps to NOT_STARTED |
| No native task priority | priority |
Defaults to UNKNOWN with a mapping note |
Meeting host_id |
creatorId |
Resolved through user mapping when possible |
| Meeting host | ownerId, requestedById |
Left unset until product defines assignment/requester rules |
Meeting start_time and duration |
plannedStartDate, estimatedStartDate, plannedEndDate |
Meeting duration is not converted into TeamBoost effort duration |
| Zoom | projectTitle |
Defaults to Zoom |
| Meeting number, UUID, join URL, host, timezone, PMI, recurrence/settings, registration URL, sync context | descriptionJson |
Preserved for review |
Not Built Yet#
- CSV import from Zoom dashboard or report exports.
- Webhook registration and event verification.
- Standalone Zoom directory import before sync.
- Provider-specific sync filters or persisted incremental sync state.
- Per-meeting detail fetch for full agenda text.
- Recordings, transcripts, or action-item extraction.
- Live Zoom Server-to-Server OAuth validation in this repo's automated tests; use a real non-production Zoom app and sample meetings for release smoke.