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

# Zoom

> Zoom REST API access for scheduling and managing meetings, webinars, and cloud recordings on behalf of a connected user.

Zoom REST API access for scheduling and managing meetings, webinars, and cloud recordings on behalf of a connected user. Use when an agent needs to create or reschedule Zoom meetings, fetch join links, list a user's upcoming meetings, pull recording and transcript links, retrieve AI Companion meeting summaries (the auto-generated "notes"), or see who attended a past meeting. Connect your Zoom account once (see below) and Lava routes your Zoom API calls through a single gateway endpoint.

14 example endpoints available through Lava's AI Gateway. See the [Zoom API docs](https://developers.zoom.us/docs/api/) for full documentation.

<Warning>This provider requires your own credentials — connect your API key or OAuth account before use.</Warning>

<Info>This is a **catch-all provider** — any valid URL under `https://api.zoom.us` is supported. Zoom REST API v2 endpoints. Construct URLs as [https://api.zoom.us/v2/\&#123;path\&#125](https://api.zoom.us/v2/\&#123;path\&#125);. Use the literal `me` in place of \{userId} to act as the connected user (e.g. users/me, users/me/meetings, users/me/recordings). Common roots: users/me (profile), users/me/meetings (list/create), meetings/\{meetingId} (get/update/delete), users/me/recordings (cloud recordings), meetings/\{meetingId}/recordings, meetings/meeting\_summaries (list AI Companion summaries — the meeting "notes"), meetings/\{meetingId}/meeting\_summary (full summary body), past\_meetings/\{meetingId} (post-meeting stats), past\_meetings/\{meetingId}/participants (who attended), past\_meetings/\{meetingUUID}/instances (recurring occurrences), meetings/\{meetingId}/invitation (join/dial-in note). Updating a meeting uses PATCH (only the fields you send change) and returns 204 No Content; DELETE also returns 204. The Lava gateway requires a JSON body on every non-GET call — for DELETE, send an empty object as body\_json. Paginate list endpoints with page\_size (default 30, max 300) and the next\_page\_token from the previous response. Meeting times use start\_time as an ISO-8601 string with timezone (e.g. 2026-06-23T15:00:00Z) plus a timezone field; duration is in minutes. AI Companion summary endpoints: the from/to on meetings/meeting\_summaries are ISO-8601 datetimes (yyyy-MM-ddThh:mm:ssZ), not plain dates; a 4xx on a summary call does not mean the endpoint is missing — it exists; diagnose the cause before advising (missing meeting-summary OAuth scope → reconnect Zoom and grant it; AI Companion Meeting Summary disabled or host below Pro plan → enable it in Zoom settings; end-to-end-encrypted meeting → summaries unsupported). Past-meeting endpoints live under past\_meetings/ (not meetings/); for a recurring meeting, resolve a specific occurrence with past\_meetings/\{meetingId}/instances then pass the URL-encoded UUID. See [https://developers.zoom.us/docs/api/](https://developers.zoom.us/docs/api/) for the full reference. The endpoints below are curated examples.</Info>

## Connecting Your Zoom Account

Connect your Zoom account once and Lava routes your Zoom API calls for you. You authorize Lava to access your Zoom account, and Lava uses that authorization only to forward your own requests.

**Via dashboard:**

1. Sign in at [lava.so/dashboard](https://lava.so/dashboard) and open **Connected Services** (`/dashboard/wallet/connected-services`).
2. Find **Zoom** in the list of available providers and click **Connect**.
3. Approve access to your Zoom account.
4. You're returned to the Connected Services page, where Zoom now appears under **Stored Credentials**.

**Via agent (MCP):**

1. Call the `connect_service` tool with `service: "zoom"`.
2. Open the authorization URL it returns in a browser.
3. Approve access to your Zoom account. The connection is stored and the original agent call can proceed.

**Via Lava Desktop:**

1. Open Lava Desktop and click **+ Add app**.
2. Choose **Zoom** and authorize access in the in-app window.

## Requested Permissions

When you connect, you grant Lava access to the following Zoom capabilities. You review and approve these when you authorize.

| Scope                                       | What It Enables                           |
| ------------------------------------------- | ----------------------------------------- |
| `user:read:user`                            | View your profile                         |
| `meeting:read:list_meetings`                | List your meetings                        |
| `meeting:read:meeting`                      | View a meeting's details                  |
| `meeting:write:meeting`                     | Create a meeting                          |
| `meeting:update:meeting`                    | Reschedule or edit a meeting              |
| `meeting:delete:meeting`                    | Cancel a meeting                          |
| `meeting:read:invitation`                   | Get a meeting's join details              |
| `cloud_recording:read:list_user_recordings` | List your cloud recordings                |
| `cloud_recording:read:list_recording_files` | Get a meeting's recordings and transcript |
| `meeting:read:list_summaries`               | List AI Companion meeting summaries       |
| `meeting:read:summary`                      | Read an AI Companion summary              |
| `meeting:read:past_meeting`                 | View past-meeting stats                   |
| `meeting:read:list_past_participants`       | See who attended a past meeting           |

## Using Zoom

Once connected, your Zoom credential is available to any agent or SDK call routed through Lava's gateway — no token passing required. Call Zoom's API (`https://api.zoom.us/v2/...`) through `https://api.lava.so/v1/forward` and Lava attaches your authorization automatically. See the **Endpoints** section below for example calls.

## Removing Zoom

Disconnecting revokes Lava's access to your Zoom account. Subsequent API calls fail until you reconnect.

**Via dashboard:**

1. Open [Connected Services](https://lava.so/dashboard/wallet/connected-services).
2. Find **Zoom** under **Stored Credentials**.
3. Click the trash icon and confirm.

**Via API or MCP:**

* REST: `DELETE https://api.lava.so/v1/credentials/zoom` (returns 204 No Content).
* MCP: call the `disconnect_service` tool with `service: "zoom"`.

You can also review and revoke connected apps from your Zoom account settings.

## Data Handling

Lava stores your Zoom authorization securely, scoped to your wallet, and uses it only to forward your own API calls to Zoom. If your authorization expires or is revoked, your next call prompts you to reconnect. Lava does not read, cache, or redistribute your Zoom content beyond what's needed to proxy a single request.

## Support

Questions about this integration: [support@lava.so](mailto:support@lava.so).

## Endpoints

### Get the connected Zoom account's profile (email, account id, plan type, personal meeting id). Use this as a cheap auth probe after connect — confirms the OAuth grant is healthy without listing meetings.

**GET** `https://api.zoom.us/v2/users/me` — Free

<Tabs>
  <Tab title="SDK">
    ```typescript theme={null}
    const data = await lava.gateway('https://api.zoom.us/v2/users/me', { method: 'GET' });
    ```
  </Tab>

  <Tab title="cURL">
    ```bash theme={null}
    curl "https://api.lava.so/v1/forward?u=https%3A%2F%2Fapi.zoom.us%2Fv2%2Fusers%2Fme" \
      -H "Authorization: Bearer $LAVA_SECRET_KEY"
    ```
  </Tab>
</Tabs>

### List the connected user's meetings. Filter with the type query param: scheduled (default), live, upcoming, upcoming\_meetings, or previous\_meetings. Paginate with page\_size (max 300) and next\_page\_token. Returns lightweight meeting summaries (id, topic, start\_time, join\_url) — use meetings/\{meetingId} for full detail.

**GET** `https://api.zoom.us/v2/users/me/meetings?type=upcoming&page_size=30` — Free

<Tabs>
  <Tab title="SDK">
    ```typescript theme={null}
    const data = await lava.gateway('https://api.zoom.us/v2/users/me/meetings?type=upcoming&page_size=30', { method: 'GET' });
    ```
  </Tab>

  <Tab title="cURL">
    ```bash theme={null}
    curl "https://api.lava.so/v1/forward?u=https%3A%2F%2Fapi.zoom.us%2Fv2%2Fusers%2Fme%2Fmeetings%3Ftype%3Dupcoming%26page_size%3D30" \
      -H "Authorization: Bearer $LAVA_SECRET_KEY"
    ```
  </Tab>
</Tabs>

### Schedule a meeting for the connected user. Required: topic and type (2 = scheduled). Set start\_time as ISO-8601 with timezone and duration in minutes; pass a timezone field for recurring meetings. Returns 201 with the meeting id, join\_url, and the host start\_url. Add a settings object to control waiting\_room, join\_before\_host, mute\_upon\_entry, etc.

**POST** `https://api.zoom.us/v2/users/me/meetings` — Free

<Tabs>
  <Tab title="SDK">
    ```typescript theme={null}
    const data = await lava.gateway('https://api.zoom.us/v2/users/me/meetings', {
      body: {
    "topic": "Project sync",
    "type": 2,
    "start_time": "2026-06-25T15:00:00Z",
    "duration": 30,
    "timezone": "America/New_York",
    "settings": {
      "join_before_host": false,
      "waiting_room": true
    }
    },
    });
    ```
  </Tab>

  <Tab title="cURL">
    ```bash theme={null}
    curl -X POST "https://api.lava.so/v1/forward?u=https%3A%2F%2Fapi.zoom.us%2Fv2%2Fusers%2Fme%2Fmeetings" \
      -H "Authorization: Bearer $LAVA_SECRET_KEY" \
      -H "Content-Type: application/json" \
      -d '{"topic":"Project sync","type":2,"start_time":"2026-06-25T15:00:00Z","duration":30,"timezone":"America/New_York","settings":{"join_before_host":false,"waiting_room":true}}'
    ```
  </Tab>
</Tabs>

### Get a single meeting by numeric meeting id (from the list or create response). Returns full detail including join\_url, settings, agenda, and recurrence. Use the meeting id, not the meeting UUID.

**GET** `https://api.zoom.us/v2/meetings/89012345678` — Free

<Tabs>
  <Tab title="SDK">
    ```typescript theme={null}
    const data = await lava.gateway('https://api.zoom.us/v2/meetings/89012345678', { method: 'GET' });
    ```
  </Tab>

  <Tab title="cURL">
    ```bash theme={null}
    curl "https://api.lava.so/v1/forward?u=https%3A%2F%2Fapi.zoom.us%2Fv2%2Fmeetings%2F89012345678" \
      -H "Authorization: Bearer $LAVA_SECRET_KEY"
    ```
  </Tab>
</Tabs>

### Update a scheduled meeting. Send only the fields you are changing — omitted fields are left untouched. Returns 204 No Content on success. Use to reschedule (start\_time/duration), rename (topic), or change settings.

**PATCH** `https://api.zoom.us/v2/meetings/89012345678` — Free

<Tabs>
  <Tab title="SDK">
    ```typescript theme={null}
    const data = await lava.gateway('https://api.zoom.us/v2/meetings/89012345678', { method: 'PATCH', body: {"start_time":"2026-06-25T16:00:00Z","duration":45} });
    ```
  </Tab>

  <Tab title="cURL">
    ```bash theme={null}
    curl -X PATCH "https://api.lava.so/v1/forward?u=https%3A%2F%2Fapi.zoom.us%2Fv2%2Fmeetings%2F89012345678" \
      -H "Authorization: Bearer $LAVA_SECRET_KEY" \
      -H "Content-Type: application/json" \
      -d '{"start_time":"2026-06-25T16:00:00Z","duration":45}'
    ```
  </Tab>
</Tabs>

### Delete a scheduled meeting. Returns 204 No Content on success. The gateway requires a JSON body on every non-GET call, so send an empty object as body\_json. Pass ?schedule\_for\_reminder=true in the URL to email the host a cancellation notice.

**DELETE** `https://api.zoom.us/v2/meetings/89012345678` — Free

<Tabs>
  <Tab title="SDK">
    ```typescript theme={null}
    const data = await lava.gateway('https://api.zoom.us/v2/meetings/89012345678', { method: 'DELETE', body: {} });
    ```
  </Tab>

  <Tab title="cURL">
    ```bash theme={null}
    curl -X DELETE "https://api.lava.so/v1/forward?u=https%3A%2F%2Fapi.zoom.us%2Fv2%2Fmeetings%2F89012345678" \
      -H "Authorization: Bearer $LAVA_SECRET_KEY" \
      -H "Content-Type: application/json" \
      -d '{}'
    ```
  </Tab>
</Tabs>

### List the connected user's cloud recordings within a date window. Pass from and to as YYYY-MM-DD (max 30-day span); paginate with page\_size and next\_page\_token. Each meeting entry carries a recording\_files array with download\_url and play\_url per file.

**GET** `https://api.zoom.us/v2/users/me/recordings?from=2026-06-01&to=2026-06-23&page_size=30` — Free

<Tabs>
  <Tab title="SDK">
    ```typescript theme={null}
    const data = await lava.gateway('https://api.zoom.us/v2/users/me/recordings?from=2026-06-01&to=2026-06-23&page_size=30', { method: 'GET' });
    ```
  </Tab>

  <Tab title="cURL">
    ```bash theme={null}
    curl "https://api.lava.so/v1/forward?u=https%3A%2F%2Fapi.zoom.us%2Fv2%2Fusers%2Fme%2Frecordings%3Ffrom%3D2026-06-01%26to%3D2026-06-23%26page_size%3D30" \
      -H "Authorization: Bearer $LAVA_SECRET_KEY"
    ```
  </Tab>
</Tabs>

### Get all cloud recording files for a single meeting (recording\_files with download\_url/play\_url, plus any audio transcript). Pass the meeting id for the latest instance, or a URL-encoded meeting UUID for a specific past occurrence. The transcript is the recording\_files entry with file\_type TRANSCRIPT (a VTT file) — fetch its download\_url to read the text; the response carries the link, not the transcript text inline.

**GET** `https://api.zoom.us/v2/meetings/89012345678/recordings` — Free

<Tabs>
  <Tab title="SDK">
    ```typescript theme={null}
    const data = await lava.gateway('https://api.zoom.us/v2/meetings/89012345678/recordings', { method: 'GET' });
    ```
  </Tab>

  <Tab title="cURL">
    ```bash theme={null}
    curl "https://api.lava.so/v1/forward?u=https%3A%2F%2Fapi.zoom.us%2Fv2%2Fmeetings%2F89012345678%2Frecordings" \
      -H "Authorization: Bearer $LAVA_SECRET_KEY"
    ```
  </Tab>
</Tabs>

### List the connected user's AI Companion meeting summaries within a date window. IMPORTANT: from and to are ISO-8601 datetimes (yyyy-MM-ddThh:mm:ssZ), NOT the plain YYYY-MM-DD that the recordings endpoint uses — sending plain dates returns a 400. Returns lightweight records (meeting id/uuid, topic, summary start time); paginate with page\_size and next\_page\_token. Empty unless the host is on a Pro+ plan with AI Companion Meeting Summary enabled. A 4xx here does not mean the endpoint is missing — it exists; diagnose the cause before advising the user: missing meeting-summary OAuth scope (reconnect Zoom and grant it), AI Companion Meeting Summary disabled or host below a Pro plan (enable it in Zoom settings), or an end-to-end-encrypted meeting (summaries unsupported). Do not report that the endpoint does not exist.

**GET** `https://api.zoom.us/v2/meetings/meeting_summaries?from=2026-06-01T00:00:00Z&to=2026-06-23T23:59:59Z&page_size=30` — Free

<Tabs>
  <Tab title="SDK">
    ```typescript theme={null}
    const data = await lava.gateway('https://api.zoom.us/v2/meetings/meeting_summaries?from=2026-06-01T00:00:00Z&to=2026-06-23T23:59:59Z&page_size=30', { method: 'GET' });
    ```
  </Tab>

  <Tab title="cURL">
    ```bash theme={null}
    curl "https://api.lava.so/v1/forward?u=https%3A%2F%2Fapi.zoom.us%2Fv2%2Fmeetings%2Fmeeting_summaries%3Ffrom%3D2026-06-01T00%3A00%3A00Z%26to%3D2026-06-23T23%3A59%3A59Z%26page_size%3D30" \
      -H "Authorization: Bearer $LAVA_SECRET_KEY"
    ```
  </Tab>
</Tabs>

### Get the full AI Companion summary for one meeting — the overview, section-by-section details, and next steps (the AI-generated meeting notes). Pass the numeric meeting id for the latest instance, or a URL-encoded meeting UUID for a specific past occurrence (double-encode a UUID that contains a slash or starts with //). Returns 404 (code 3001) if no summary was generated for that meeting. A 4xx (as opposed to that 404) does not mean the endpoint is missing — it exists; common causes are a missing meeting-summary OAuth scope (reconnect Zoom and grant it), AI Companion Meeting Summary disabled or host below a Pro plan (400 code 3000; enable it in Zoom settings), or an end-to-end-encrypted meeting (no summary). Diagnose from the error before telling the user to reconnect.

**GET** `https://api.zoom.us/v2/meetings/89012345678/meeting_summary` — Free

<Tabs>
  <Tab title="SDK">
    ```typescript theme={null}
    const data = await lava.gateway('https://api.zoom.us/v2/meetings/89012345678/meeting_summary', { method: 'GET' });
    ```
  </Tab>

  <Tab title="cURL">
    ```bash theme={null}
    curl "https://api.lava.so/v1/forward?u=https%3A%2F%2Fapi.zoom.us%2Fv2%2Fmeetings%2F89012345678%2Fmeeting_summary" \
      -H "Authorization: Bearer $LAVA_SECRET_KEY"
    ```
  </Tab>
</Tabs>

### Get post-meeting stats for the most recent instance of a meeting — actual start/end time, total minutes, participant count, and host. Accepts the numeric meeting id (resolves to the last instance) or a URL-encoded meeting UUID for a specific occurrence (double-encode a UUID containing a slash or starting with //).

**GET** `https://api.zoom.us/v2/past_meetings/89012345678` — Free

<Tabs>
  <Tab title="SDK">
    ```typescript theme={null}
    const data = await lava.gateway('https://api.zoom.us/v2/past_meetings/89012345678', { method: 'GET' });
    ```
  </Tab>

  <Tab title="cURL">
    ```bash theme={null}
    curl "https://api.lava.so/v1/forward?u=https%3A%2F%2Fapi.zoom.us%2Fv2%2Fpast_meetings%2F89012345678" \
      -H "Authorization: Bearer $LAVA_SECRET_KEY"
    ```
  </Tab>
</Tabs>

### List who actually attended a past meeting — per participant: name, email when available, join time, leave time, and duration. The answer to "who was in my last meeting and how long did they stay". Paginate with page\_size and next\_page\_token. Accepts the numeric meeting id (last instance) or a URL-encoded meeting UUID for a specific occurrence.

**GET** `https://api.zoom.us/v2/past_meetings/89012345678/participants?page_size=30` — Free

<Tabs>
  <Tab title="SDK">
    ```typescript theme={null}
    const data = await lava.gateway('https://api.zoom.us/v2/past_meetings/89012345678/participants?page_size=30', { method: 'GET' });
    ```
  </Tab>

  <Tab title="cURL">
    ```bash theme={null}
    curl "https://api.lava.so/v1/forward?u=https%3A%2F%2Fapi.zoom.us%2Fv2%2Fpast_meetings%2F89012345678%2Fparticipants%3Fpage_size%3D30" \
      -H "Authorization: Bearer $LAVA_SECRET_KEY"
    ```
  </Tab>
</Tabs>

### List the past occurrences (each with its UUID and start time) of a recurring meeting. Use this to resolve the UUID of a specific occurrence, then pass that URL-encoded UUID to the participants, past-meeting, recordings, or meeting\_summary endpoints to scope them to that one occurrence.

**GET** `https://api.zoom.us/v2/past_meetings/89012345678/instances` — Free

<Tabs>
  <Tab title="SDK">
    ```typescript theme={null}
    const data = await lava.gateway('https://api.zoom.us/v2/past_meetings/89012345678/instances', { method: 'GET' });
    ```
  </Tab>

  <Tab title="cURL">
    ```bash theme={null}
    curl "https://api.lava.so/v1/forward?u=https%3A%2F%2Fapi.zoom.us%2Fv2%2Fpast_meetings%2F89012345678%2Finstances" \
      -H "Authorization: Bearer $LAVA_SECRET_KEY"
    ```
  </Tab>
</Tabs>

### Get the formatted invitation note for a scheduled meeting — the join URL, dial-in numbers, meeting id, and passcode, returned as a single invitation string. Use this when the user asks for the join details to share. Pass the numeric meeting id.

**GET** `https://api.zoom.us/v2/meetings/89012345678/invitation` — Free

<Tabs>
  <Tab title="SDK">
    ```typescript theme={null}
    const data = await lava.gateway('https://api.zoom.us/v2/meetings/89012345678/invitation', { method: 'GET' });
    ```
  </Tab>

  <Tab title="cURL">
    ```bash theme={null}
    curl "https://api.lava.so/v1/forward?u=https%3A%2F%2Fapi.zoom.us%2Fv2%2Fmeetings%2F89012345678%2Finvitation" \
      -H "Authorization: Bearer $LAVA_SECRET_KEY"
    ```
  </Tab>
</Tabs>

## Next Steps

<CardGroup cols={2}>
  <Card title="All Providers" icon="grid" href="/gateway/supported-providers">
    Browse all supported AI providers
  </Card>

  <Card title="Forward Proxy" icon="route" href="/gateway/forward-proxy">
    Learn how to construct proxy URLs and authenticate requests
  </Card>
</CardGroup>
