Skip to main content
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 for full documentation.
This provider requires your own credentials — connect your API key or OAuth account before use.
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/{path}. 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/ for the full reference. The endpoints below are curated examples.

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 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.
ScopeWhat It Enables
user:read:userView your profile
meeting:read:list_meetingsList your meetings
meeting:read:meetingView a meeting’s details
meeting:write:meetingCreate a meeting
meeting:update:meetingReschedule or edit a meeting
meeting:delete:meetingCancel a meeting
meeting:read:invitationGet a meeting’s join details
cloud_recording:read:list_user_recordingsList your cloud recordings
cloud_recording:read:list_recording_filesGet a meeting’s recordings and transcript
meeting:read:list_summariesList AI Companion meeting summaries
meeting:read:summaryRead an AI Companion summary
meeting:read:past_meetingView past-meeting stats
meeting:read:list_past_participantsSee 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.
  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.

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
const data = await lava.gateway('https://api.zoom.us/v2/users/me', { method: 'GET' });

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
const data = await lava.gateway('https://api.zoom.us/v2/users/me/meetings?type=upcoming&page_size=30', { method: 'GET' });

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
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
}
},
});

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
const data = await lava.gateway('https://api.zoom.us/v2/meetings/89012345678', { method: 'GET' });

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
const data = await lava.gateway('https://api.zoom.us/v2/meetings/89012345678', { method: 'PATCH', body: {"start_time":"2026-06-25T16:00:00Z","duration":45} });

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
const data = await lava.gateway('https://api.zoom.us/v2/meetings/89012345678', { method: 'DELETE', body: {} });

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
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' });

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
const data = await lava.gateway('https://api.zoom.us/v2/meetings/89012345678/recordings', { method: 'GET' });

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
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' });

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
const data = await lava.gateway('https://api.zoom.us/v2/meetings/89012345678/meeting_summary', { method: 'GET' });

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
const data = await lava.gateway('https://api.zoom.us/v2/past_meetings/89012345678', { method: 'GET' });

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
const data = await lava.gateway('https://api.zoom.us/v2/past_meetings/89012345678/participants?page_size=30', { method: 'GET' });

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
const data = await lava.gateway('https://api.zoom.us/v2/past_meetings/89012345678/instances', { method: 'GET' });

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
const data = await lava.gateway('https://api.zoom.us/v2/meetings/89012345678/invitation', { method: 'GET' });

Next Steps

All Providers

Browse all supported AI providers

Forward Proxy

Learn how to construct proxy URLs and authenticate requests