Skip to content

Zoom Transcripts Sensor

What it ingests

Zoom cloud-recording transcripts — the VTT file Zoom generates when cloud recording and audio transcription are on — plus the meeting title, host, and participants. One meeting event is emitted per recording that actually has a completed transcript.

Transcription is the capture gate

A Zoom meeting held without cloud recording + audio transcription produces nothing for this source to ingest. Local recordings, meetings with recording off, and recordings whose transcript has not finished generating are skipped rather than stored as empty meetings.

Capture scope is therefore set by your Zoom account's recording/transcription policy, not by this source's configuration. An org that transcribes only selected meetings gets exactly those meetings; an org that records everything by default gets much broader capture from the identical config.

v1 does not ingest AI Companion summaries without a transcript, webinars as a separate type, or inbound recording.completed webhooks. Those are follow-ups.

Credential

References a zoom_s2s_oauth credential by id. The secret is a JSON blob with the three Server-to-Server OAuth values from the Zoom Marketplace:

json
{"account_id":"…","client_id":"…","client_secret":"…"}
bash
curl -sS -X POST https://your-corveil-host/api/credentials \
  -H "Authorization: Bearer <admin>" -H "Content-Type: application/json" \
  -d '{"type":"zoom_s2s_oauth","name":"acme-zoom-s2s","secret":"{\"account_id\":\"…\",\"client_id\":\"…\",\"client_secret\":\"…\"}"}'

OAuth 3LO (per-user install) is out of scope in v1. Zoom's retired JWT app type is rejected at vault write time.

Config fields

KeyRequiredNotes
host_allowlistnoComma-separated host emails. Restricts ingest to recordings hosted by these users. Blank ingests every cloud-recorded transcript the app can read.
poll_overlap_minutesnoMinutes to re-scan before the last cursor, to catch transcripts that finished generating after a poll. Defaults to 30.

Provider-side setup

  1. In the Zoom App Marketplace create a Server-to-Server OAuth app for your account.
  2. Grant the app cloud recording read scopes so it can list account recordings and download transcript files. Granular equivalents: cloud_recording:read:list_account_recordings:admin, cloud_recording:read:list_recording_files:admin. Classic: recording:read:admin.
  3. Optionally grant past-meeting participant read (meeting:read:list_past_participants:admin / meeting:read:admin) so attendees land with emails rather than name-only from the VTT.
  4. Copy Account ID, Client ID, and Client Secret into the vault JSON above.
  5. In Zoom Admin, confirm cloud recording and audio transcript are enabled for the hosts you want captured.

Wire-up

POST /api/sensors

json
{
  "sensor_type": "zoom",
  "name": "Acme Zoom",
  "config": {
    "host_allowlist": "alice@example.com, bob@example.com",
    "poll_overlap_minutes": "30"
  },
  "credentials": { "s2s_oauth": "<zoom_s2s_oauth credential id>" }
}

Verify

Run Test connection to confirm the Server-to-Server app can mint a token and list users. A bad secret fails at save/test, not on the first poll. Once polling, meetings whose cloud recording produced a completed TRANSCRIPT VTT appear as meeting events; meetings without a transcript do not.