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.

By Studeia Team 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)