Skip to content
Studeia Docs

Zoom integration (Server-to-Server OAuth + webhook + recording sync)

How to integrate Zoom as Studeia live class video provider: Server-to-Server OAuth, webhook events (meeting lifecycle + recording.completed), automatic VTT transcript ingestible in course RAG.

2026-05-24 5 min
Resposta curta

Zoom integrates with Studeia as video provider via Server-to-Server OAuth. Webhook events HMAC SHA-256 capture meeting lifecycle + recordings. Automatic VTT transcript ingestible in course RAG. AES-256-GCM encrypted credentials. Setup ~20min: create S2S OAuth app in Zoom Marketplace + paste Account ID + Client ID + Secret in Studeia Settings > Video Provider > Zoom.

Setup

1. Create Server-to-Server OAuth app

  1. https://marketplace.zoom.us > Develop > Build App
  2. App Type: Server-to-Server OAuth
  3. Copy Account ID, Client ID, Client Secret

2. Required scopes

  • meeting:read:admin
  • meeting:write:admin
  • recording:read:admin
  • user:read:admin

3. Event Subscriptions (webhook)

  1. App > Feature > Event Subscriptions
  2. Subscription URL: https://[tenant].studeia.com/api/webhooks/video/zoom
  3. Webhook secret token (copy to Studeia)
  4. Events: Meeting Started/Ended, Participant Joined/Left, Recording Completed, Recording Transcript Completed

4. Configure in Studeia

Settings > Video Provider > Zoom > Add: Account ID, Client ID, Client Secret, Webhook Secret Token, Set as default (optional). Studeia stores all AES-256-GCM encrypted.

How it works

LiveClass created with videoProvider=zoom → Studeia ZoomAdapter.createMeeting() with Server-to-Server OAuth token (cached Redis 55min) → POST /v2/users/{userId}/meetings → returns meetingId + joinUrl + startUrl. Student joins via joinMethod=external (Zoom doesn't support iframe).

Webhooks notify: meeting.started, participant.joined, meeting.ended, recording.completed, recording.transcript_completed.

Cron fallback

/api/cron/recording-sync every 15min as fallback (webhooks are unreliable — delays, subscription expiry, network failures).

RAG ingestion

After transcription approved by teacher: text becomes chunks + embeddings + ContentBlock with metadata { source: "live_class_transcript", liveClassId, courseId }. AI tutor cites: "In the live class on date X, the teacher explained that..."

Troubleshooting

  • 401 Unauthorized: token expired. S2S OAuth token cached Redis 55min (auto-renew).
  • Webhook not arriving: verify URL publicly accessible + HMAC signature.
  • Recording without VTT: Zoom Cloud Recording must be enabled (not Local Recording).

Costs

Studeia: zero additional. Zoom: direct from Zoom (per-host license).

See also

FAQ

How to configure Zoom in Studeia?

Create Server-to-Server OAuth app in Zoom Marketplace (scopes: meeting:read, meeting:write, recording:read, user:read). In Studeia > Settings > Video Provider > Zoom: Account ID + Client ID + Client Secret. Configure webhook at /api/webhooks/video/zoom with HMAC SHA-256 via x-zm-signature. Setup ~20 min.

Are Zoom recordings available in Studeia?

Yes, automatically. recording.completed webhook notifies + cron /api/cron/recording-sync every 15min as fallback. recordingUrl saved in LiveClass. VTT transcript also captured in LiveClassTranscription (status pending → approved → ingested), optionally ingestible in course RAG for AI tutor to cite.

What's Zoom meeting duration limit?

Depends on Zoom plan: Free = 40min, Pro = 30h, Business+ = 30h. Studeia adds no limit.

Can I use Zoom Webinar?

Yes, with additional Zoom Webinar license. Studeia currently creates 'meetings' by default. For Webinar (1 host + 1000+ passive attendees): configure via Zoom API directly + LTI launch in Studeia. Roadmap: native Webinar support.

Veja tambem

Zoom integration (Server-to-Server OAuth + webhook + recording sync)