<!-- Generated by `just docs` from catalog/toolkits/zoom.yaml, catalog/expansions/zoom.yaml, catalog/evals/scorecard.json. Edit the source, not this file. -->

# Zoom

Meetings and webinars. Schedule, change, and cancel them, manage registrants, review attendance, and work with cloud recordings.

| Property | Value |
| --- | --- |
| Slug | `zoom` |
| Definition version | `0.1.0` |
| Base URL | `https://api.zoom.us/v2` |
| Auth schemes | `oauth2` |
| Action tools | 31 |
| By class | 15 read, 12 write, 4 destructive |
| Triggers | 0 |
| Provider rate limit | not declared, so outbound calls are unpaced |

## Measured routing accuracy

77 golden cases replayed through the router over the whole index: measured over corpus `ea4f12ad2948` (65 toolkits, 2283 tools indexed and 13 declared uncallable), 31 cases written by hand and 46 cases from the paraphrase pass. A case counts as top-1 when its gold tool ranked first and top-8 when it reached the slate at all.

| Measure | Cases | Share |
| --- | --- | --- |
| top-1 | 36/77 | 46.8% |
| top-8 | 54/77 | 70.1% |

The sweep is offline: the reranker is a deterministic identity fake that returns candidates in the order retrieval produced them, so top-1 measures retrieval order rather than a reranked slate. `just eval-live` measures the same cases through the live reranker.

## Authentication

Connect an entity with `ConnectionsService.InitiateConnection`, naming this toolkit's slug. Credentials stay in the connections vault; callers hold connected-account ids only.

### `oauth2`

| Property | Value |
| --- | --- |
| Authorization URL | `https://zoom.us/oauth/authorize` |
| Token URL | `https://zoom.us/oauth/token` |
| Default scopes | `user:read:user`, `meeting:read:meeting`, `meeting:write:meeting` |
| Refresh tokens | yes, the refresh daemon renews ahead of expiry |

## Tools

31 action tools. The catalog-wide slug is `zoom.<tool>`, which is what `search_tools` returns and `call_tool` takes.

### `zoom.create_meeting`

Schedule a new Zoom meeting for a user. Use when someone wants to set up, schedule, or book a video call or conference. Supports instant, one-time, or recurring meetings with a topic, start time, duration, password, and settings like waiting room or join-before-host. Returns the join_url and start_url.

Class `write` (writes, no confirmation needed). Scopes `meeting:write:meeting`. Calls `POST /users/{{params.user_id}}/meetings`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `agenda` | string | no | Longer free-text description of the meeting. |
| `auto_recording` | string, one of local, cloud, none | no | Automatic recording mode. Default none. |
| `duration` | integer | no | Length in minutes. |
| `host_video` | boolean | no | Turn the host's video on at meeting start. Default false. |
| `join_before_host` | boolean | no | Let participants join before the host starts. Default false. |
| `mute_upon_entry` | boolean | no | Mute participants automatically when they join. Default false. |
| `participant_video` | boolean | no | Turn participants' video on at meeting start. Default false. |
| `password` | string | no | Meeting passcode required to join. |
| `start_time` | string | no | Start time, ISO 8601, e.g. "2026-08-01T15:00:00Z". Required for scheduled or fixed-time recurring meetings. |
| `timezone` | string | no | IANA time zone for start_time, e.g. "America/Chicago". |
| `topic` | string | **yes** | Meeting title. |
| `type` | integer, one of 1, 2, 3, 8 | no | Meeting type: 1 instant, 2 scheduled (default), 3 recurring with no fixed time, 8 recurring with a fixed time. |
| `user_id` | string | **yes** | Zoom user id or email to schedule the meeting under, or "me" for the connected account. |
| `waiting_room` | boolean | no | Hold participants in a waiting room until admitted. Default false. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `agenda` | string |  |
| `duration` | integer |  |
| `host_id` | string |  |
| `id` | string |  |
| `join_url` | string |  |
| `password` | string |  |
| `start_time` | string |  |
| `start_url` | string |  |
| `status` | string |  |
| `timezone` | string |  |
| `topic` | string |  |
| `type` | integer |  |
| `uuid` | string |  |

Also retrieved by: "schedule a meeting with the design team", "book a video call for tomorrow afternoon", "set up a new zoom invite and send me the link", "get a recurring standup on the books", "put together a conference line for the client kickoff".

### `zoom.get_meeting`

Get one Zoom meeting or call's full details by meeting id: topic, time, duration, passcode, join_url, start_url, and settings. Use after list_meetings or when the user already has a meeting id or number. For a meeting that already ended use get_past_meeting_details instead.

Class `read` (reads only). Scopes `meeting:read:meeting`. Calls `GET /meetings/{{params.meeting_id}}`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `meeting_id` | string | **yes** | Zoom meeting id from create_meeting or list_meetings. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `agenda` | string |  |
| `duration` | integer |  |
| `host_id` | string |  |
| `id` | string |  |
| `join_url` | string |  |
| `password` | string |  |
| `settings` | object |  |
| `settings.auto_recording` | string |  |
| `settings.join_before_host` | boolean |  |
| `settings.mute_upon_entry` | boolean |  |
| `settings.waiting_room` | boolean |  |
| `start_time` | string |  |
| `start_url` | string |  |
| `status` | string |  |
| `timezone` | string |  |
| `topic` | string |  |
| `type` | integer |  |
| `uuid` | string |  |

Also retrieved by: "pull up the details for a meeting I already booked", "what's the passcode for my meeting", "show me the join link and dial-in info for that scheduled session", "what time and where is that meeting again", "open up the info for a call that's already on the calendar".

### `zoom.list_meetings`

List a user's scheduled, live, or upcoming Zoom meetings or video calls. Use when the user asks what meetings or calls they have, what's on their Zoom calendar, or wants to find a meeting to join, edit, or cancel. Filter with type: scheduled (default), live, or upcoming.

Class `read` (reads only). Scopes `meeting:read:meeting`. Calls `GET /users/{{params.user_id}}/meetings`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `next_page_token` | string | no | Token from a previous page's next_page_token. |
| `page_size` | integer | no | Page size, default 30. |
| `type` | string, one of scheduled, live, upcoming | no | Which meetings to return. Default scheduled. |
| `user_id` | string | **yes** | Zoom user id or email whose meetings to list, or "me" for the connected account. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `meetings` | array of object |  |
| `meetings[].duration` | integer |  |
| `meetings[].id` | string |  |
| `meetings[].join_url` | string |  |
| `meetings[].start_time` | string |  |
| `meetings[].timezone` | string |  |
| `meetings[].topic` | string |  |
| `meetings[].type` | integer |  |
| `meetings[].uuid` | string |  |
| `next_page_token` | string |  |
| `page_size` | integer |  |
| `total_records` | integer |  |

Also retrieved by: "what meetings do I have on my zoom calendar this week", "show me every call I've got scheduled", "what's live on zoom right now", "pull up my upcoming zoom meetings", "what do I have booked for today".

### `zoom.update_meeting`

Change an existing Zoom meeting's topic, time, duration, agenda, password, or settings by meeting id. Use when the user wants to move, reschedule, rename, or edit a scheduled meeting or call. Only the fields given are changed. To cancel it entirely use delete_meeting.

Class `write` (writes, no confirmation needed). Scopes `meeting:write:meeting`. Calls `PATCH /meetings/{{params.meeting_id}}`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `agenda` | string | no | New free-text description. |
| `duration` | integer | no | New length in minutes. |
| `join_before_host` | boolean | no | Let participants join before the host starts. |
| `meeting_id` | string | **yes** | Meeting to update. |
| `mute_upon_entry` | boolean | no | Mute participants automatically when they join. |
| `occurrence_id` | string | no | Target one occurrence of a recurring meeting instead of the series. |
| `password` | string | no | New meeting passcode. |
| `start_time` | string | no | New start time, ISO 8601. |
| `timezone` | string | no | New IANA time zone. |
| `topic` | string | no | New meeting title. |
| `waiting_room` | boolean | no | Hold participants in a waiting room until admitted. |

Also retrieved by: "push that meeting back an hour", "change the passcode on an existing call", "reschedule my zoom session to a new time", "turn on the waiting room for an upcoming call", "rename a meeting that's already on the calendar".

### `zoom.delete_meeting`

Cancel and remove a scheduled Zoom meeting by meeting id. Use when the user wants to cancel, delete, or call off a meeting or video call. Unrecoverable; invitees can be notified. Pass occurrence_id to cancel one occurrence of a recurring meeting instead of the whole series.

Class `destructive` (held by the mutation gate until the call's own arguments carry `"confirm": true`). Scopes `meeting:write:meeting`. Calls `DELETE /meetings/{{params.meeting_id}}`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `meeting_id` | string | **yes** | Meeting to cancel. |
| `occurrence_id` | string | no | Cancel only this occurrence of a recurring meeting. |
| `schedule_for_reminder` | boolean | no | Notify the host by email that the meeting was cancelled. |

Also retrieved by: "cancel a meeting for good", "get rid of a call that's no longer happening", "scrap tomorrow's standup entirely", "take a session off the calendar", "call off just one occurrence of a recurring series".

### `zoom.list_meeting_registrants`

List people who have registered for a Zoom meeting that requires registration, with each person's approval status. Use when the user asks who signed up for a meeting or wants to review pending registrations. Filter by status: pending, approved, or denied.

Class `read` (reads only). Scopes `meeting:read:registrant`. Calls `GET /meetings/{{params.meeting_id}}/registrants`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `meeting_id` | string | **yes** | Meeting whose registrants to list. |
| `next_page_token` | string | no | Token from a previous page's next_page_token. |
| `page_size` | integer | no | Page size, default 30. |
| `status` | string, one of pending, approved, denied | no | Filter by registration status. Default pending. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `next_page_token` | string |  |
| `registrants` | array of object |  |
| `registrants[].email` | string |  |
| `registrants[].first_name` | string |  |
| `registrants[].id` | string |  |
| `registrants[].join_url` | string |  |
| `registrants[].last_name` | string |  |
| `registrants[].status` | string |  |
| `total_records` | integer |  |

Also retrieved by: "who signed up for that call", "show me everyone waiting to be let into that session", "who's pending approval for the webinar-style call", "see the sign-up list for that video session", "who's on the sign-up list for that zoom session", "check the registration list for the call".

### `zoom.add_meeting_registrant`

Register someone for a Zoom meeting that requires registration, given their email and name. Use when the user wants to add, sign up, or register an attendee for a meeting ahead of time. Returns that registrant's own personal join_url.

Class `write` (writes, no confirmation needed). Scopes `meeting:write:registrant`. Calls `POST /meetings/{{params.meeting_id}}/registrants`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `email` | string | **yes** | Registrant's email address. |
| `first_name` | string | **yes** | Registrant's first name. |
| `last_name` | string | no | Registrant's last name. |
| `meeting_id` | string | **yes** | Meeting to register the person for. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `id` | string |  |
| `join_url` | string |  |
| `registrant_id` | string |  |
| `start_time` | string |  |
| `topic` | string |  |

Also retrieved by: "sign someone up for that call ahead of time", "put a new attendee on the registration list", "enrol one more attendee before the webinar starts", "register a guest for the client presentation call", "get someone registered for the zoom call", "put a new name on the attendee list".

### `zoom.update_registrant_status`

Approve, deny, or cancel one or more pending Zoom meeting registrants. Use when the user wants to let someone in, reject, or remove a signup from a meeting's registration list. Registrant ids come from list_meeting_registrants.

Class `write` (writes, no confirmation needed). Scopes `meeting:update:registrant_status`. Calls `PUT /meetings/{{params.meeting_id}}/registrants/status`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `action` | string, one of approve, deny, cancel | **yes** | What to do with the listed registrants. |
| `meeting_id` | string | **yes** | Meeting whose registrants to update. |
| `registrants` | array of object | **yes** | Registrants to act on. |
| `registrants[].email` | string | no |  |
| `registrants[].id` | string | **yes** |  |

Also retrieved by: "let that person into the call", "reject that sign-up request", "approve everyone waiting to join", "take someone off the registration list", "deny that pending attendee", "let that pending person into the zoom call".

### `zoom.get_meeting_invitation`

Get the ready-to-send invitation text for a Zoom meeting, including the join link, meeting id, and dial-in numbers. Use when the user wants to copy, share, or forward the invite for a meeting they already scheduled.

Class `read` (reads only). Scopes `meeting:read:invitation`. Calls `GET /meetings/{{params.meeting_id}}/invitation`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `meeting_id` | string | **yes** | Meeting whose invitation text to fetch. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `invitation` | string |  |

Also retrieved by: "grab the invite text for that call", "give me the dial-in numbers for that session", "I need to forward the details for tomorrow's call", "copy the join info for that video session".

### `zoom.list_past_meeting_participants`

List everyone who attended a Zoom meeting that has already ended, with each person's join time, leave time, and duration. Use when the user asks who showed up to a call or wants an attendance report. For the meeting's own summary stats use get_past_meeting_details.

Class `read` (reads only). Scopes `report:read:list_meeting_participants`. Calls `GET /past_meetings/{{params.meeting_id}}/participants`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `meeting_id` | string | **yes** | Ended meeting's id or uuid. |
| `next_page_token` | string | no | Token from a previous page's next_page_token. |
| `page_size` | integer | no | Page size, default 30. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `next_page_token` | string |  |
| `participants` | array of object |  |
| `participants[].duration` | integer |  |
| `participants[].id` | string |  |
| `participants[].join_time` | string |  |
| `participants[].leave_time` | string |  |
| `participants[].name` | string |  |
| `participants[].user_email` | string |  |
| `total_records` | integer |  |

Also retrieved by: "who actually showed up to that call", "give me an attendance report for yesterday's session", "how long did each person stay on that call", "who joined and when did they leave", "who was actually on that zoom call", "pull the attendance list from yesterday's session".

### `zoom.get_past_meeting_details`

Get summary details of a Zoom meeting that has already ended: actual start and end time, total duration, and participant count. Use when the user asks how long a call ran or how many people joined. For the attendee list itself use list_past_meeting_participants.

Class `read` (reads only). Scopes `meeting:read:past_meeting`. Calls `GET /past_meetings/{{params.meeting_id}}`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `meeting_id` | string | **yes** | Ended meeting's id or uuid. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `duration` | integer |  |
| `end_time` | string |  |
| `host_id` | string |  |
| `id` | string |  |
| `participants_count` | integer |  |
| `start_time` | string |  |
| `topic` | string |  |
| `uuid` | string |  |

Also retrieved by: "how long did that call actually run", "how many people joined that session in total", "what time did that call end", "give me the wrap-up stats for that video call".

### `zoom.create_webinar`

Schedule a new Zoom webinar for a user. Use when the user wants to set up, schedule, or host a webinar, broadcast, or large one-to-many presentation rather than a regular meeting. Supports a topic, start time, duration, agenda, and registration settings.

Class `write` (writes, no confirmation needed). Scopes `webinar:write:webinar`. Calls `POST /users/{{params.user_id}}/webinars`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `agenda` | string | no | Longer free-text description of the webinar. |
| `approval_type` | integer, one of 0, 1, 2 | no | Registration approval: 0 automatic approval, 1 manual approval, 2 no registration required. Default 2. |
| `duration` | integer | **yes** | Length in minutes. |
| `password` | string | no | Webinar passcode required to join. |
| `start_time` | string | **yes** | Start time, ISO 8601, e.g. "2026-08-01T15:00:00Z". |
| `timezone` | string | no | IANA time zone for start_time. |
| `topic` | string | **yes** | Webinar title. |
| `user_id` | string | **yes** | Zoom user id or email to host the webinar under, or "me" for the connected account. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `duration` | integer |  |
| `host_id` | string |  |
| `id` | string |  |
| `join_url` | string |  |
| `registration_url` | string |  |
| `start_time` | string |  |
| `start_url` | string |  |
| `timezone` | string |  |
| `topic` | string |  |

Also retrieved by: "set up a broadcast for the product launch", "schedule a big presentation for the whole company", "get a webinar ready for next month", "put together a one-to-many session with registration", "start planning our next big company broadcast", "schedule a zoom webinar for next month", "set up a large broadcast session with sign-ups".

### `zoom.get_webinar`

Get one Zoom webinar's full details by webinar id: topic, time, duration, join_url, and registration settings. Use after list_webinars or when the user already has a webinar id.

Class `read` (reads only). Scopes `webinar:read:webinar`. Calls `GET /webinars/{{params.webinar_id}}`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `webinar_id` | string | **yes** | Zoom webinar id from create_webinar or list_webinars. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `agenda` | string |  |
| `duration` | integer |  |
| `host_id` | string |  |
| `id` | string |  |
| `join_url` | string |  |
| `registration_url` | string |  |
| `settings` | object |  |
| `settings.approval_type` | integer |  |
| `start_time` | string |  |
| `start_url` | string |  |
| `timezone` | string |  |
| `topic` | string |  |

Also retrieved by: "pull up the details on that broadcast session", "what's the registration link for that presentation", "show me everything about that scheduled broadcast", "pull up that zoom webinar's info", "what's the join link for the broadcast", "check the settings on that presentation session".

### `zoom.list_webinars`

List a user's scheduled Zoom webinars. Use when the user asks what webinars they have coming up or wants to find one to edit, cancel, or check registrants for.

Class `read` (reads only). Scopes `webinar:read:webinar`. Calls `GET /users/{{params.user_id}}/webinars`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `next_page_token` | string | no | Token from a previous page's next_page_token. |
| `page_size` | integer | no | Page size, default 30. |
| `user_id` | string | **yes** | Zoom user id or email whose webinars to list, or "me" for the connected account. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `next_page_token` | string |  |
| `total_records` | integer |  |
| `webinars` | array of object |  |
| `webinars[].duration` | integer |  |
| `webinars[].id` | string |  |
| `webinars[].join_url` | string |  |
| `webinars[].start_time` | string |  |
| `webinars[].topic` | string |  |

Also retrieved by: "what broadcasts do I have coming up", "show me every presentation session on the books", "what's scheduled for the town hall series", "what zoom webinars are on the calendar", "show me our upcoming broadcast sessions", "what presentations do we have lined up".

### `zoom.update_webinar`

Change an existing Zoom webinar's topic, time, duration, agenda, or settings by webinar id. Use when the user wants to push back, delay, reschedule, or edit a webinar. Only the fields given are changed. To cancel it entirely use delete_webinar.

Class `write` (writes, no confirmation needed). Scopes `webinar:update:webinar`. Calls `PATCH /webinars/{{params.webinar_id}}`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `agenda` | string | no | New free-text description. |
| `duration` | integer | no | New length in minutes. |
| `occurrence_id` | string | no | Target one occurrence of a recurring webinar instead of the series. |
| `password` | string | no | New webinar passcode. |
| `start_time` | string | no | New start time, ISO 8601. |
| `topic` | string | no | New webinar title. |
| `webinar_id` | string | **yes** | Webinar to update. |

Also retrieved by: "push that broadcast to a later date", "rename that presentation session", "change the agenda for the leadership offsite broadcast", "reschedule the zoom webinar to next week", "postpone the broadcast by a few days", "move the presentation session to a new date".

### `zoom.delete_webinar`

Cancel and remove a scheduled Zoom webinar by webinar id. Use when the user wants to cancel or call off a webinar. Unrecoverable. Pass occurrence_id to cancel one occurrence of a recurring webinar instead of the whole series.

Class `destructive` (held by the mutation gate until the call's own arguments carry `"confirm": true`). Scopes `webinar:delete:webinar`. Calls `DELETE /webinars/{{params.webinar_id}}`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `occurrence_id` | string | no | Cancel only this occurrence of a recurring webinar. |
| `webinar_id` | string | **yes** | Webinar to cancel. |

Also retrieved by: "cancel that broadcast entirely", "call off next week's presentation entirely", "get rid of this week's town hall occurrence", "call off that zoom webinar for good", "cancel the broadcast entirely".

### `zoom.list_webinar_registrants`

List people who have registered for a Zoom webinar, with each person's approval status. Use when the user asks who signed up for a webinar or wants to review pending sign-ups. Filter by status: pending, approved, or denied.

Class `read` (reads only). Scopes `webinar:read:registrant`. Calls `GET /webinars/{{params.webinar_id}}/registrants`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `next_page_token` | string | no | Token from a previous page's next_page_token. |
| `page_size` | integer | no | Page size, default 30. |
| `status` | string, one of pending, approved, denied | no | Filter by registration status. Default pending. |
| `webinar_id` | string | **yes** | Webinar whose registrants to list. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `next_page_token` | string |  |
| `registrants` | array of object |  |
| `registrants[].email` | string |  |
| `registrants[].first_name` | string |  |
| `registrants[].id` | string |  |
| `registrants[].join_url` | string |  |
| `registrants[].last_name` | string |  |
| `registrants[].status` | string |  |
| `total_records` | integer |  |

Also retrieved by: "who signed up for the customer conference broadcast", "show me the sign-up list for that presentation", "who's still waiting on approval for the customer conference", "who's signed up for the zoom webinar", "check the registration list for the broadcast".

### `zoom.add_webinar_registrant`

Register someone for a Zoom webinar, given their email and name. Use when the user wants to add, sign up, or register an attendee for a webinar ahead of time. Returns that registrant's own personal join_url.

Class `write` (writes, no confirmation needed). Scopes `webinar:write:registrant`. Calls `POST /webinars/{{params.webinar_id}}/registrants`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `email` | string | **yes** | Registrant's email address. |
| `first_name` | string | **yes** | Registrant's first name. |
| `last_name` | string | no | Registrant's last name. |
| `webinar_id` | string | **yes** | Webinar to register the person for. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `id` | string |  |
| `join_url` | string |  |
| `registrant_id` | string |  |
| `topic` | string |  |

Also retrieved by: "sign someone up for the broadcast ahead of time", "register a guest for the partner summit session", "put a new attendee on the presentation's sign-up list", "get someone registered for the zoom webinar", "put a new name on the broadcast sign-up list".

### `zoom.update_webinar_registrant_status`

Approve, deny, or cancel one or more pending Zoom webinar registrants. Use when the user wants to let someone into a webinar, reject a sign-up, or remove someone from the registration list. Registrant ids come from list_webinar_registrants.

Class `write` (writes, no confirmation needed). Scopes `webinar:update:registrant_status`. Calls `PUT /webinars/{{params.webinar_id}}/registrants/status`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `action` | string, one of approve, deny, cancel | **yes** | What to do with the listed registrants. |
| `registrants` | array of object | **yes** | Registrants to act on. |
| `registrants[].email` | string | no |  |
| `registrants[].id` | string | **yes** |  |
| `webinar_id` | string | **yes** | Webinar whose registrants to update. |

Also retrieved by: "let that person into the broadcast", "approve everyone waiting on the presentation", "reject that sign-up for the sales kickoff", "let that pending person into the zoom webinar", "approve the sign-up for the broadcast".

### `zoom.list_recordings`

List a user's cloud recordings from Zoom meetings within a date range. Use when the user asks for their recorded calls, wants to find a recording, or asks what's been recorded recently. For one specific meeting's recording use get_meeting_recordings.

Class `read` (reads only). Scopes `cloud_recording:read:list_user_recordings`. Calls `GET /users/{{params.user_id}}/recordings`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `from` | string | no | Start date, "YYYY-MM-DD". Default the last week. |
| `next_page_token` | string | no | Token from a previous page's next_page_token. |
| `page_size` | integer | no | Page size, default 30. |
| `to` | string | no | End date, "YYYY-MM-DD". |
| `user_id` | string | **yes** | Zoom user id or email whose recordings to list, or "me" for the connected account. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `from` | string |  |
| `meetings` | array of object |  |
| `meetings[].duration` | integer |  |
| `meetings[].id` | string |  |
| `meetings[].recording_count` | integer |  |
| `meetings[].recording_files` | array of object |  |
| `meetings[].recording_files[].download_url` | string |  |
| `meetings[].recording_files[].file_size` | integer |  |
| `meetings[].recording_files[].file_type` | string |  |
| `meetings[].recording_files[].id` | string |  |
| `meetings[].recording_files[].play_url` | string |  |
| `meetings[].recording_files[].recording_type` | string |  |
| `meetings[].start_time` | string |  |
| `meetings[].topic` | string |  |
| `meetings[].total_size` | integer |  |
| `meetings[].uuid` | string |  |
| `next_page_token` | string |  |
| `to` | string |  |
| `total_records` | integer |  |

Also retrieved by: "find that recorded call from last week", "what's been recorded recently", "pull up my recorded video calls", "show me the cloud recordings from this month", "where are my recent zoom recordings", "show me what got recorded this month".

### `zoom.get_meeting_recordings`

Get every cloud recording file for one specific Zoom meeting by meeting id: video, audio, and transcript files with their play and download links. Use when the user already knows which meeting's recording they want, rather than browsing all of them.

Class `read` (reads only). Scopes `cloud_recording:read:list_recording_files`. Calls `GET /meetings/{{params.meeting_id}}/recordings`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `meeting_id` | string | **yes** | Meeting whose recording files to fetch. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `duration` | integer |  |
| `id` | string |  |
| `recording_count` | integer |  |
| `recording_files` | array of object |  |
| `recording_files[].download_url` | string |  |
| `recording_files[].file_size` | integer |  |
| `recording_files[].file_type` | string |  |
| `recording_files[].id` | string |  |
| `recording_files[].play_url` | string |  |
| `recording_files[].recording_type` | string |  |
| `start_time` | string |  |
| `topic` | string |  |
| `total_size` | integer |  |
| `uuid` | string |  |

Also retrieved by: "grab the recording for that specific meeting", "I need the video file from yesterday's session", "get me the transcript for that one meeting", "where's the download link for that recording".

### `zoom.delete_meeting_recordings`

Delete a Zoom meeting's cloud recording files. Use when the user wants to remove, trash, or permanently delete a recording. Default action moves the files to trash, recoverable for 30 days; pass action "delete" to permanently erase them instead.

Class `destructive` (held by the mutation gate until the call's own arguments carry `"confirm": true`). Scopes `cloud_recording:delete:recording`. Calls `DELETE /meetings/{{params.meeting_id}}/recordings`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `action` | string, one of trash, delete | no | trash moves to trash (default); delete is permanent. |
| `meeting_id` | string | **yes** | Meeting whose recording files to delete. |

Also retrieved by: "get rid of that recorded call", "trash the recording from that session", "permanently wipe that video recording", "remove that call's recording for good", "erase the zoom recording from that call", "clear out the saved video from that session".

### `zoom.get_user`

Look up one Zoom account user's profile details by user id or email: name, status, role, department, and time zone. Use when the user asks about a specific teammate's Zoom account or plan.

Class `read` (reads only). Scopes `user:read:user`. Calls `GET /users/{{params.user_id}}`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `user_id` | string | **yes** | Zoom user id or email, or "me" for the connected account. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `created_at` | string |  |
| `dept` | string |  |
| `email` | string |  |
| `first_name` | string |  |
| `id` | string |  |
| `last_name` | string |  |
| `role_name` | string |  |
| `status` | string |  |
| `timezone` | string |  |
| `type` | integer |  |

Also retrieved by: "look up a teammate's Zoom account", "what plan is that person on", "check someone's video call settings", "what department is that teammate in", "pull up someone's zoom profile", "what role does that teammate have on zoom".

### `zoom.list_users`

List every user on the Zoom account. Use when the user asks who has a Zoom license, wants a directory of teammates, or needs to find a user's id. Filter by status: active, inactive, or pending.

Class `read` (reads only). Scopes `user:read:list_users`. Calls `GET /users`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `next_page_token` | string | no | Token from a previous page's next_page_token. |
| `page_size` | integer | no | Page size, default 30. |
| `status` | string, one of active, inactive, pending | no | Filter by account status. Default active. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `next_page_token` | string |  |
| `total_records` | integer |  |
| `users` | array of object |  |
| `users[].email` | string |  |
| `users[].first_name` | string |  |
| `users[].id` | string |  |
| `users[].last_name` | string |  |
| `users[].status` | string |  |
| `users[].type` | integer |  |

Also retrieved by: "who has a video call license on our account", "show me the whole team's accounts", "give me a directory of everyone with access", "find a teammate's account id", "show me the zoom directory", "who's on our zoom account".

### `zoom.create_user`

Add a new user to the Zoom account by email, inviting them to activate a license. Use when the user wants to invite, add, or provision someone with Zoom access. The invitee gets an activation email unless action is "autoCreate".

Class `write` (writes, no confirmation needed). Scopes `user:write:user`. Calls `POST /users`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `action` | string, one of create, autoCreate | no | create sends an activation email (default); autoCreate activates the user immediately without one. |
| `email` | string | **yes** | New user's email address. |
| `first_name` | string | no | New user's first name. |
| `last_name` | string | no | New user's last name. |
| `type` | integer, one of 1, 2, 3 | no | License type (1 basic, 2 licensed, 3 on-prem). Default 1. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `email` | string |  |
| `first_name` | string |  |
| `id` | string |  |
| `last_name` | string |  |
| `type` | integer |  |

Also retrieved by: "invite a new teammate to the platform", "add someone to our video call account", "provision access for the new hire", "send an activation invite to a new person", "get a new teammate set up on zoom", "provision a zoom seat for the new hire".

### `zoom.update_user`

Change an existing Zoom user's name, department, time zone, or license type by user id. Use when the user wants to edit or update a teammate's Zoom profile or plan.

Class `write` (writes, no confirmation needed). Scopes `user:update:user`. Calls `PATCH /users/{{params.user_id}}`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `dept` | string | no | New department name. |
| `first_name` | string | no | New first name. |
| `last_name` | string | no | New last name. |
| `timezone` | string | no | New IANA time zone. |
| `type` | integer, one of 1, 2, 3 | no | New license type (1 basic, 2 licensed, 3 on-prem). |
| `user_id` | string | **yes** | User to update. |

Also retrieved by: "change a teammate's department", "update someone's time zone on their profile", "switch that person to a licensed plan", "edit a teammate's profile info".

### `zoom.delete_user`

Remove a user from the Zoom account by user id. Use when the user wants to deactivate, remove, or offboard someone's Zoom or video call access, typically after they left the company. Default disassociates the license, recoverable; pass action "delete" to permanently remove the user instead.

Class `destructive` (held by the mutation gate until the call's own arguments carry `"confirm": true`). Scopes `user:delete:user`. Calls `DELETE /users/{{params.user_id}}`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `action` | string, one of disassociate, delete | no | disassociate unlinks the license, recoverable (default); delete permanently removes the user. |
| `transfer_email` | string | no | Email of another user to transfer this user's meetings and webinars to before removal. |
| `user_id` | string | **yes** | User to remove. |

Also retrieved by: "offboard that teammate's account", "deactivate someone who left the company", "remove that person's access for good", "transfer their meetings before taking their account away", "pull someone's zoom access after they left", "shut off that teammate's zoom seat".

### `zoom.list_groups`

List the user groups configured on the Zoom account, with each group's name and member count. Use when the user asks what teams or groups exist on the account, or before adding someone to one.

Class `read` (reads only). Scopes `group:read:list_groups`. Calls `GET /groups`.

Takes no arguments.

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `groups` | array of object |  |
| `groups[].id` | string |  |
| `groups[].name` | string |  |
| `groups[].total_members` | integer |  |

Also retrieved by: "what teams exist on our account", "show me every group set up here", "how many people are on the sales team group", "what teams are set up on our zoom account", "show me the group list".

### `zoom.add_group_members`

Add one or more existing Zoom users to a group by email. Use when the user wants to put someone on a team or group inside the Zoom account. Group ids come from list_groups.

Class `write` (writes, no confirmation needed). Scopes `group:write:group_member`. Calls `POST /groups/{{params.group_id}}/members`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `group_id` | string | **yes** | Group to add members to. |
| `members` | array of object | **yes** | Users to add, by email. |
| `members[].email` | string | **yes** |  |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `added_at` | string |  |
| `ids` | string |  |

Also retrieved by: "put someone on the marketing team group", "add a new hire to their department's group", "assign that teammate to the support group", "put a teammate on the zoom group", "add someone to that team's member list".

### `zoom.send_chat_message`

Send a Zoom Team Chat message to a person or a channel. Use when the user wants to message, ping, or DM someone in Zoom chat, or post to a channel. Give exactly one of to_contact (an email) or to_channel (a channel id).

Class `write` (writes, no confirmation needed). Scopes `chat_message:write:chat_message`. Calls `POST /chat/users/{{params.user_id}}/messages`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `message` | string | **yes** | Message text to send. |
| `to_channel` | string | no | Channel id from list_chat_channels, for a channel post. |
| `to_contact` | string | no | Recipient's email, for a direct message. |
| `user_id` | string | **yes** | Zoom user id or email sending the message, or "me" for the connected account. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `date_time` | string |  |
| `id` | string |  |
| `message` | string |  |

Also retrieved by: "ping someone in Zoom chat", "post a note in the design channel", "DM a teammate through Zoom", "drop a quick message in the project channel".

### `zoom.list_chat_channels`

List the Zoom Team Chat channels a user belongs to. Use when the user asks what chat channels they're in or wants to find a channel id before posting a message to it.

Class `read` (reads only). Scopes `chat_channel:read:list_channels`. Calls `GET /chat/users/{{params.user_id}}/channels`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `next_page_token` | string | no | Token from a previous page's next_page_token. |
| `page_size` | integer | no | Page size, default 30. |
| `user_id` | string | **yes** | Zoom user id or email whose channels to list, or "me" for the connected account. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `channels` | array of object |  |
| `channels[].id` | string |  |
| `channels[].name` | string |  |
| `channels[].type` | string |  |
| `next_page_token` | string |  |

Also retrieved by: "what chat channels am I in", "show me every channel I belong to", "find the channel id before I post something", "what rooms am I part of on zoom chat", "show me the channel list before I post", "where can I post a message so my team sees it", "what channels can I send a note to on zoom".
