Zoom node reference - all 123 operations, the credential it needs, and a worked example.
Zoom API (Recruiting & Meetings). 123 operations: meetings, registrants, polls, surveys, live streaming, past meetings and templates; webinars, panelists and past webinars; cloud recordings, transcripts and recording analytics; users, settings, presence and company contacts; Team Chat messages and channels; meeting and webinar reports.
Credential: Zoom (Server-to-Server OAuth: accountId + clientId + clientSecret) - see Credentials.
Each operation below lists the scope it needs. Scopes are ticked on the Scopes tab of the Server-to-Server OAuth app in the Zoom App Marketplace. Pipory's Zoom credential is the account_credentials grant, so the token is account-wide and there is no per-user consent screen — a scope added in the Marketplace is simply picked up by the next token exchange. Zoom is midway through a scope migration and BOTH systems are live, so every value below names the GRANULAR scope first (meeting:write:meeting — what an app created today is offered, one scope per endpoint) and the CLASSIC one in parentheses (meeting:write — coarse, one per resource family, still accepted on existing apps). Two operations are granular-ONLY, and that is not an omission: the recording analytics summary and details endpoints shipped after the migration began, so an app still running on classic scopes cannot call them at all. The :admin suffix is the account-level variant, which is what an app must hold to act on a user OTHER than the one that installed it — 110 of the 123 operations have a user-level granular scope and the table names that one, but a Server-to-Server app is account-wide by construction, so the :admin form of the same scope is generally the one to tick; it is spelled out below only where Zoom offers no non-admin variant at all, which is List users and all twelve Reports endpoints. The trap that wastes the most time is not the scope string but the ROLE: a scope you cannot find in the Marketplace editor is usually one your Zoom role may not grant, because an account admin has to enable the Server-to-Server OAuth app role under User Management → Roles → Role Settings → Advanced features AND assign your role the matching permission before that checkbox exists to tick. And no scope fixes a PLAN gate — webinars need a Pro-or-higher plan with the Webinar add-on, cloud recording needs Pro-or-higher with Cloud Recording enabled on the host, every Reports endpoint needs Pro-or-higher, and the AI Companion meeting summary additionally needs the host's own Meeting Summary with AI Companion setting enabled and never returns for an end-to-end-encrypted meeting. If a run fails with a permission error, the node names the missing scope in the error - grant it and re-run; you do not need to rebuild the workflow.
| Operation | What it does | Scope |
|---|
listMeetings | List meetings | meeting:read:list_meetings (classic: meeting:read) |
listUpcomingMeetings | List upcoming meetings | meeting:read:list_upcoming_meetings (classic: meeting:read) |
createMeeting | Create meeting | meeting:write:meeting (classic: meeting:write) |
getMeeting | Get meeting | meeting:read:meeting (classic: meeting:read) |
updateMeeting | Update meeting | meeting:update:meeting (classic: meeting:write) |
deleteMeeting | Delete meeting | meeting:delete:meeting (classic: meeting:write) |
updateMeetingStatus | End or recover meeting | meeting:update:status (classic: meeting:write) |
getMeetingInvitation | Get meeting invitation text | meeting:read:invitation (classic: meeting:read) |
createMeetingInviteLinks | Create meeting invite links | meeting:write:invite_links (classic: meeting:write) |
getMeetingSummary | Get AI Companion meeting summary | meeting:read:summary (classic: meeting_summary:read) |
| Operation | What it does | Scope |
|---|
listMeetingRegistrants | List meeting registrants | meeting:read:list_registrants (classic: meeting:read) |
addMeetingRegistrant | Add meeting registrant | meeting:write:registrant (classic: meeting:write) |
getMeetingRegistrant | Get meeting registrant | meeting:read:registrant (classic: meeting:read) |
deleteMeetingRegistrant | Delete meeting registrant | meeting:delete:registrant (classic: meeting:write) |
updateMeetingRegistrantStatus | Approve / deny meeting registrants | meeting:update:registrant_status (classic: meeting:write) |
batchAddMeetingRegistrants | Add up to 30 meeting registrants | meeting:write:batch_registrants (classic: meeting:write) |
listMeetingRegistrationQuestions | List meeting registration questions | meeting:read:list_registration_questions (classic: meeting:read) |
updateMeetingRegistrationQuestions | Update meeting registration questions | meeting:update:registration_question (classic: meeting:write) |
| Operation | What it does | Scope |
|---|
listMeetingPolls | List meeting polls | meeting:read:list_polls (classic: meeting:read) |
createMeetingPoll | Create meeting poll | meeting:write:poll (classic: meeting:write) |
getMeetingPoll | Get meeting poll | meeting:read:poll (classic: meeting:read) |
updateMeetingPoll | Update meeting poll | meeting:update:poll (classic: meeting:write) |
deleteMeetingPoll | Delete meeting poll | meeting:delete:poll (classic: meeting:write) |
getMeetingSurvey | Get meeting survey | meeting:read:survey (classic: meeting:read) |
updateMeetingSurvey | Update meeting survey | meeting:update:survey (classic: meeting:write) |
deleteMeetingSurvey | Delete meeting survey | meeting:delete:survey (classic: meeting:write) |
| Operation | What it does | Scope |
|---|
getMeetingLivestream | Get meeting live stream settings | meeting:read:livestream (classic: meeting:read) |
updateMeetingLivestream | Update meeting live stream settings | meeting:update:livestream (classic: meeting:write) |
updateMeetingLivestreamStatus | Start / stop meeting live stream | meeting:update:livestream_status (classic: meeting:write) |
| Operation | What it does | Scope |
|---|
getPastMeeting | Get past meeting details | meeting:read:past_meeting (classic: meeting:read) |
listPastMeetingInstances | List past meeting instances | meeting:read:list_past_instances (classic: meeting:read) |
listPastMeetingParticipants | List past meeting participants | meeting:read:list_past_participants (classic: meeting:read) |
listPastMeetingPolls | List past meeting poll results | meeting:read:list_poll_results (classic: meeting:read) |
listPastMeetingQa | List past meeting Q&A | meeting:read:past_qa (classic: meeting:read) |
| Operation | What it does | Scope |
|---|
listMeetingTemplates | List meeting templates | meeting:read:list_templates (classic: meeting:read) |
createMeetingTemplate | Create meeting template | meeting:write:template (classic: meeting:write) |
| Operation | What it does | Scope |
|---|
listWebinars | List webinars | webinar:read:list_webinars (classic: webinar:read) |
createWebinar | Create webinar | webinar:write:webinar (classic: webinar:write) |
getWebinar | Get webinar | webinar:read:webinar (classic: webinar:read) |
updateWebinar | Update webinar | webinar:update:webinar (classic: webinar:write) |
deleteWebinar | Delete webinar | webinar:delete:webinar (classic: webinar:write) |
updateWebinarStatus | End webinar | webinar:update:status (classic: webinar:write) |
createWebinarInviteLinks | Create webinar invite links | webinar:write:invite_links (classic: webinar:write) |
getWebinarTrackingSources | Get webinar tracking sources | webinar:read:list_tracking_sources (classic: webinar:read) |
listWebinarTemplates | List webinar templates | webinar:read:list_templates (classic: webinar:read) |
createWebinarTemplate | Create webinar template | webinar:write:template (classic: webinar:write) |
| Operation | What it does | Scope |
|---|
listWebinarRegistrants | List webinar registrants | webinar:read:list_registrants (classic: webinar:read) |
addWebinarRegistrant | Add webinar registrant | webinar:write:registrant (classic: webinar:write) |
getWebinarRegistrant | Get webinar registrant | webinar:read:registrant (classic: webinar:read) |
deleteWebinarRegistrant | Delete webinar registrant | webinar:delete:registrant (classic: webinar:write) |
updateWebinarRegistrantStatus | Approve / deny webinar registrants | webinar:update:registrant_status (classic: webinar:write) |
batchAddWebinarRegistrants | Add up to 30 webinar registrants | webinar:write:batch_registrants (classic: webinar:write) |
listWebinarRegistrationQuestions | List webinar registration questions | webinar:read:list_registration_questions (classic: webinar:read) |
updateWebinarRegistrationQuestions | Update webinar registration questions | webinar:update:registration_question (classic: webinar:write) |
| Operation | What it does | Scope |
|---|
listWebinarPanelists | List webinar panelists | webinar:read:list_panelists (classic: webinar:read) |
addWebinarPanelists | Add webinar panelists | webinar:write:panelist (classic: webinar:write) |
removeWebinarPanelist | Remove a webinar panelist | webinar:delete:panelist (classic: webinar:write) |
removeAllWebinarPanelists | Remove all webinar panelists | webinar:delete:panelist (classic: webinar:write) |
| Operation | What it does | Scope |
|---|
listWebinarPolls | List webinar polls | webinar:read:list_polls (classic: webinar:read) |
createWebinarPoll | Create webinar poll | webinar:write:poll (classic: webinar:write) |
getWebinarPoll | Get webinar poll | webinar:read:poll (classic: webinar:read) |
updateWebinarPoll | Update webinar poll | webinar:update:poll (classic: webinar:write) |
deleteWebinarPoll | Delete webinar poll | webinar:delete:poll (classic: webinar:write) |
getWebinarSurvey | Get webinar survey | webinar:read:survey (classic: webinar:read) |
updateWebinarSurvey | Update webinar survey | webinar:update:survey (classic: webinar:write) |
deleteWebinarSurvey | Delete webinar survey | webinar:delete:survey (classic: webinar:write) |
| Operation | What it does | Scope |
|---|
getWebinarLivestream | Get webinar live stream settings | webinar:read:livestream (classic: webinar:read) |
updateWebinarLivestream | Update webinar live stream settings | webinar:update:livestream (classic: webinar:write) |
updateWebinarLivestreamStatus | Start / stop webinar live stream | webinar:update:livestream_status (classic: webinar:write) |
| Operation | What it does | Scope |
|---|
listPastWebinarInstances | List past webinar instances | webinar:read:list_past_instances (classic: webinar:read) |
listPastWebinarParticipants | List past webinar participants | webinar:read:list_past_participants (classic: webinar:read) |
listWebinarAbsentees | List webinar absentees | webinar:read:list_absentees (classic: webinar:read) |
listPastWebinarPolls | List past webinar poll results | webinar:read:list_past_polls (classic: webinar:read) |
listPastWebinarQa | List past webinar Q&A | webinar:read:past_qa (classic: webinar:read) |
| Operation | What it does | Scope |
|---|
listRecordings | List recordings | cloud_recording:read:list_user_recordings (classic: recording:read) |
getMeetingRecordings | Get a meeting's recordings | cloud_recording:read:list_recording_files (classic: recording:read) |
deleteMeetingRecordings | Delete a meeting's recordings | cloud_recording:delete:meeting_recording (classic: recording:write) |
deleteRecordingFile | Delete one recording file | cloud_recording:delete:recording_file (classic: recording:write) |
recoverMeetingRecordings | Recover a meeting's recordings | cloud_recording:update:recover_meeting_recordings (classic: recording:write) |
recoverRecordingFile | Recover one recording file | cloud_recording:update:recover_single_recording (classic: recording:write) |
getRecordingSettings | Get recording settings | cloud_recording:read:recording_settings (classic: recording:read) |
updateRecordingSettings | Update recording settings | cloud_recording:update:recording_settings (classic: recording:write) |
listRecordingRegistrants | List recording registrants | cloud_recording:read:list_recording_registrants (classic: recording:read) |
addRecordingRegistrant | Add recording registrant | cloud_recording:write:recording_registrant (classic: recording:write) |
updateRecordingRegistrantStatus | Approve / deny recording viewers | cloud_recording:update:registrant_status (classic: recording:write) |
getMeetingTranscript | Get meeting transcript | cloud_recording:read:meeting_transcript (classic: recording:read) |
getRecordingAnalyticsSummary | Get recording analytics summary | cloud_recording:read:recording_analytics_summary |
getRecordingAnalyticsDetails | Get recording analytics details | cloud_recording:read:recording_analytics_details |
| Operation | What it does | Scope |
|---|
listUsers | List users | user:read:list_users:admin (classic: user:read:admin) |
getUser | Get user | user:read:user (classic: user:read) |
updateUser | Update user | user:update:user (classic: user:write) |
updateUserStatus | Activate / deactivate user | user:update:status (classic: user:write) |
getUserSettings | Get user settings | user:read:settings (classic: user:read) |
updateUserSettings | Update user settings | user:update:settings (classic: user:write) |
checkUserEmail | Check whether an email is registered | user:read:email (classic: user:read) |
getUserPresenceStatus | Get user presence status | user:read:presence_status (classic: user:read) |
updateUserPresenceStatus | Update user presence status | user:update:presence_status (classic: user:write) |
searchCompanyContacts | Search company contacts | contact:read:list_contacts (classic: contact:read) |
| Operation | What it does | Scope |
|---|
sendChatMessage | Send chat message | team_chat:write:user_message (classic: chat_message:write) |
listChatMessages | List chat messages | team_chat:read:list_user_messages (classic: chat_message:read) |
getChatMessage | Get chat message | team_chat:read:user_message (classic: chat_message:read) |
updateChatMessage | Update chat message | team_chat:update:user_message (classic: chat_message:write) |
deleteChatMessage | Delete chat message | team_chat:delete:user_message (classic: chat_message:write) |
reactToChatMessage | React to chat message | team_chat:update:message_emoji (classic: chat_message:write) |
listChatChannels | List chat channels | team_chat:read:list_user_channels (classic: chat_channel:read) |
createChatChannel | Create chat channel | team_chat:write:user_channel (classic: chat_channel:write) |
getChatChannel | Get chat channel | team_chat:read:user_channel (classic: chat_channel:read) |
updateChatChannel | Update chat channel | team_chat:update:user_channel (classic: chat_channel:write) |
deleteChatChannel | Delete chat channel | team_chat:delete:user_channel (classic: chat_channel:write) |
listChatChannelMembers | List chat channel members | team_chat:read:list_members (classic: chat_channel:read) |
inviteChatChannelMembers | Invite chat channel members | team_chat:write:members (classic: chat_channel:write) |
| Operation | What it does | Scope |
|---|
getMeetingReport | Meeting detail report | report:read:meeting:admin (classic: report:read:admin) |
getMeetingParticipantsReport | Meeting participants report | report:read:list_meeting_participants:admin (classic: report:read:admin) |
getMeetingPollsReport | Meeting poll report | report:read:list_meeting_polls:admin (classic: report:read:admin) |
getMeetingQaReport | Meeting Q&A report | report:read:meeting_qna:admin (classic: report:read:admin) |
getMeetingSurveyReport | Meeting survey report | report:read:meeting_survey:admin (classic: report:read:admin) |
getWebinarReport | Webinar detail report | report:read:webinar:admin (classic: report:read:admin) |
getWebinarParticipantsReport | Webinar participants report | report:read:list_webinar_participants:admin (classic: report:read:admin) |
getWebinarPollsReport | Webinar poll report | report:read:list_webinar_polls:admin (classic: report:read:admin) |
getWebinarQaReport | Webinar Q&A report | report:read:webinar_qna:admin (classic: report:read:admin) |
getWebinarSurveyReport | Webinar survey report | report:read:webinar_survey:admin (classic: report:read:admin) |
getUserMeetingsReport | Meetings hosted by a user (report) | report:read:user:admin (classic: report:read:admin) |
getUpcomingEventsReport | Upcoming events report | report:read:upcoming_meetings_webinars:admin (classic: report:read:admin) |
Create a meeting and hand out the join link
The node's original operation and still the most useful one. The value a workflow wants is joinUrl — the link to put in a calendar invite or a Slack message — and it is available immediately, unlike Google Meet links which Google provisions asynchronously.
Set Operation to createMeeting, then fill in:
| Field | Value | Notes |
|---|
hostUserId | me | me is the Server-to-Server app's own account; or a specific Zoom user id |
topic | Onboarding call with {{ myTrigger.company }} | |
startTime | {{ myTrigger.startsAt }} | ISO 8601 |
duration | 30 | Minutes |
timezone | Europe/London | |
Sets {{meeting.joinUrl}} (the link to send), {{meeting.meetingId}}, {{meeting.startUrl}} (host-only — treat it as a secret) and {{meeting.topic}}.