Skip to content

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_meetings for 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/token
  • GET https://api.zoom.us/v2/users?status=active&page_size=300
  • GET 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.