> ## Documentation Index
> Fetch the complete documentation index at: https://docs.junojourney.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Zoom

> Permissions and data usage for the Zoom integration.

export const RelatedPages = ({pages = []}) => {
  if (pages.length === 0) return null;
  return <>
      <br />
      <strong>Related articles</strong>
      <CardGroup cols={2}>
        {pages.map(page => <Card title={page.title} href={page.href} key={page.href} />)}
      </CardGroup>
    </>;
};

<Info>
  Powers Zoom meetings and webinars for Juno events, attendance tracking, and optional recording import.
</Info>

## Why Juno integrates with Zoom

Juno integrates with Zoom using OAuth 2.0 (user-authorized). A user with a Zoom account explicitly grants Juno access through Zoom's standard consent screen. Access is per-user and per-tenant, and can be revoked at any time from either Juno or Zoom.

* **Meeting and webinar lifecycle** — organizers connect their Zoom account so Juno can create, update, and cancel the Zoom meeting or webinar for an event session.
* **Attendance** — after a session ends, Juno reads the participant list to mark attendance automatically.
* **Recordings (on demand only)** — organizers can import a session's cloud recording into Juno as learning content.

## Permissions we request

Juno requests the granular scopes below. Each maps to a single Zoom operation the event features require — nothing broader. Juno's app is published on the Zoom Marketplace, where Zoom reviews and displays the full scope list on the consent screen.

| Scope                                       | Zoom operation                    | Purpose                                                                           |
| ------------------------------------------- | --------------------------------- | --------------------------------------------------------------------------------- |
| `user:read:user`                            | Read the connected user's profile | Identify the connected host, their email, and whether they hold a webinar license |
| `meeting:write:meeting`                     | Create a meeting                  | Create the Zoom meeting for a Juno event                                          |
| `meeting:update:meeting`                    | Update a meeting                  | Keep the meeting in sync (time, title, agenda, host) when the event changes       |
| `meeting:delete:meeting`                    | Delete a meeting                  | Remove the meeting when the event is deleted                                      |
| `meeting:read:list_past_participants`       | Read past-meeting participants    | Sync who attended a meeting, including attendance duration, for reporting         |
| `webinar:read:list_webinars`                | List webinars                     | Detect webinar entitlement for the connected user                                 |
| `webinar:write:webinar`                     | Create a webinar                  | Create the Zoom webinar for events run as webinars                                |
| `webinar:update:webinar`                    | Update a webinar                  | Keep the webinar in sync when the event changes                                   |
| `webinar:delete:webinar`                    | Delete a webinar                  | Remove the webinar when the event is deleted                                      |
| `webinar:read:list_past_participants`       | Read past-webinar participants    | Sync who attended a webinar, including attendance duration, for reporting         |
| `cloud_recording:read:list_recording_files` | Read cloud recording files        | Allow an organizer to retrieve a meeting recording on demand into Juno            |

<Note>
  **Not requested:** Juno does not request scopes for chat, contacts, account-wide administration, phone, or any data unrelated to the event being managed.
</Note>

## What we do with the access

* **Meeting / webinar lifecycle** — when an event is created, updated, or deleted in Juno, we create, update, or delete the corresponding Zoom meeting or webinar (topic, start time, duration, time zone, agenda, and alternative hosts).
* **Attendance sync** — after an event ends, a scheduled job reads the participant list and records, per attendee, whether they attended and for how long. Participants are matched by email to users in the same Juno tenant.
* **Recording retrieval (on demand only)** — when an organizer explicitly requests it, Juno retrieves the completed recording for a specific event. We do not pull recordings automatically or in bulk. Juno checks the granted scopes before every recording download and prompts the organizer to reconnect if the scope is missing.

Aside from the participant list and any recording an organizer chooses to retrieve, Juno does not read or process the content of a meeting (audio, video, chat, or transcripts).

## Data we store

| Data                                     | Notes                                                       |
| ---------------------------------------- | ----------------------------------------------------------- |
| OAuth access and refresh tokens          | Encrypted at rest. Never exposed to the browser or frontend |
| Zoom user ID, email, profile photo URL   | To associate the connection with the Juno user              |
| Granted scopes                           | Stored to verify permissions before each operation          |
| Zoom meeting/webinar ID and join URL     | To link the event to its Zoom session                       |
| Recording file (when retrieved)          | Stored in tenant-isolated cloud storage                     |
| Attendance records (attended + duration) | On the event's attendee list, for reporting                 |

We do not store Zoom account passwords. Tokens are the only credentials held, and they are encrypted at rest.

## Security and storage

* **Encryption at rest** — access and refresh tokens are encrypted at rest using a dedicated server-side encryption key.
* **No frontend exposure** — tokens are used only server-side; they are never sent to the browser or included in client responses.
* **Short-lived access tokens** — access tokens are short-lived and refreshed server-side before they expire.
* **Scope enforcement** — before sensitive operations (attendance sync, recording retrieval), Juno verifies the required permission is present and skips gracefully if it is not.

<RelatedPages
  pages={[
{ href: "/integrations/zoom", title: "Zoom setup guide" }
]}
/>
