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,
me keyword, ID vs UUID, time formats
- Authentication Flows - OAuth setup (S2S, User, PKCE, Device Code)
- Meeting URLs vs Meeting SDK - Stop mixing
join_url with Meeting SDK
- Meeting 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, Summarizer, and Translator endpoint inventory and current AI Services path surface
- Marketplace Apps - App creation, manifest validation, native app types, and response quirks
- Marketplace Templates - Scenario manifests, native create requests, and merge-only feature fragments
- Connect, Actions, and Triggers - External REST/MCP connectors and manifest-managed workflow capabilities
- 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/v2
Regional 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 transcription, Summarizer transcript summaries, and Translator text translation 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 General App OAuth/client credentials)
- Appropriate scopes for target endpoints
Need to create or validate the app first? Use
Marketplace app management before implementing REST calls.
It covers General App manifests, S2S rollout quirks, app-owned client_credentials scopes,
event subscription setup, credential response shapes, and the requirement to manually create
a first bootstrap app before the app-creation API can authorize creation of later apps.
For automation, select from the machine-readable
Marketplace template index
and follow the manifest update workflow
when changing an existing General App.
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
- General App user-level scoped tokens: MUST use
me instead of userId for current-user endpoints (otherwise: invalid token error)
- Server-to-Server OAuth apps: MUST NOT use
me — provide the actual userId or email
- General App admin/account-level scoped tokens: Can use
me or an allowed userId, depending on the endpoint and granted scopes
⚠️ 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 the Z suffix)
yyyy-MM-ddTHH:mm:ss — Local time (no Z, uses timezone field)
- 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,
me keyword, ID vs UUID, time formats
- Authentication 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/marketplace-app-templates.md - Select and customize POST-ready Marketplace app templates by scenario
- references/marketplace-manifest-update-workflow.md - Full-replacement updates for existing General App manifests
- references/marketplace-connect-actions-triggers.md - Connect routes, external MCP, custom actions, and built-in trigger fragments
- assets/marketplace-apps/marketplace-manifest-template-index.json - Machine-readable app-type and template compatibility catalog
- 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)
Resources
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,
me keyword rules
- Meeting ID vs UUID, double-encoding, time formats
Set up authentication → concepts/authentication-flows.md
- Server-to-Server OAuth (backend automation)
- General App OAuth with PKCE when needed (user-facing or admin-installed 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)
concepts/api-architecture.md
Essential knowledge before making any API call:
- Base URLs and regional endpoints
- The
me keyword 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)
examples/meeting-lifecycle.md
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
me keyword behaves differently by app type
- General App user-level tokens: MUST use
me
- S2S OAuth: MUST NOT use
me
- See: 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)
- See: Rate Limiting Strategy
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
- See: Rate Limiting Strategy
UUID double-encoding is required for certain UUIDs
- UUIDs starting with
/ or containing // must be double-encoded
- See: API Architecture
Pagination: use next_page_token, not page_number
page_number is legacy and being phased out
next_page_token is the recommended approach
- See: 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 - General App user-level tokens 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
Based on Zoom REST API v2 (current) and GraphQL v3 (beta)
Environment Variables
- See references/environment-variables.md for standardized
.env keys and where to find each value.
1---2name: zoom-rest-api3description: Zoom REST API - 600+ endpoints for meetings, users, webinars, recordings, reports, and more. Server-side API for managing Zoom resources programmatically with OAuth 2.0 authentication.4---56# Zoom REST API78Expert 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.910**Official Documentation**: https://developers.zoom.us/api-hub/11**API Hub Reference**: https://developers.zoom.us/api-hub/meetings/12**OpenAPI Inventories**: `https://developers.zoom.us/api-hub/<domain>/methods/endpoints.json`1314## Quick Links1516**New to Zoom REST API? Follow this path:**17181. **[API Architecture](concepts/api-architecture.md)** - Base URLs, regional URLs, `me` keyword, ID vs UUID, time formats192. **[Authentication Flows](concepts/authentication-flows.md)** - OAuth setup (S2S, User, PKCE, Device Code)203. **[Meeting URLs vs Meeting SDK](concepts/meeting-urls-and-sdk-joining.md)** - Stop mixing `join_url` with Meeting SDK213. **[Meeting Lifecycle](examples/meeting-lifecycle.md)** - Create → Update → Start → End → Delete with webhooks224. **[Rate Limiting Strategy](concepts/rate-limiting-strategy.md)** - Plan tiers, per-user limits, retry patterns2324**Reference:**25- **[Meetings](references/meetings.md)** - Meeting CRUD, types, settings26- **[Users](references/users.md)** - User provisioning and management27- **[Recordings](references/recordings.md)** - Cloud recording access and download28- **[AI Services](references/ai-services.md)** - Scribe, Summarizer, and Translator endpoint inventory and current AI Services path surface29- **[Marketplace Apps](references/marketplace-apps.md)** - App creation, manifest validation, native app types, and response quirks30- **[Marketplace Templates](references/marketplace-app-templates.md)** - Scenario manifests, native create requests, and merge-only feature fragments31- **[Connect, Actions, and Triggers](references/marketplace-connect-actions-triggers.md)** - External REST/MCP connectors and manifest-managed workflow capabilities32- **[GraphQL Queries](examples/graphql-queries.md)** - Alternative query API (beta)33- **Integrated Index** - see the section below in this file3435Most 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.3637**Having issues?**38- Start with preflight checks → [5-Minute Runbook](RUNBOOK.md)39- 401 Unauthorized → [Authentication Flows](concepts/authentication-flows.md) (check token expiry, scopes)40- 429 Too Many Requests → [Rate Limiting Strategy](concepts/rate-limiting-strategy.md)41- Error codes → [Common Errors](troubleshooting/common-errors.md)42- Pagination confusion → [Common Issues](troubleshooting/common-issues.md)43- Webhooks not arriving → [Webhook Server](examples/webhook-server.md)44- Forum-derived FAQs → [Forum Top Questions](troubleshooting/forum-top-questions.md)45- Token/scope failures → [Token + Scope Playbook](troubleshooting/token-scope-playbook.md)4647**Building event-driven integrations?**48- [Webhook Server](examples/webhook-server.md) - Express.js server with CRC validation49- [Recording Pipeline](examples/recording-pipeline.md) - Auto-download via webhook events5051## Quick Start5253### Get an Access Token (Server-to-Server OAuth)5455```bash56curl -X POST "https://zoom.us/oauth/token" \57 -H "Authorization: Basic $(echo -n 'CLIENT_ID:CLIENT_SECRET' | base64)" \58 -H "Content-Type: application/x-www-form-urlencoded" \59 -d "grant_type=account_credentials&account_id=ACCOUNT_ID"60```6162Response:63```json64{65 "access_token": "eyJhbGciOiJIUzI1NiJ9...",66 "token_type": "bearer",67 "expires_in": 3600,68 "scope": "meeting:read meeting:write user:read"69}70```7172### Create a Meeting7374```bash75curl -X POST "https://api.zoom.us/v2/users/HOST_USER_ID/meetings" \76 -H "Authorization: Bearer ACCESS_TOKEN" \77 -H "Content-Type: application/json" \78 -d '{79 "topic": "Team Standup",80 "type": 2,81 "start_time": "2025-03-15T10:00:00Z",82 "duration": 30,83 "settings": {84 "join_before_host": false,85 "waiting_room": true86 }87 }'88```8990For S2S OAuth, use an explicit host user ID or email in the path. Do not use `me`.9192### List Users with Pagination9394```bash95curl "https://api.zoom.us/v2/users?page_size=300&status=active" \96 -H "Authorization: Bearer ACCESS_TOKEN"97```9899## Base URL100101```102https://api.zoom.us/v2103```104105### Regional Base URLs106107The `api_url` field in OAuth token responses indicates the user's region. Use regional URLs for data residency compliance:108109| Region | URL |110|--------|-----|111| Global (default) | `https://api.zoom.us/v2` |112| Australia | `https://api-au.zoom.us/v2` |113| Canada | `https://api-ca.zoom.us/v2` |114| European Union | `https://api-eu.zoom.us/v2` |115| India | `https://api-in.zoom.us/v2` |116| Saudi Arabia | `https://api-sa.zoom.us/v2` |117| Singapore | `https://api-sg.zoom.us/v2` |118| United Kingdom | `https://api-uk.zoom.us/v2` |119| United States | `https://api-us.zoom.us/v2` |120121**Note:** You can always use the global URL `https://api.zoom.us` regardless of the `api_url` value.122123## Key Features124125| Feature | Description |126|---------|-------------|127| **Meeting Management** | Create, read, update, delete meetings with full scheduling control |128| **User Provisioning** | Automated user lifecycle (create, update, deactivate, delete) |129| **Webinar Operations** | Webinar CRUD, registrant management, panelist control |130| **Cloud Recordings** | List, download, delete recordings with file-type filtering |131| **Reports & Analytics** | Usage reports, participant data, daily statistics |132| **Team Chat** | Channel management, messaging, chatbot integration |133| **Zoom Phone** | Call management, voicemail, call routing |134| **Zoom Rooms** | Room management, device control, scheduling |135| **Webhooks** | Real-time event notifications for 100+ event types |136| **WebSockets** | Persistent event streaming without public endpoints |137| **GraphQL (Beta)** | Single-endpoint flexible queries at `v3/graphql` |138| **AI Companion** | Meeting summaries, transcripts, AI-generated content |139| **AI Services** | Scribe transcription, Summarizer transcript summaries, and Translator text translation via Build-platform JWT-authenticated endpoints |140141## Prerequisites142143- Zoom account (Free tier has API access with lower rate limits)144- App registered on [Zoom App Marketplace](https://marketplace.zoom.us/)145- OAuth credentials (Server-to-Server OAuth or General App OAuth/client credentials)146- Appropriate scopes for target endpoints147148> **Need to create or validate the app first?** Use149> [Marketplace app management](references/marketplace-apps.md) before implementing REST calls.150> It covers General App manifests, S2S rollout quirks, app-owned `client_credentials` scopes,151> event subscription setup, credential response shapes, and the requirement to manually create152> a first bootstrap app before the app-creation API can authorize creation of later apps.153> For automation, select from the machine-readable154> [Marketplace template index](assets/marketplace-apps/marketplace-manifest-template-index.json)155> and follow the [manifest update workflow](references/marketplace-manifest-update-workflow.md)156> when changing an existing General App.157158> **Need help with authentication?** See the **[zoom-oauth](../oauth/SKILL.md)** skill for complete OAuth flow implementation.159160## Critical Gotchas and Best Practices161162### ⚠️ JWT App Type is Deprecated163164The 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.165166```javascript167// OLD (JWT app type - DEPRECATED)168const token = jwt.sign({ iss: apiKey, exp: expiry }, apiSecret);169170// NEW (Server-to-Server OAuth)171const token = await getServerToServerToken(accountId, clientId, clientSecret);172```173174### ⚠️ The `me` Keyword Rules175176- **General App user-level scoped tokens**: MUST use `me` instead of `userId` for current-user endpoints (otherwise: invalid token error)177- **Server-to-Server OAuth apps**: MUST NOT use `me` — provide the actual `userId` or email178- **General App admin/account-level scoped tokens**: Can use `me` or an allowed `userId`, depending on the endpoint and granted scopes179180### ⚠️ Meeting ID vs UUID — Double Encoding181182UUIDs that begin with `/` or contain `//` must be **double URL-encoded**:183184```javascript185// UUID: /abc==186// Single encode: %2Fabc%3D%3D187// Double encode: %252Fabc%253D%253D ← USE THIS188189const uuid = '/abc==';190const encoded = encodeURIComponent(encodeURIComponent(uuid));191const url = `https://api.zoom.us/v2/meetings/${encoded}`;192```193194### ⚠️ Time Formats195196- `yyyy-MM-ddTHH:mm:ssZ` — **UTC time** (note the `Z` suffix)197- `yyyy-MM-ddTHH:mm:ss` — **Local time** (no `Z`, uses `timezone` field)198- Some report APIs only accept UTC. Check the API reference for each endpoint.199200### ⚠️ Rate Limits Are Per-Account, Not Per-App201202All apps on the same Zoom account **share** rate limits. One heavy app can impact others. Monitor `X-RateLimit-Remaining` headers proactively.203204### ⚠️ Per-User Daily Limits205206Meeting/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.207208### ⚠️ Download URLs Require Auth and Follow Redirects209210Recording `download_url` values require Bearer token authentication and may redirect. Always follow redirects:211212```bash213curl -L -H "Authorization: Bearer ACCESS_TOKEN" "https://zoom.us/rec/download/..."214```215216### Use Webhooks Instead of Polling217218```javascript219// DON'T: Poll every minute (wastes API quota)220setInterval(() => getMeetings(), 60000);221222// DO: Receive webhook events in real-time223app.post('/webhook', (req, res) => {224 if (req.body.event === 'meeting.started') {225 handleMeetingStarted(req.body.payload);226 }227 res.status(200).send();228});229```230231> **Webhook setup details:** See the **[zoom-webhooks](../webhooks/SKILL.md)** skill for comprehensive webhook implementation.232233## Complete Documentation Library234235This skill includes comprehensive guides organized by category:236237### Core Concepts238- **[API Architecture](concepts/api-architecture.md)** - REST design, base URLs, regional routing, `me` keyword, ID vs UUID, time formats239- **[Authentication Flows](concepts/authentication-flows.md)** - All OAuth flows (S2S, User, PKCE, Device Code)240- **[Rate Limiting Strategy](concepts/rate-limiting-strategy.md)** - Limits by plan, retry patterns, request queuing241242### Complete Examples243- **[Meeting Lifecycle](examples/meeting-lifecycle.md)** - Full Create → Update → Start → End → Delete flow with webhook events244- **[User Management](examples/user-management.md)** - CRUD users, list with pagination, bulk operations245- **[Recording Pipeline](examples/recording-pipeline.md)** - Download recordings via webhooks + API246- **[Webhook Server](examples/webhook-server.md)** - Express.js server with CRC validation and signature verification247- **[GraphQL Queries](examples/graphql-queries.md)** - GraphQL queries, mutations, cursor pagination248249### Troubleshooting250- **[Common Errors](troubleshooting/common-errors.md)** - HTTP status codes, Zoom error codes, error response formats251- **[Common Issues](troubleshooting/common-issues.md)** - Rate limits, token refresh, pagination pitfalls, gotchas252253### References (39 files covering all Zoom API domains)254255#### Core APIs256- **[references/meetings.md](references/meetings.md)** - Meeting CRUD, types, settings257- **[references/users.md](references/users.md)** - User provisioning, types, scopes258- **[references/webinars.md](references/webinars.md)** - Webinar management, registrants259- **[references/recordings.md](references/recordings.md)** - Cloud recording access260- **[references/reports.md](references/reports.md)** - Usage reports, analytics261- **[references/accounts.md](references/accounts.md)** - Account management262263#### Communication264- **[references/team-chat.md](references/team-chat.md)** - Team Chat messaging265- **[references/chatbot.md](references/chatbot.md)** - Interactive chatbots266- **[references/phone.md](references/phone.md)** - Zoom Phone267- **[references/mail.md](references/mail.md)** - Zoom Mail268- **[references/calendar.md](references/calendar.md)** - Zoom Calendar269270#### Infrastructure271- **[references/rooms.md](references/rooms.md)** - Zoom Rooms272- **[references/scim2.md](references/scim2.md)** - SCIM 2.0 provisioning APIs273- **[references/rate-limits.md](references/rate-limits.md)** - Rate limit details274- **[references/qss.md](references/qss.md)** - Quality of Service Subscription275276#### Advanced277- **[references/graphql.md](references/graphql.md)** - GraphQL API (beta)278- **[references/ai-companion.md](references/ai-companion.md)** - AI features279- **[references/authentication.md](references/authentication.md)** - Auth reference280- **[references/openapi.md](references/openapi.md)** - OpenAPI specs, Postman, code generation281282#### Additional API Domains283- **[references/events.md](references/events.md)** - Events and event platform APIs284- **[references/scheduler.md](references/scheduler.md)** - Zoom Scheduler APIs285- **[references/tasks.md](references/tasks.md)** - Tasks APIs286- **[references/whiteboard.md](references/whiteboard.md)** - Whiteboard APIs287- **[references/video-management.md](references/video-management.md)** - Video management APIs288- **[references/video-sdk-api.md](references/video-sdk-api.md)** - Video SDK REST APIs289- **[references/marketplace-apps.md](references/marketplace-apps.md)** - Marketplace app management290- **[references/marketplace-app-templates.md](references/marketplace-app-templates.md)** - Select and customize POST-ready Marketplace app templates by scenario291- **[references/marketplace-manifest-update-workflow.md](references/marketplace-manifest-update-workflow.md)** - Full-replacement updates for existing General App manifests292- **[references/marketplace-connect-actions-triggers.md](references/marketplace-connect-actions-triggers.md)** - Connect routes, external MCP, custom actions, and built-in trigger fragments293- **[assets/marketplace-apps/marketplace-manifest-template-index.json](assets/marketplace-apps/marketplace-manifest-template-index.json)** - Machine-readable app-type and template compatibility catalog294- **[references/commerce.md](references/commerce.md)** - Commerce and billing APIs295- **[references/contact-center.md](references/contact-center.md)** - Contact Center APIs296- **[references/quality-management.md](references/quality-management.md)** - Quality management APIs297- **[references/workforce-management.md](references/workforce-management.md)** - Workforce management APIs298- **[references/healthcare.md](references/healthcare.md)** - Healthcare APIs299- **[references/auto-dialer.md](references/auto-dialer.md)** - Auto dialer APIs300- **[references/number-management.md](references/number-management.md)** - Number management APIs301- **[references/revenue-accelerator.md](references/revenue-accelerator.md)** - Revenue Accelerator APIs302- **[references/virtual-agent.md](references/virtual-agent.md)** - Virtual Agent APIs303- **[references/cobrowse-sdk-api.md](references/cobrowse-sdk-api.md)** - Cobrowse SDK APIs304- **[references/crc.md](references/crc.md)** - Cloud Room Connector APIs305- **[references/clips.md](references/clips.md)** - Clips APIs306- **[references/zoom-docs.md](references/zoom-docs.md)** - Zoom docs and source references307308## Sample Repositories309310### Official (by Zoom)311312| Type | Repository |313|------|------------|314| OAuth Sample | [oauth-sample-app](https://github.com/zoom/oauth-sample-app) |315| S2S OAuth Starter | [server-to-server-oauth-starter-api](https://github.com/zoom/server-to-server-oauth-starter-api) |316| General App user OAuth | [user-level-oauth-starter](https://github.com/zoom/user-level-oauth-starter) |317| S2S Token | [server-to-server-oauth-token](https://github.com/zoom/server-to-server-oauth-token) |318| Rivet Library | [rivet-javascript](https://github.com/zoom/rivet-javascript) |319| WebSocket Sample | [websocket-js-sample](https://github.com/zoom/websocket-js-sample) |320| Webhook Sample | [webhook-sample-node.js](https://github.com/zoom/webhook-sample-node.js) |321| Python S2S | [server-to-server-python-sample](https://github.com/zoom/server-to-server-python-sample) |322323## Resources324325- **API Reference**: https://developers.zoom.us/api-hub/326- **GraphQL Playground**: https://nws.zoom.us/graphql/playground327- **Postman Collection**: https://marketplace.zoom.us/docs/api-reference/postman328- **Developer Forum**: https://devforum.zoom.us/329- **Changelog**: https://developers.zoom.us/changelog/330- **Status Page**: https://status.zoom.us/331332---333334**Need help?** Start with Integrated Index section below for complete navigation.335336---337338## Integrated Index339340_This section was migrated from `SKILL.md`._341342## Quick Start Path343344**If you're new to the Zoom REST API, follow this order:**3453461. **Run preflight checks first** → [RUNBOOK.md](RUNBOOK.md)3473482. **Understand the API design** → [concepts/api-architecture.md](concepts/api-architecture.md)349 - Base URLs, regional endpoints, `me` keyword rules350 - Meeting ID vs UUID, double-encoding, time formats3513523. **Set up authentication** → [concepts/authentication-flows.md](concepts/authentication-flows.md)353 - Server-to-Server OAuth (backend automation)354 - General App OAuth with PKCE when needed (user-facing or admin-installed apps)355 - Cross-reference: [zoom-oauth](../oauth/SKILL.md)3563574. **Create your first meeting** → [examples/meeting-lifecycle.md](examples/meeting-lifecycle.md)358 - Full CRUD with curl and Node.js examples359 - Webhook event integration3603615. **Handle rate limits** → [concepts/rate-limiting-strategy.md](concepts/rate-limiting-strategy.md)362 - Plan-based limits, retry patterns, request queuing3633646. **Set up webhooks** → [examples/webhook-server.md](examples/webhook-server.md)365 - CRC validation, signature verification, event handling3663677. **Troubleshoot issues** → [troubleshooting/common-issues.md](troubleshooting/common-issues.md)368 - Token refresh, pagination pitfalls, common gotchas369370---371372## Documentation Structure373374```375rest-api/376├── SKILL.md # Main skill overview + quick start377├── SKILL.md # This file - navigation guide378│379├── concepts/ # Core architectural concepts380│ ├── api-architecture.md # REST design, URLs, IDs, time formats381│ ├── authentication-flows.md # OAuth flows (S2S, User, PKCE, Device)382│ └── rate-limiting-strategy.md # Limits by plan, retry, queuing383│384├── examples/ # Complete working code385│ ├── meeting-lifecycle.md # Create→Update→Start→End→Delete386│ ├── user-management.md # CRUD users, pagination, bulk ops387│ ├── recording-pipeline.md # Download recordings via webhooks388│ ├── webhook-server.md # Express.js CRC + signature verification389│ └── graphql-queries.md # GraphQL queries, mutations, pagination390│391├── troubleshooting/ # Problem solving392│ ├── common-errors.md # HTTP codes, Zoom error codes table393│ └── common-issues.md # Rate limits, tokens, pagination pitfalls394│395└── references/ # 39 domain-specific reference files396 ├── authentication.md # Auth methods reference397 ├── meetings.md # Meeting endpoints398 ├── users.md # User management endpoints399 ├── webinars.md # Webinar endpoints400 ├── recordings.md # Cloud recording endpoints401 ├── reports.md # Reports & analytics402 ├── accounts.md # Account management403 ├── rate-limits.md # Rate limit details404 ├── graphql.md # GraphQL API (beta)405 ├── zoom-team-chat.md # Team Chat messaging406 ├── chatbot.md # Chatbot integration407 ├── phone.md # Zoom Phone408 ├── rooms.md # Zoom Rooms409 ├── calendar.md # Zoom Calendar410 ├── mail.md # Zoom Mail411 ├── ai-companion.md # AI features412 ├── openapi.md # OpenAPI specs413 ├── qss.md # Quality of Service414 ├── contact-center.md # Contact Center415 ├── events.md # Zoom Events416 ├── whiteboard.md # Whiteboard417 ├── clips.md # Zoom Clips418 ├── scheduler.md # Scheduler419 ├── scim2.md # SCIM 2.0420 ├── marketplace-apps.md # App management421 ├── zoom-video-sdk-api.md # Video SDK REST422 └── ... (39 total files)423```424425---426427## By Use Case428429### I want to create and manage meetings4301. [API Architecture](concepts/api-architecture.md) - Base URL, time formats4312. [Meeting Lifecycle](examples/meeting-lifecycle.md) - Full CRUD + webhook events4323. [Meetings Reference](references/meetings.md) - All endpoints, types, settings433434### I want to manage users programmatically4351. [User Management](examples/user-management.md) - CRUD, pagination, bulk ops4362. [Users Reference](references/users.md) - Endpoints, user types, scopes437438### I want to download recordings automatically4391. [Recording Pipeline](examples/recording-pipeline.md) - Webhook-triggered downloads4402. [Recordings Reference](references/recordings.md) - File types, download auth441442### I want to receive real-time events4431. [Webhook Server](examples/webhook-server.md) - CRC validation, signature check4442. Cross-reference: [zoom-webhooks](../webhooks/SKILL.md) for comprehensive webhook docs4453. Cross-reference: [zoom-websockets](../websockets/SKILL.md) for WebSocket events446447### I want to use GraphQL instead of REST4481. [GraphQL Queries](examples/graphql-queries.md) - Queries, mutations, pagination4492. [GraphQL Reference](references/graphql.md) - Available entities, scopes, rate limits450451### I want to set up authentication4521. [Authentication Flows](concepts/authentication-flows.md) - All OAuth methods4532. Cross-reference: [zoom-oauth](../oauth/SKILL.md) for full OAuth implementation454455### I'm hitting rate limits4561. [Rate Limiting Strategy](concepts/rate-limiting-strategy.md) - Limits by plan, strategies4572. [Rate Limits Reference](references/rate-limits.md) - Detailed tables4583. [Common Issues](troubleshooting/common-issues.md) - Practical solutions459460### I'm getting errors4611. [Common Errors](troubleshooting/common-errors.md) - Error code tables4622. [Common Issues](troubleshooting/common-issues.md) - Diagnostic workflow463464### I want to build webinars4651. [Webinars Reference](references/webinars.md) - Endpoints, types, registrants4662. [Meeting Lifecycle](examples/meeting-lifecycle.md) - Similar patterns apply467468### I want to integrate Zoom Phone4691. [Phone Reference](references/phone.md) - Phone API endpoints4702. [Rate Limiting Strategy](concepts/rate-limiting-strategy.md) - Separate Phone rate limits471472---473474## Most Critical Documents475476### 1. API Architecture (FOUNDATION)477**[concepts/api-architecture.md](concepts/api-architecture.md)**478479Essential knowledge before making any API call:480- Base URLs and regional endpoints481- The `me` keyword rules (different per app type!)482- Meeting ID vs UUID double-encoding483- ISO 8601 time formats (UTC vs local)484- Download URL authentication485486### 2. Rate Limiting Strategy (MOST COMMON PRODUCTION ISSUE)487**[concepts/rate-limiting-strategy.md](concepts/rate-limiting-strategy.md)**488489Rate limits are per-account, shared across all apps:490- Free: 4/sec Light, 2/sec Medium, 1/sec Heavy491- Pro: 30/sec Light, 20/sec Medium, 10/sec Heavy492- Business+: 80/sec Light, 60/sec Medium, 40/sec Heavy493- Per-user: 100 meeting create/update per day494495### 3. Meeting Lifecycle (MOST COMMON TASK)496**[examples/meeting-lifecycle.md](examples/meeting-lifecycle.md)**497498Complete CRUD with webhook integration — the pattern most developers need first.499500---501502## Key Learnings503504### Critical Discoveries:5055061. **JWT app type is deprecated** — use Server-to-Server OAuth507 - The JWT *app type* on Marketplace is deprecated, NOT JWT token signatures508 - See: [Authentication Flows](concepts/authentication-flows.md)5095102. **`me` keyword behaves differently by app type**511 - General App user-level tokens: MUST use `me`512 - S2S OAuth: MUST NOT use `me`513 - See: [API Architecture](concepts/api-architecture.md)5145153. **Rate limiting is nuanced (don’t assume a single global rule)**516 - Limits can vary by endpoint and may be enforced at account/app/user levels517 - Treat quotas as potentially shared across your account and implement backoff518 - Monitor rate limit response headers (for example `X-RateLimit-Remaining`)519 - See: [Rate Limiting Strategy](concepts/rate-limiting-strategy.md)5205214. **100 meeting creates per user per day**522 - This is a hard per-user limit, not related to rate limits523 - Distribute across host users for bulk operations524 - See: [Rate Limiting Strategy](concepts/rate-limiting-strategy.md)5255265. **UUID double-encoding is required for certain UUIDs**527 - UUIDs starting with `/` or containing `//` must be double-encoded528 - See: [API Architecture](concepts/api-architecture.md)5295306. **Pagination: use `next_page_token`, not `page_number`**531 - `page_number` is legacy and being phased out532 - `next_page_token` is the recommended approach533 - See: [Common Issues](troubleshooting/common-issues.md)5345357. **GraphQL is at `/v3/graphql`, not `/v2/`**536 - Single endpoint, cursor-based pagination537 - Rate limits apply per-field (each field = one REST equivalent)538 - See: [GraphQL Queries](examples/graphql-queries.md)539540---541542## Quick Reference543544### "401 Unauthorized"545→ [Authentication Flows](concepts/authentication-flows.md) - Token expired or wrong scopes546547### "429 Too Many Requests"548→ [Rate Limiting Strategy](concepts/rate-limiting-strategy.md) - Check headers for reset time549550### "Invalid token" when using userId551→ [API Architecture](concepts/api-architecture.md) - General App user-level tokens must use `me`552553### "How do I paginate results?"554→ [Common Issues](troubleshooting/common-issues.md) - Use `next_page_token`555556### "Webhooks not arriving"557→ [Webhook Server](examples/webhook-server.md) - CRC validation required558559### "Recording download fails"560→ [Recording Pipeline](examples/recording-pipeline.md) - Bearer auth + follow redirects561562### "How do I create a meeting?"563→ [Meeting Lifecycle](examples/meeting-lifecycle.md) - Full working examples564565---566567## Related Skills568569| Skill | Use When |570|-------|----------|571| **[zoom-oauth](../oauth/SKILL.md)** | Implementing OAuth flows, token management |572| **[zoom-webhooks](../webhooks/SKILL.md)** | Deep webhook implementation, event catalog |573| **[zoom-websockets](../websockets/SKILL.md)** | WebSocket event streaming |574| **[zoom-general](../general/SKILL.md)** | Cross-product patterns, community repos |575576---577578**Based on Zoom REST API v2 (current) and GraphQL v3 (beta)**579580## Environment Variables581582- See [references/environment-variables.md](references/environment-variables.md) for standardized `.env` keys and where to find each value.