Generated banner for Zoom Oauth
Generated logo for Zoom Oauth

Zoom Oauth

OpenAIOfficialCreated by ZoomDistributed by OpenAI

  • Skill
  • Tool integration
  • Automation and integrations
  • MIT
  • No issues found

From the author

Use when implementing OAuth.
— the description by Zoom

AutoGineer summary

Written by AutoGineer from the skill’s own files, not by the author

This skill provides a structured approach to implementing Zoom OAuth, covering various app types including user-level, account-level, and server-to-server OAuth. It assists developers in selecting the correct grant flow, managing token lifecycles, and diagnosing common authentication errors. The skill emphasizes secure practices, such as handling refresh tokens as single-use values and maintaining proper scope architecture.

What it does

  • Guides selection of appropriate OAuth grant flows like PKCE or authorization code.
  • Provides workflows for identifying app types and required scopes.
  • Offers best practices for secure token management and refresh token rotation.
  • Assists in troubleshooting common OAuth errors and redirect URI issues.
  • Clarifies the distinction between classic and granular scope usage.
  • Defines standard environment variables required for Zoom API integration.

When to use it

  • When setting up authentication for a new Zoom Marketplace application.
  • When debugging failed authorization requests or token refresh issues.
  • When determining the correct OAuth scopes for specific API endpoints.
  • When transitioning from classic scopes to granular scopes.
  • When implementing server-to-server OAuth for automated account-level tasks.

Advantages

  • Reduces integration errors by providing clear flow selection criteria.
  • Promotes security by enforcing single-use refresh token patterns.
  • Simplifies scope management through structured lookup workflows.
  • Centralizes configuration requirements and environment variable standards.

Usage examples

“How do I implement authorization code flow with PKCE for my public Zoom app?”
The agent will outline the steps to generate a code challenge, initiate the authorization request, and exchange the code for an access token while ensuring PKCE security.
“I am getting an invalid scope error when calling the meeting API. How do I fix this?”
The agent will guide you to verify your app's configured scopes against the endpoint requirements and check if you are using deprecated classic scopes instead of granular ones.
“What is the correct way to handle Zoom refresh tokens?”
The agent will explain the requirement to persist the new refresh token returned by every refresh response and discard the old one to maintain security.

Install

  1. Download the skill as a ZIP:

    https://autogineer.com/agent-skills/openai/zoom-oauth/download
  2. Unzip it into the cross-client skills folder of your project:

    mkdir -p .agents/skills && unzip zoom-oauth.zip -d .agents/skills

Documentation by Zoom

Zoom OAuth

Use this skill for concrete Zoom authentication implementation and troubleshooting. Prefer setup-zoom-oauth for the first-pass setup plan, then return here for exact flows, scope behavior, refresh handling, and error diagnosis.

Workflow

  1. Identify the app type and actor: user-level OAuth, account-level OAuth, server-to-server OAuth where officially supported, SDK JWT, or Build-platform credentials.

  2. Confirm the target API, SDK, or app surface, because scopes and token audiences differ by surface.

  3. Choose the grant flow: authorization code with PKCE for public clients, authorization code for confidential web apps, device authorization where appropriate, or account credentials for supported account-level automation.

  4. Store refresh tokens as single-use values: persist the replacement refresh token returned by each refresh response before reusing the old one.

  5. Validate requests against redirect URI, account ID, scopes, app publication state, and token expiration before changing application code.

  6. For local development, keep access tokens out of logs and treat refresh tokens as single-use when rotating credentials.

References

Files

concepts/scopes-architecture.md

Scopes Architecture

Zoom OAuth uses scopes to limit API access. Understanding Classic vs Granular scopes is critical.

Scope Types

TypeFormatExampleStatus
Classicresource:levelmeeting:write:adminActive
Granularservice:action:data_claim:accessmeeting:write:meeting:adminActive (newer)

Classic Scopes

Format
{resource}:{action}:{level}

Examples:

  • meeting:read - Read user's own meetings

  • meeting:write:admin - Create/update meetings for all account users

  • recording:read:master - Read recordings across all sub-accounts

Scope Levels
LevelAccessWho Can AuthorizeExample
(none)Own data onlyAny usermeeting:read
:adminAccount-wideAdmin role requiredmeeting:write:admin
:masterMulti-accountAccount owner onlyuser:master
Common Classic Scopes
meeting:read               # View own meetings
meeting:write              # Create/edit own meetings
meeting:write:admin        # Manage all account meetings

user:read                  # View own profile
user:write:admin           # Manage account users

recording:read             # View own recordings
recording:write:admin      # Manage account recordings

webinar:read               # View own webinars
webinar:write:admin        # Manage account webinars

imchat:bot                 # Team Chat bot access

Granular Scopes

Format
{service}:{action}:{data_claim}:{access_level}

Examples:

  • meeting:read:meeting:user - Read user's own meetings

  • meeting:write:invite_links:admin - Create invite links for account

  • recording:delete:recording_file:admin - Delete recording files account-wide

Components
  1. service: API category (meeting, user, recording, etc.)

  2. action: Operation (read, write, delete, etc.)

  3. data_claim: Specific data type (meeting, participant, invite_links, etc.)

  4. access_level: Scope of access (user, admin, account, etc.)

Access Levels (Granular)
LevelAccessExample
userOwn datameeting:read:meeting:user
adminAccount-widemeeting:write:meeting:admin
accountAccount settingsaccount:read:settings:account

Classic vs Granular Comparison

Meetings Scope Example
ClassicGranular Equivalent
meeting:readmeeting:read:meeting:user + meeting:read:list_meetings:user
meeting:write:adminmeeting:write:meeting:admin + meeting:write:settings:admin + more
Why Granular Scopes Exist

Classic scopes are broad:

  • meeting:write:admin grants ALL meeting write permissions account-wide

  • Includes create, update, delete, settings, etc.

Granular scopes are specific:

  • meeting:write:meeting:admin - Only create/update meetings

  • meeting:delete:meeting:admin - Only delete meetings

  • meeting:write:settings:admin - Only update settings

Principle of Least Privilege: Request only the granular scopes you need.

Choosing Between Classic and Granular

Use Classic When:
  • You need broad access (e.g., full meeting management)

  • Simpler scope management preferred

  • Legacy app migration

Use Granular When:
  • You need specific permissions only

  • Implementing principle of least privilege

  • Building security-sensitive apps

Can You Mix?

✅ Yes, you can request both Classic and Granular scopes in the same app.

scope=meeting:read user:write:admin meeting:write:invite_links:admin

Requesting Scopes

During App Creation (S2S OAuth, Chatbot)

Scopes are configured in Zoom Marketplace:

  1. Go to your app in https://marketplace.zoom.us

  2. Click "Scopes" tab

  3. Select required scopes (Classic or Granular)

  4. Click "Continue"

Token will include all configured scopes.

During Authorization (User OAuth, Device Flow)

Scopes are requested in authorization URL:

const authURL = new URL('https://zoom.us/oauth/authorize');
authURL.searchParams.set('response_type', 'code');
authURL.searchParams.set('client_id', CLIENT_ID);
authURL.searchParams.set('redirect_uri', REDIRECT_URI);

// Request specific scopes (space-separated)
authURL.searchParams.set('scope', 'meeting:read user:read recording:read');

// User sees consent screen listing these scopes

When user authorizes your app, they see:

[Your App Name] wants to:

✓ View your meetings (meeting:read)
✓ View your profile (user:read)
✓ View your recordings (recording:read)

[Deny] [Authorize]

Scope Errors

Error 4711: Scope Mismatch

Cause: Token's scopes don't include required scope for API endpoint.

Example:

// Token has: meeting:read
// API requires: meeting:write
await axios.post('https://api.zoom.us/v2/users/me/meetings', {...}, {
  headers: { Authorization: `Bearer ${token}` }
});
// Error 4711: Insufficient scope

Solution:

  1. Add required scope in Zoom Marketplace (S2S/Chatbot)

  2. OR request scope in authorization URL (User/Device)

  3. Re-authorize user to grant new scopes

Checking Token Scopes

Decode Access Token Scopes
// S2S OAuth: scopes returned in token response
const { access_token, scope } = tokenResponse.data;
console.log('Scopes:', scope); // "meeting:read user:read recording:write"

// User OAuth: scopes returned during token exchange
const { access_token, scope } = tokenResponse.data;
console.log('Granted scopes:', scope.split(' ')); // ['meeting:read', 'user:read', ...]
API to Get Token Scopes
curl -H "Authorization: Bearer {access_token}" \
  https://zoom.us/oauth/token

Best Practices

1. Request Minimum Scopes Needed
// ❌ AVOID: Requesting broad admin access when not needed
scope: "meeting:write:admin user:write:admin recording:write:admin"

// ✅ PREFER: Request only what you need
scope: "meeting:read user:read"
2. Use Granular Scopes for Specific Operations
// ❌ Classic (broad)
scope: "meeting:write:admin" // Includes create, update, delete, settings, etc.

// ✅ Granular (specific)
scope: "meeting:write:meeting:admin" // Only create/update meetings
3. Document Required Scopes
/**
 * Create a meeting for a user
 * Required scope: meeting:write:admin (Classic) or meeting:write:meeting:admin (Granular)
 */
async function createMeeting(userId, meetingData) {
  // ...
}

Reference Documentation

Requirements and compatibility

Written for: OpenAI Codex

Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta

“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.

Security

No issues found by our static scan· No issues found

A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.

Attribution and licence

Created by
Zoom
Publisher
OpenAI (Official)
Distributed by
OpenAI
Source
openai/plugins · plugins/zoom/skills/oauth · commit d420d13
Licence
MIT License (redistribution allowed)
  • LICENSE (added by AutoGineer from plugins/zoom/LICENSE)
  • ATTRIBUTION.md (written by AutoGineer)
Synced

AutoGineer is not affiliated with or endorsed by Zoom or OpenAI.

Download ZIP

The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download zoom-oauth.zip