Zoom Oauth
OpenAIOfficialCreated by ZoomDistributed by OpenAI
- Skill
- Tool integration
- Automation and integrations
- MIT
- No issues found
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
Download the skill as a ZIP:
https://autogineer.com/agent-skills/openai/zoom-oauth/downloadUnzip 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
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.
Confirm the target API, SDK, or app surface, because scopes and token audiences differ by surface.
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.
Store refresh tokens as single-use values: persist the replacement refresh token returned by each refresh response before reusing the old one.
Validate requests against redirect URI, account ID, scopes, app publication state, and token expiration before changing application code.
For local development, keep access tokens out of logs and treat refresh tokens as single-use when rotating credentials.
References
Full preserved guide: references/full-guide.md
OAuth flows: concepts/oauth-flows.md
Token lifecycle: concepts/token-lifecycle.md
Scope architecture: concepts/scopes-architecture.md
Granular scopes: references/granular-scopes.md
OAuth errors: references/oauth-errors.md
Redirect URI issues: troubleshooting/redirect-uri-issues.md
Files
- ATTRIBUTION.mdAdded by AutoGineer862 B
- LICENSELicence file added by AutoGineer1.1 KiB
- RUNBOOK.md3.3 KiB
- SKILL.md1.8 KiB
- agents/openai.yaml131 B
- concepts/oauth-flows.md22.2 KiB
- concepts/pkce.md13.8 KiB
- concepts/scopes-architecture.md6.7 KiB
- concepts/state-parameter.md8.1 KiB
- concepts/token-lifecycle.md15.1 KiB
- examples/device-flow.md371 B
- examples/pkce-implementation.md379 B
- examples/s2s-oauth-basic.md375 B
- examples/s2s-oauth-redis.md6.6 KiB
- examples/token-refresh.md373 B
- examples/user-oauth-basic.md376 B
- examples/user-oauth-mysql.md376 B
- references/classic-scopes.md2.5 KiB
- references/environment-variables.md863 B
- references/full-guide.md31.7 KiB
- references/granular-scopes.md1.8 KiB
- references/oauth-errors.md4.8 KiB
- troubleshooting/common-errors.md458 B
- troubleshooting/redirect-uri-issues.md229 B
- troubleshooting/scope-issues.md222 B
- troubleshooting/token-issues.md222 B
concepts/scopes-architecture.md
Scopes Architecture
Zoom OAuth uses scopes to limit API access. Understanding Classic vs Granular scopes is critical.
Scope Types
| Type | Format | Example | Status |
|---|---|---|---|
| Classic | resource:level | meeting:write:admin | Active |
| Granular | service:action:data_claim:access | meeting:write:meeting:admin | Active (newer) |
Classic Scopes
Format
{resource}:{action}:{level}Examples:
meeting:read- Read user's own meetingsmeeting:write:admin- Create/update meetings for all account usersrecording:read:master- Read recordings across all sub-accounts
Scope Levels
| Level | Access | Who Can Authorize | Example |
|---|---|---|---|
| (none) | Own data only | Any user | meeting:read |
:admin | Account-wide | Admin role required | meeting:write:admin |
:master | Multi-account | Account owner only | user: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 accessGranular Scopes
Format
{service}:{action}:{data_claim}:{access_level}Examples:
meeting:read:meeting:user- Read user's own meetingsmeeting:write:invite_links:admin- Create invite links for accountrecording:delete:recording_file:admin- Delete recording files account-wide
Components
service: API category (meeting, user, recording, etc.)
action: Operation (read, write, delete, etc.)
data_claim: Specific data type (meeting, participant, invite_links, etc.)
access_level: Scope of access (user, admin, account, etc.)
Access Levels (Granular)
| Level | Access | Example |
|---|---|---|
user | Own data | meeting:read:meeting:user |
admin | Account-wide | meeting:write:meeting:admin |
account | Account settings | account:read:settings:account |
Classic vs Granular Comparison
Meetings Scope Example
| Classic | Granular Equivalent |
|---|---|
meeting:read | meeting:read:meeting:user + meeting:read:list_meetings:user |
meeting:write:admin | meeting:write:meeting:admin + meeting:write:settings:admin + more |
Why Granular Scopes Exist
Classic scopes are broad:
meeting:write:admingrants ALL meeting write permissions account-wideIncludes create, update, delete, settings, etc.
Granular scopes are specific:
meeting:write:meeting:admin- Only create/update meetingsmeeting:delete:meeting:admin- Only delete meetingsmeeting: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:adminRequesting Scopes
During App Creation (S2S OAuth, Chatbot)
Scopes are configured in Zoom Marketplace:
Go to your app in https://marketplace.zoom.us
Click "Scopes" tab
Select required scopes (Classic or Granular)
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 scopesScope Consent Screen
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 scopeSolution:
Add required scope in Zoom Marketplace (S2S/Chatbot)
OR request scope in authorization URL (User/Device)
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/tokenBest 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 meetings3. 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
Classic Scopes → ../references/classic-scopes.md
Granular Scopes → ../references/granular-scopes.md
Scope Errors → ../troubleshooting/scope-issues.md
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