Bodega

Skills › Productividad

build-zoom-rest-api-app

Reference skill for Zoom REST API. Use after choosing an API-based workflow when you need endpoint selection, resource-management patterns, OAuth requirements, rate-limit awareness, or API error debugging.

Descargar .zipVer en GitHub
Departamento
Productividad
Fuente
Oficial · anthropics/knowledge-work-plugins › zoom-plugin
Autor
Anthropic
Licencia
Apache-2.0
Idioma
Inglés
Riesgo
Medio

Señales de riesgo

Cómo instalarla en Claude

  1. Descargue el .zip sin descomprimirlo.
  2. En Claude active Configuración › Capacidades › Crear y editar archivos.
  3. Vaya a Personalizar › Skills › Crear skill › Subir una skill y elija el archivo.

Instrucciones completas (SKILL.md)

/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:

Reference:

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?

Building event-driven integrations?

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 | File and archive transcription via Build-platform JWT-authenticated endpoints |

Prerequisites

> Need help with authentication? See the [zoom-oauth](../oauth/SKILL.md) 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

⚠️ 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

⚠️ 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](../webhooks/SKILL.md) skill for comprehensive webhook implementation.

Complete Documentation Library

This skill includes comprehensive guides organized by category:

Core Concepts

Complete Examples

Troubleshooting

References (39 files covering all Zoom API domains)

Core APIs

Communication

Infrastructure

Advanced

Additional API Domains

Sample Repositories

Official (by Zoom)

| Type | Repository | |------|------------| | OAuth Sample | [oauth-sample-app](https://github.com/zoom/oauth-sample-app) | | S2S OAuth Starter | [server-to-server-oauth-starter-api](https://github.com/zoom/server-to-server-oauth-starter-api) | | User OAuth | [user-level-oauth-starter](https://github.com/zoom/user-level-oauth-starter) | | S2S Token | [server-to-server-oauth-token](https://github.com/zoom/server-to-server-oauth-token) | | Rivet Library | [rivet-javascript](https://github.com/zoom/rivet-javascript) | | WebSocket Sample | [websocket-js-sample](https://github.com/zoom/websocket-js-sample) | | Webhook Sample | [webhook-sample-node.js](https://github.com/zoom/webhook-sample-node.js) | | Python S2S | [server-to-server-python-sample](https://github.com/zoom/server-to-server-python-sample) |

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:

---

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

I want to manage users programmatically

I want to download recordings automatically

I want to receive real-time events

I want to use GraphQL instead of REST

I want to set up authentication

I'm hitting rate limits

I'm getting errors

I want to build webinars

I want to integrate Zoom Phone

---

Most Critical Documents

1. API Architecture (FOUNDATION)

[concepts/api-architecture.md](concepts/api-architecture.md)

Essential knowledge before making any API call:

2. Rate Limiting Strategy (MOST COMMON PRODUCTION ISSUE)

[concepts/rate-limiting-strategy.md](concepts/rate-limiting-strategy.md)

Rate limits are per-account, shared across all apps:

3. Meeting Lifecycle (MOST COMMON TASK)

[examples/meeting-lifecycle.md](examples/meeting-lifecycle.md)

Complete CRUD with webhook integration — the pattern most developers need first.

---

Key Learnings

Critical Discoveries:

---

Quick Reference

"401 Unauthorized"

→ [Authentication Flows](concepts/authentication-flows.md) - Token expired or wrong scopes

"429 Too Many Requests"

→ [Rate Limiting Strategy](concepts/rate-limiting-strategy.md) - Check headers for reset time

"Invalid token" when using userId

→ [API Architecture](concepts/api-architecture.md) - User OAuth apps must use me

"How do I paginate results?"

→ [Common Issues](troubleshooting/common-issues.md) - Use next_page_token

"Webhooks not arriving"

→ [Webhook Server](examples/webhook-server.md) - CRC validation required

"Recording download fails"

→ [Recording Pipeline](examples/recording-pipeline.md) - Bearer auth + follow redirects

"How do I create a meeting?"

→ [Meeting Lifecycle](examples/meeting-lifecycle.md) - Full working examples

---

Related Skills

| Skill | Use When | |-------|----------| | [zoom-oauth](../oauth/SKILL.md) | Implementing OAuth flows, token management | | [zoom-webhooks](../webhooks/SKILL.md) | Deep webhook implementation, event catalog | | [zoom-websockets](../websockets/SKILL.md) | WebSocket event streaming | | [zoom-general](../general/SKILL.md) | Cross-product patterns, community repos |

---

Based on Zoom REST API v2 (current) and GraphQL v3 (beta)

Environment Variables