Build Zoom Rest API App
AnthropicOfficialCreated by ZoomDistributed by Anthropic
- Skill
- Tool integration
- Automation and integrations
- MIT
- Medium risk
AutoGineer summary
Written by AutoGineer from the skill’s own files, not by the author
This skill serves as a central hub for developers building server-side applications that interact with the Zoom platform. It provides structured guidance on API architecture, authentication flows, rate limiting, and endpoint discovery. By consolidating best practices, troubleshooting runbooks, and domain-specific references, it helps developers navigate the complexities of the Zoom REST API, including meeting management, user provisioning, and webhook integration.
What it does
- Provides endpoint-level documentation for over 600 Zoom REST API operations.
- Guides developers through Server-to-Server OAuth and other authentication flows.
- Offers strategies for managing rate limits and per-user daily operation quotas.
- Includes troubleshooting runbooks for common errors like 401 Unauthorized and 429 Too Many Requests.
- Details architectural requirements such as regional base URLs and UUID double-encoding.
- Provides examples for event-driven integrations using webhooks and CRC validation.
When to use it
- When you need to select the correct API endpoint for a specific Zoom resource.
- When implementing server-side automation for meetings, users, or recordings.
- When debugging API errors or authentication failures in your integration.
- When you need to understand rate-limiting strategies to ensure application stability.
- When setting up a webhook server to receive real-time Zoom events.
Advantages
- Centralizes documentation across 39 different API domains.
- Provides clear, actionable guidance on deprecated vs. current authentication methods.
- Includes specific runbooks for common production issues like rate-limit exhaustion.
- Offers reliable patterns for complex tasks like meeting lifecycle management.
- Maintains alignment with official Zoom API Hub endpoint inventories.
Usage examples
- “How do I create a meeting using the Zoom REST API?”
- The agent provides the correct POST endpoint, required headers, and a JSON payload example, while noting the need for S2S OAuth and specific host user ID formatting.
- “I am getting a 429 error from the Zoom API. What should I do?”
- The agent explains the shared account-level rate limits, suggests implementing backoff strategies, and points to the rate-limiting strategy documentation.
- “How do I handle Zoom meeting UUIDs that contain slashes?”
- The agent explains the requirement for double URL-encoding and provides a code snippet demonstrating how to properly encode the UUID.
- “Can I use the 'me' keyword in my S2S OAuth app?”
- The agent clarifies that 'me' is reserved for User OAuth apps and must not be used in S2S OAuth, providing the correct alternative of using a specific user ID.
Install
Download the skill as a ZIP:
https://mp-staging.autogineer.com/agent-skills/anthropics/build-zoom-rest-api-app/downloadUnzip it into the cross-client skills folder of your project:
mkdir -p .agents/skills && unzip build-zoom-rest-api-app.zip -d .agents/skills
Documentation by Zoom
/build-zoom-rest-api-app
Background reference for deterministic server-side Zoom automation and resource management. Prefer plan-zoom-product, plan-zoom-integration, or debug-zoom first, then route here for endpoint-level detail.
Zoom REST API
Expert guidance for building server-side integrations with the Zoom REST API. This API provides 600+ endpoints for managing meetings, users, webinars, recordings, reports, and all Zoom platform resources programmatically.
Official Documentation: https://developers.zoom.us/api-hub/
API Hub Reference: https://developers.zoom.us/api-hub/meetings/
OpenAPI Inventories: https://developers.zoom.us/api-hub/<domain>/methods/endpoints.json
Quick Links
New to Zoom REST API? Follow this path:
API Architecture - Base URLs, regional URLs,
mekeyword, ID vs UUID, time formatsAuthentication Flows - OAuth setup (S2S, User, PKCE, Device Code)
Meeting URLs vs Meeting SDK - Stop mixing
join_urlwith Meeting SDKMeeting Lifecycle - Create → Update → Start → End → Delete with webhooks
Rate Limiting Strategy - Plan tiers, per-user limits, retry patterns
Reference:
Meetings - Meeting CRUD, types, settings
Users - User provisioning and management
Recordings - Cloud recording access and download
AI Services - Scribe endpoint inventory and current AI Services path surface
GraphQL Queries - Alternative query API (beta)
Integrated Index - see the section below in this file
Most domain files under references/ are aligned to the official API Hub endpoints.json inventories. Treat those files as the local source of truth for method/path discovery.
Having issues?
Start with preflight checks → 5-Minute Runbook
401 Unauthorized → Authentication Flows (check token expiry, scopes)
429 Too Many Requests → Rate Limiting Strategy
Error codes → Common Errors
Pagination confusion → Common Issues
Webhooks not arriving → Webhook Server
Forum-derived FAQs → Forum Top Questions
Token/scope failures → Token + Scope Playbook
Building event-driven integrations?
Webhook Server - Express.js server with CRC validation
Recording Pipeline - Auto-download via webhook events
Quick Start
Get an Access Token (Server-to-Server OAuth)
curl -X POST "https://zoom.us/oauth/token" \
-H "Authorization: Basic $(echo -n 'CLIENT_ID:CLIENT_SECRET' | base64)" \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "grant_type=account_credentials&account_id=ACCOUNT_ID"Response:
{
"access_token": "eyJhbGciOiJIUzI1NiJ9...",
"token_type": "bearer",
"expires_in": 3600,
"scope": "meeting:read meeting:write user:read"
}Create a Meeting
curl -X POST "https://api.zoom.us/v2/users/HOST_USER_ID/meetings" \
-H "Authorization: Bearer ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"topic": "Team Standup",
"type": 2,
"start_time": "2025-03-15T10:00:00Z",
"duration": 30,
"settings": {
"join_before_host": false,
"waiting_room": true
}
}'For S2S OAuth, use an explicit host user ID or email in the path. Do not use me.
List Users with Pagination
curl "https://api.zoom.us/v2/users?page_size=300&status=active" \
-H "Authorization: Bearer ACCESS_TOKEN"Base URL
https://api.zoom.us/v2Regional Base URLs
The api_url field in OAuth token responses indicates the user's region. Use regional URLs for data residency compliance:
| Region | URL |
|---|---|
| Global (default) | https://api.zoom.us/v2 |
| Australia | https://api-au.zoom.us/v2 |
| Canada | https://api-ca.zoom.us/v2 |
| European Union | https://api-eu.zoom.us/v2 |
| India | https://api-in.zoom.us/v2 |
| Saudi Arabia | https://api-sa.zoom.us/v2 |
| Singapore | https://api-sg.zoom.us/v2 |
| United Kingdom | https://api-uk.zoom.us/v2 |
| United States | https://api-us.zoom.us/v2 |
Note: You can always use the global URL https://api.zoom.us regardless of the api_url value.
Key Features
| Feature | Description |
|---|---|
| Meeting Management | Create, read, update, delete meetings with full scheduling control |
| User Provisioning | Automated user lifecycle (create, update, deactivate, delete) |
| Webinar Operations | Webinar CRUD, registrant management, panelist control |
| Cloud Recordings | List, download, delete recordings with file-type filtering |
| Reports & Analytics | Usage reports, participant data, daily statistics |
| Team Chat | Channel management, messaging, chatbot integration |
| Zoom Phone | Call management, voicemail, call routing |
| Zoom Rooms | Room management, device control, scheduling |
| Webhooks | Real-time event notifications for 100+ event types |
| WebSockets | Persistent event streaming without public endpoints |
| GraphQL (Beta) | Single-endpoint flexible queries at v3/graphql |
| AI Companion | Meeting summaries, transcripts, AI-generated content |
| AI Services / Scribe | File and archive transcription via Build-platform JWT-authenticated endpoints |
Prerequisites
Zoom account (Free tier has API access with lower rate limits)
App registered on Zoom App Marketplace
OAuth credentials (Server-to-Server OAuth or User OAuth)
Appropriate scopes for target endpoints
Need help with authentication? See the zoom-oauth skill for complete OAuth flow implementation.
Critical Gotchas and Best Practices
⚠️ JWT App Type is Deprecated
The JWT app type is deprecated. Migrate to Server-to-Server OAuth. This does NOT affect JWT token signatures used in Video SDK — only the Marketplace "JWT" app type for REST API access.
// OLD (JWT app type - DEPRECATED)
const token = jwt.sign({ iss: apiKey, exp: expiry }, apiSecret);
// NEW (Server-to-Server OAuth)
const token = await getServerToServerToken(accountId, clientId, clientSecret);⚠️ The me Keyword Rules
User-level OAuth apps: MUST use
meinstead ofuserId(otherwise: invalid token error)Server-to-Server OAuth apps: MUST NOT use
me— provide the actualuserIdor emailAccount-level OAuth apps: Can use either
meoruserId
⚠️ Meeting ID vs UUID — Double Encoding
UUIDs that begin with / or contain // must be double URL-encoded:
// UUID: /abc==
// Single encode: %2Fabc%3D%3D
// Double encode: %252Fabc%253D%253D ← USE THIS
const uuid = '/abc==';
const encoded = encodeURIComponent(encodeURIComponent(uuid));
const url = `https://api.zoom.us/v2/meetings/${encoded}`;⚠️ Time Formats
yyyy-MM-ddTHH:mm:ssZ— UTC time (note theZsuffix)yyyy-MM-ddTHH:mm:ss— Local time (noZ, usestimezonefield)Some report APIs only accept UTC. Check the API reference for each endpoint.
⚠️ Rate Limits Are Per-Account, Not Per-App
All apps on the same Zoom account share rate limits. One heavy app can impact others. Monitor X-RateLimit-Remaining headers proactively.
⚠️ Per-User Daily Limits
Meeting/Webinar create/update operations are limited to 100 per day per user (resets at 00:00 UTC). Distribute operations across different host users when doing bulk operations.
⚠️ Download URLs Require Auth and Follow Redirects
Recording download_url values require Bearer token authentication and may redirect. Always follow redirects:
curl -L -H "Authorization: Bearer ACCESS_TOKEN" "https://zoom.us/rec/download/..."Use Webhooks Instead of Polling
// DON'T: Poll every minute (wastes API quota)
setInterval(() => getMeetings(), 60000);
// DO: Receive webhook events in real-time
app.post('/webhook', (req, res) => {
if (req.body.event === 'meeting.started') {
handleMeetingStarted(req.body.payload);
}
res.status(200).send();
});Webhook setup details: See the zoom-webhooks skill for comprehensive webhook implementation.
Complete Documentation Library
This skill includes comprehensive guides organized by category:
Core Concepts
API Architecture - REST design, base URLs, regional routing,
mekeyword, ID vs UUID, time formatsAuthentication Flows - All OAuth flows (S2S, User, PKCE, Device Code)
Rate Limiting Strategy - Limits by plan, retry patterns, request queuing
Complete Examples
Meeting Lifecycle - Full Create → Update → Start → End → Delete flow with webhook events
User Management - CRUD users, list with pagination, bulk operations
Recording Pipeline - Download recordings via webhooks + API
Webhook Server - Express.js server with CRC validation and signature verification
GraphQL Queries - GraphQL queries, mutations, cursor pagination
Troubleshooting
Common Errors - HTTP status codes, Zoom error codes, error response formats
Common Issues - Rate limits, token refresh, pagination pitfalls, gotchas
References (39 files covering all Zoom API domains)
Core APIs
references/meetings.md - Meeting CRUD, types, settings
references/users.md - User provisioning, types, scopes
references/webinars.md - Webinar management, registrants
references/recordings.md - Cloud recording access
references/reports.md - Usage reports, analytics
references/accounts.md - Account management
Communication
references/team-chat.md - Team Chat messaging
references/chatbot.md - Interactive chatbots
references/phone.md - Zoom Phone
references/mail.md - Zoom Mail
references/calendar.md - Zoom Calendar
Infrastructure
references/rooms.md - Zoom Rooms
references/scim2.md - SCIM 2.0 provisioning APIs
references/rate-limits.md - Rate limit details
references/qss.md - Quality of Service Subscription
Advanced
references/graphql.md - GraphQL API (beta)
references/ai-companion.md - AI features
references/authentication.md - Auth reference
references/openapi.md - OpenAPI specs, Postman, code generation
Additional API Domains
references/events.md - Events and event platform APIs
references/scheduler.md - Zoom Scheduler APIs
references/tasks.md - Tasks APIs
references/whiteboard.md - Whiteboard APIs
references/video-management.md - Video management APIs
references/video-sdk-api.md - Video SDK REST APIs
references/marketplace-apps.md - Marketplace app management
references/commerce.md - Commerce and billing APIs
references/contact-center.md - Contact Center APIs
references/quality-management.md - Quality management APIs
references/workforce-management.md - Workforce management APIs
references/healthcare.md - Healthcare APIs
references/auto-dialer.md - Auto dialer APIs
references/number-management.md - Number management APIs
references/revenue-accelerator.md - Revenue Accelerator APIs
references/virtual-agent.md - Virtual Agent APIs
references/cobrowse-sdk-api.md - Cobrowse SDK APIs
references/crc.md - Cloud Room Connector APIs
references/clips.md - Clips APIs
references/zoom-docs.md - Zoom docs and source references
Sample Repositories
Official (by Zoom)
| Type | Repository |
|---|---|
| OAuth Sample | oauth-sample-app |
| S2S OAuth Starter | server-to-server-oauth-starter-api |
| User OAuth | user-level-oauth-starter |
| S2S Token | server-to-server-oauth-token |
| Rivet Library | rivet-javascript |
| WebSocket Sample | websocket-js-sample |
| Webhook Sample | webhook-sample-node.js |
| Python S2S | server-to-server-python-sample |
Resources
API Reference: https://developers.zoom.us/api-hub/
GraphQL Playground: https://nws.zoom.us/graphql/playground
Postman Collection: https://marketplace.zoom.us/docs/api-reference/postman
Developer Forum: https://devforum.zoom.us/
Changelog: https://developers.zoom.us/changelog/
Status Page: https://status.zoom.us/
Need help? Start with Integrated Index section below for complete navigation.
Integrated Index
This section was migrated from SKILL.md.
Quick Start Path
If you're new to the Zoom REST API, follow this order:
Run preflight checks first → RUNBOOK.md
Understand the API design → concepts/api-architecture.md
Base URLs, regional endpoints,
mekeyword rulesMeeting ID vs UUID, double-encoding, time formats
Set up authentication → concepts/authentication-flows.md
Server-to-Server OAuth (backend automation)
User OAuth with PKCE (user-facing apps)
Cross-reference: zoom-oauth
Create your first meeting → examples/meeting-lifecycle.md
Full CRUD with curl and Node.js examples
Webhook event integration
Handle rate limits → concepts/rate-limiting-strategy.md
Plan-based limits, retry patterns, request queuing
Set up webhooks → examples/webhook-server.md
CRC validation, signature verification, event handling
Troubleshoot issues → troubleshooting/common-issues.md
Token refresh, pagination pitfalls, common gotchas
Documentation Structure
rest-api/
├── SKILL.md # Main skill overview + quick start
├── SKILL.md # This file - navigation guide
│
├── concepts/ # Core architectural concepts
│ ├── api-architecture.md # REST design, URLs, IDs, time formats
│ ├── authentication-flows.md # OAuth flows (S2S, User, PKCE, Device)
│ └── rate-limiting-strategy.md # Limits by plan, retry, queuing
│
├── examples/ # Complete working code
│ ├── meeting-lifecycle.md # Create→Update→Start→End→Delete
│ ├── user-management.md # CRUD users, pagination, bulk ops
│ ├── recording-pipeline.md # Download recordings via webhooks
│ ├── webhook-server.md # Express.js CRC + signature verification
│ └── graphql-queries.md # GraphQL queries, mutations, pagination
│
├── troubleshooting/ # Problem solving
│ ├── common-errors.md # HTTP codes, Zoom error codes table
│ └── common-issues.md # Rate limits, tokens, pagination pitfalls
│
└── references/ # 39 domain-specific reference files
├── authentication.md # Auth methods reference
├── meetings.md # Meeting endpoints
├── users.md # User management endpoints
├── webinars.md # Webinar endpoints
├── recordings.md # Cloud recording endpoints
├── reports.md # Reports & analytics
├── accounts.md # Account management
├── rate-limits.md # Rate limit details
├── graphql.md # GraphQL API (beta)
├── zoom-team-chat.md # Team Chat messaging
├── chatbot.md # Chatbot integration
├── phone.md # Zoom Phone
├── rooms.md # Zoom Rooms
├── calendar.md # Zoom Calendar
├── mail.md # Zoom Mail
├── ai-companion.md # AI features
├── openapi.md # OpenAPI specs
├── qss.md # Quality of Service
├── contact-center.md # Contact Center
├── events.md # Zoom Events
├── whiteboard.md # Whiteboard
├── clips.md # Zoom Clips
├── scheduler.md # Scheduler
├── scim2.md # SCIM 2.0
├── marketplace-apps.md # App management
├── zoom-video-sdk-api.md # Video SDK REST
└── ... (39 total files)By Use Case
I want to create and manage meetings
API Architecture - Base URL, time formats
Meeting Lifecycle - Full CRUD + webhook events
Meetings Reference - All endpoints, types, settings
I want to manage users programmatically
User Management - CRUD, pagination, bulk ops
Users Reference - Endpoints, user types, scopes
I want to download recordings automatically
Recording Pipeline - Webhook-triggered downloads
Recordings Reference - File types, download auth
I want to receive real-time events
Webhook Server - CRC validation, signature check
Cross-reference: zoom-webhooks for comprehensive webhook docs
Cross-reference: zoom-websockets for WebSocket events
I want to use GraphQL instead of REST
GraphQL Queries - Queries, mutations, pagination
GraphQL Reference - Available entities, scopes, rate limits
I want to set up authentication
Authentication Flows - All OAuth methods
Cross-reference: zoom-oauth for full OAuth implementation
I'm hitting rate limits
Rate Limiting Strategy - Limits by plan, strategies
Rate Limits Reference - Detailed tables
Common Issues - Practical solutions
I'm getting errors
Common Errors - Error code tables
Common Issues - Diagnostic workflow
I want to build webinars
Webinars Reference - Endpoints, types, registrants
Meeting Lifecycle - Similar patterns apply
I want to integrate Zoom Phone
Phone Reference - Phone API endpoints
Rate Limiting Strategy - Separate Phone rate limits
Most Critical Documents
1. API Architecture (FOUNDATION)
Essential knowledge before making any API call:
Base URLs and regional endpoints
The
mekeyword rules (different per app type!)Meeting ID vs UUID double-encoding
ISO 8601 time formats (UTC vs local)
Download URL authentication
2. Rate Limiting Strategy (MOST COMMON PRODUCTION ISSUE)
concepts/rate-limiting-strategy.md
Rate limits are per-account, shared across all apps:
Free: 4/sec Light, 2/sec Medium, 1/sec Heavy
Pro: 30/sec Light, 20/sec Medium, 10/sec Heavy
Business+: 80/sec Light, 60/sec Medium, 40/sec Heavy
Per-user: 100 meeting create/update per day
3. Meeting Lifecycle (MOST COMMON TASK)
Complete CRUD with webhook integration — the pattern most developers need first.
Key Learnings
Critical Discoveries:
JWT app type is deprecated — use Server-to-Server OAuth
The JWT app type on Marketplace is deprecated, NOT JWT token signatures
See: Authentication Flows
mekeyword behaves differently by app typeUser OAuth: MUST use
meS2S OAuth: MUST NOT use
meSee: API Architecture
Rate limiting is nuanced (don’t assume a single global rule)
Limits can vary by endpoint and may be enforced at account/app/user levels
Treat quotas as potentially shared across your account and implement backoff
Monitor rate limit response headers (for example
X-RateLimit-Remaining)
100 meeting creates per user per day
This is a hard per-user limit, not related to rate limits
Distribute across host users for bulk operations
UUID double-encoding is required for certain UUIDs
UUIDs starting with
/or containing//must be double-encodedSee: API Architecture
Pagination: use
next_page_token, notpage_numberpage_numberis legacy and being phased outnext_page_tokenis the recommended approachSee: Common Issues
GraphQL is at
/v3/graphql, not/v2/Single endpoint, cursor-based pagination
Rate limits apply per-field (each field = one REST equivalent)
See: GraphQL Queries
Quick Reference
"401 Unauthorized"
→ Authentication Flows - Token expired or wrong scopes
"429 Too Many Requests"
→ Rate Limiting Strategy - Check headers for reset time
"Invalid token" when using userId
→ API Architecture - User OAuth apps must use me
"How do I paginate results?"
→ Common Issues - Use next_page_token
"Webhooks not arriving"
→ Webhook Server - CRC validation required
"Recording download fails"
→ Recording Pipeline - Bearer auth + follow redirects
"How do I create a meeting?"
→ Meeting Lifecycle - Full working examples
Related Skills
| Skill | Use When |
|---|---|
| zoom-oauth | Implementing OAuth flows, token management |
| zoom-webhooks | Deep webhook implementation, event catalog |
| zoom-websockets | WebSocket event streaming |
| zoom-general | Cross-product patterns, community repos |
Based on Zoom REST API v2 (current) and GraphQL v3 (beta)
Environment Variables
See references/environment-variables.md for standardized
.envkeys and where to find each value.
Files
- ATTRIBUTION.mdAdded by AutoGineer987 B
- LICENSELicence file added by AutoGineer1.1 KiB
- RUNBOOK.md3.1 KiB
- SKILL.md25.9 KiB
- concepts/api-architecture.md8.9 KiB
- concepts/authentication-flows.md9.1 KiB
- concepts/meeting-urls-and-sdk-joining.md1.2 KiB
- concepts/rate-limiting-strategy.md9.6 KiB
- examples/graphql-queries.md466 B
- examples/meeting-lifecycle.md14.6 KiB
- examples/recording-pipeline.md662 B
- examples/user-management.md510 B
- examples/webhook-server.md14.4 KiB
- references/accounts.md7.5 KiB
- references/ai-companion.md1.2 KiB
- references/ai-services.md1.5 KiB
- references/authentication.md11.1 KiB
- references/auto-dialer.md2.6 KiB
- references/calendar.md4.9 KiB
- references/chatbot.md1.4 KiB
- references/clips.md2.9 KiB
- references/cobrowse-sdk-api.md1.4 KiB
- references/commerce.md5.8 KiB
- references/contact-center.md33.1 KiB
- references/crc.md3.5 KiB
- references/environment-variables.md976 B
- references/events.md13.0 KiB
- references/graphql.md8.9 KiB
- references/healthcare.md1.3 KiB
- references/mail.md6.9 KiB
- references/marketplace-apps.md4.0 KiB
- references/meetings.md21.3 KiB
- references/number-management.md4.8 KiB
- references/openapi.md4.4 KiB
- references/phone.md45.9 KiB
- references/qss.md1.6 KiB
- references/quality-management.md1.7 KiB
- references/rate-limits.md9.9 KiB
- references/recordings.md1.4 KiB
- references/reports.md1.2 KiB
- references/revenue-accelerator.md9.4 KiB
- references/rooms.md15.3 KiB
- references/scheduler.md3.8 KiB
- references/scim2.md1.9 KiB
- references/tasks.md2.6 KiB
- references/team-chat.md13.5 KiB
- references/users.md7.3 KiB
- references/video-management.md4.0 KiB
- references/video-sdk-api.md5.3 KiB
- references/virtual-agent.md2.2 KiB
- references/webinars.md1.2 KiB
- references/whiteboard.md5.3 KiB
- references/workforce-management.md3.1 KiB
- references/zoom-docs.md3.2 KiB
- troubleshooting/common-errors.md11.7 KiB
- troubleshooting/common-issues.md651 B
- troubleshooting/forum-top-questions.md1.7 KiB
- troubleshooting/token-scope-playbook.md1.5 KiB
troubleshooting/common-errors.md
Common Errors - HTTP Status Codes and Zoom Error Codes
Complete reference for Zoom REST API error codes, HTTP status codes, and solutions.
HTTP Status Codes
2XX - Success
| Status | Description | Action |
|---|---|---|
200 OK | Request succeeded | Parse response body |
201 Created | Resource created | Check Location header for new resource URL |
204 No Content | Request succeeded, no body | Common for UPDATE/DELETE operations |
4XX - Client Errors
| Status | Description | Common Causes | Solution |
|---|---|---|---|
400 Bad Request | Invalid request | Missing required fields, invalid JSON, validation errors | Check request body format and required fields |
401 Unauthorized | Authentication failed | Invalid/expired token, missing Authorization header | Refresh access token, check token format |
403 Forbidden | Permission denied | Missing scopes, user lacks permission, shared access not granted | Add required scopes, check user role |
404 Not Found | Resource doesn't exist | Invalid userId/meetingId, wrong me keyword usage | Verify resource ID, check me keyword rules |
409 Conflict | Resource conflict | Email already exists, duplicate operation | Use unique identifiers |
429 Too Many Requests | Rate limit exceeded | Too many requests per second/day | Implement exponential backoff, throttle requests |
5XX - Server Errors
| Status | Description | Action |
|---|---|---|
500 Internal Server Error | Zoom server error | Retry with exponential backoff |
502 Bad Gateway | Gateway error | Retry after delay |
503 Service Unavailable | Zoom service down | Check status.zoom.us, retry later |
Zoom Error Codes
When an API call fails, Zoom returns an error response:
{
"code": 300,
"message": "Request Body should be a valid JSON object."
}Common Zoom Error Codes
| Code | HTTP | Message | Cause | Solution |
|---|---|---|---|---|
300 | 400 | Invalid request | Bad JSON, validation error | Check request body structure |
124 | 400 | Invalid parameter | Wrong parameter type/value | Validate parameters against API docs |
200 | 401 | Invalid credentials | Incorrect OAuth token | Refresh access token |
201 | 401 | Access token expired | Token expired | Request new token |
1001 | 404 | User does not exist | Invalid userId or wrong me usage | Check userId, review me keyword rules |
300 | 404 | Meeting not found | Invalid meetingId | Verify meeting exists |
3000 | 404 | Cannot access webinar info | Webinar doesn't exist or no access | Check webinarId and scopes |
200 | 429 | Rate limit exceeded | Too many requests | Implement rate limiting |
4700 | 401 | Invalid access token | Token missing scopes | Add required scopes in app config |
3001 | 403 | Not allowed to access | Missing permission | Upgrade user role or add scope |
Detailed Error Scenarios
401 Unauthorized
Scenario 1: Token Expired
{
"code": 201,
"message": "Access token is expired."
}Solution:
async function apiCallWithRetry(url, options) {
try {
const response = await fetch(url, options);
if (response.status === 401) {
const error = await response.json();
if (error.code === 201) {
// Token expired - refresh and retry
const newToken = await refreshAccessToken();
options.headers['Authorization'] = `Bearer ${newToken}`;
return await fetch(url, options);
}
}
return response;
} catch (error) {
console.error('API call failed:', error);
throw error;
}
}Scenario 2: Missing/Invalid Token
{
"code": 200,
"message": "Invalid credentials."
}Solution:
Check
Authorizationheader is present:Authorization: Bearer ACCESS_TOKENVerify token format (should be JWT)
Ensure token is for the correct account
Scenario 3: Missing Scopes
{
"code": 4700,
"message": "Invalid access token, does not contain scopes."
}Solution:
Go to your app on Zoom Marketplace
Add required scopes (e.g.,
meeting:write:admin)Request new access token with updated scopes
403 Forbidden
Scenario 1: Missing Permission
{
"code": 3001,
"message": "This user is not allowed to access this resource."
}Solution:
Verify user has appropriate role (Admin, Owner)
Check if endpoint requires admin-level scopes
Use account-level scope (e.g.,
meeting:write:admininstead ofmeeting:write)
Scenario 2: Shared Access Permissions
{
"code": 3001,
"message": "Authenticated user has not permitted access to the targeted resource."
}Cause: User hasn't authorized shared access permissions for your app.
Solution: Direct user to: Allowing Apps Access to Shared Access Permissions
404 Not Found
Scenario 1: User Not Found (Wrong me Usage)
{
"code": 1001,
"message": "User does not exist: [email protected]"
}Cause: Using userId with User OAuth app (should use me).
Solution:
// WRONG (User OAuth app)
fetch('https://api.zoom.us/v2/users/[email protected]', {
headers: { 'Authorization': `Bearer ${userToken}` }
});
// CORRECT (User OAuth app)
fetch('https://api.zoom.us/v2/users/me', {
headers: { 'Authorization': `Bearer ${userToken}` }
});Scenario 2: Meeting/Resource Not Found
{
"code": 300,
"message": "Meeting not found."
}Causes:
Meeting deleted
Meeting expired (30 days after last use)
Invalid meetingId
Wrong UUID encoding
Solution for UUID:
// UUID starts with / or contains // → double-encode
const uuid = '/xyzAbC123==';
const encoded = encodeURIComponent(encodeURIComponent(uuid));
fetch(`https://api.zoom.us/v2/meetings/${encoded}`, { headers });429 Too Many Requests
{
"code": 200,
"message": "You have reached the maximum per-second rate limit for this API."
}Solution: Implement exponential backoff
async function apiCallWithBackoff(url, options, maxRetries = 3) {
for (let attempt = 1; attempt <= maxRetries; attempt++) {
const response = await fetch(url, options);
if (response.status === 429) {
const retryAfter = response.headers.get('Retry-After') || Math.pow(2, attempt);
console.log(`Rate limited. Retrying after ${retryAfter}s`);
await sleep(retryAfter * 1000);
continue;
}
return response;
}
throw new Error('Max retries exceeded');
}
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}Check rate limit headers:
const remaining = response.headers.get('X-RateLimit-Remaining');
const type = response.headers.get('X-RateLimit-Type');
console.log(`Rate limit remaining: ${remaining} (${type})`);Validation Error Responses
Field Validation Errors
{
"code": 300,
"message": "Validation Failed.",
"errors": [
{
"field": "start_time",
"message": "Invalid field."
},
{
"field": "type",
"message": "Invalid field."
}
]
}Solution:
Check each field's format in API documentation
Verify required fields are present
Ensure data types match (number vs string)
Common Field Errors
| Field | Error | Cause | Fix |
|---|---|---|---|
start_time | Invalid field | Wrong format | Use yyyy-MM-ddTHH:mm:ssZ |
type | Invalid field | Invalid meeting type | Use 1, 2, 3, or 8 |
email | Invalid field | Invalid email format | Check email format |
duration | Invalid field | Duration too long | Max duration varies by plan |
Error Response Structure
Standard Error
{
"code": 300,
"message": "Descriptive error message"
}Validation Error
{
"code": 300,
"message": "Validation Failed.",
"errors": [
{
"field": "field_name",
"message": "Error description"
}
]
}Error Handling Best Practices
1. Parse Error Response
async function handleApiResponse(response) {
if (!response.ok) {
const error = await response.json();
console.error(`API Error ${response.status}:`, error);
// Check for validation errors
if (error.errors && Array.isArray(error.errors)) {
error.errors.forEach(err => {
console.error(`- Field "${err.field}": ${err.message}`);
});
}
throw new Error(`${error.code}: ${error.message}`);
}
return await response.json();
}2. Retry with Exponential Backoff
async function retryWithBackoff(fn, maxRetries = 3, baseDelay = 1000) {
for (let attempt = 1; attempt <= maxRetries; attempt++) {
try {
return await fn();
} catch (error) {
const isRetryable = error.status >= 500 || error.status === 429;
if (!isRetryable || attempt === maxRetries) {
throw error;
}
const delay = baseDelay * Math.pow(2, attempt - 1);
const jitter = Math.random() * 1000; // Add randomness
console.log(`Retry attempt ${attempt} after ${delay + jitter}ms`);
await sleep(delay + jitter);
}
}
}3. Log Errors with Context
function logApiError(error, context) {
const logEntry = {
timestamp: new Date().toISOString(),
status: error.status,
code: error.code,
message: error.message,
context: {
endpoint: context.endpoint,
method: context.method,
userId: context.userId
}
};
console.error('API Error:', JSON.stringify(logEntry, null, 2));
// Send to monitoring service
// monitoring.track(logEntry);
}4. User-Friendly Error Messages
function getUserFriendlyError(error) {
const errorMap = {
1001: 'User not found. Please check the email address.',
300: 'Invalid request. Please check your input.',
201: 'Your session has expired. Please sign in again.',
4700: 'Permission denied. Please contact your administrator.',
200: 'Too many requests. Please try again in a few moments.'
};
return errorMap[error.code] || 'An unexpected error occurred. Please try again.';
}Troubleshooting Checklist
Quick Diagnostic Steps
Check HTTP status code - Indicates error category (auth, validation, server)
Read error message - Provides specific details
Check Zoom error code - Maps to specific issue
Verify authentication - Token valid, scopes present
Check rate limits - Monitor
X-RateLimit-RemainingheaderTest with Postman - Isolate code vs API issue
Check Zoom Status - Visit status.zoom.us
Common Fixes
| Symptom | Check | Fix |
|---|---|---|
| 401 Unauthorized | Token expiry | Refresh access token |
| 404 User not found | me keyword usage | Use me for User OAuth |
| 404 Meeting not found | UUID encoding | Double-encode UUIDs starting with / |
| 403 Forbidden | Scopes | Add required scopes in app config |
| 429 Rate limit | Request rate | Implement throttling |
| 400 Validation error | Request body | Check field formats in docs |
Related Documentation
API Architecture -
mekeyword, UUID encoding, time formatsRate Limiting Strategy - Handle 429 errors
Authentication Flows - Token refresh patterns
Common Issues - Practical troubleshooting
Resources
Requirements and compatibility
Written for: Claude Code, Claude apps
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.
Needs: Needs network access, Needs Python, Needs Node.js
Security
What our scanner noticed· Medium risk
- Possible data-exfiltration endpoints
- Instructions that use the network
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
- Anthropic (Official)
- Distributed by
- Anthropic
- Source
- anthropics/knowledge-work-plugins · partner-built/zoom-plugin/skills/rest-api · commit e050c2e
- Licence
- MIT License (redistribution allowed)
- LICENSE (added by AutoGineer from partner-built/zoom-plugin/LICENSE)
- ATTRIBUTION.md (written by AutoGineer)
- Synced
AutoGineer is not affiliated with or endorsed by Zoom or Anthropic.
Download ZIP
The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download build-zoom-rest-api-app.zip