Setup Zoom Webhooks
OpenAIOfficialCreated by ZoomDistributed by OpenAI
- Skill
- Tool integration
- Automation and integrations
- MIT
- No issues found
AutoGineer summary
Written by AutoGineer from the skill’s own files, not by the author
This skill provides a structured approach to building and maintaining Zoom webhook integrations. It covers the essential steps for event subscription, endpoint verification, security practices, and handling event delivery to ensure reliable processing of Zoom events.
What it does
- Outlines the process for identifying event types and resource scopes.
- Details requirements for endpoint and signature verification.
- Provides best practices for idempotent event handling.
- Suggests strategies for storing metadata to support debugging and replay protection.
- Offers guidance on separating ingestion from downstream processing.
- Lists common troubleshooting steps for webhook connectivity and validation.
When to use it
- When setting up a new integration to receive Zoom events via HTTP.
- When implementing security measures like signature verification for incoming payloads.
- When debugging issues with webhook delivery or endpoint validation.
- When designing the architecture for processing Zoom event streams.
Advantages
- Ensures secure communication through mandatory signature verification.
- Promotes robust integration design by recommending idempotent handlers.
- Provides a clear checklist for troubleshooting common configuration issues.
- Helps maintain data integrity by advising on raw event storage.
Usage examples
- “How do I verify a Zoom webhook request?”
- The agent explains the signature verification process, including the use of the webhook secret token to validate incoming payloads.
- “What should I do if my Zoom webhooks are not being received?”
- The agent provides a troubleshooting checklist covering endpoint reachability, TLS, validation tokens, and account-level settings.
Install
Download the skill as a ZIP:
https://mp-staging.autogineer.com/agent-skills/openai/setup-zoom-webhooks/downloadUnzip it into the cross-client skills folder of your project:
mkdir -p .agents/skills && unzip setup-zoom-webhooks.zip -d .agents/skills
Documentation by Zoom
Setup Zoom Webhooks
Use this skill when the integration receives Zoom events over HTTP. If the user needs persistent low-latency event streams, compare against setup-zoom-websockets.
Workflow
Identify the event types and resource scope before creating subscriptions.
Implement endpoint verification and signature verification before processing business logic.
Store raw event IDs, timestamps, and delivery metadata for replay protection and debugging.
Make handlers idempotent because Zoom can retry delivery.
Separate webhook ingestion from downstream API calls with a queue when reliability matters.
Debug by checking endpoint reachability, TLS, validation token handling, signature base string, app event subscription, and account-level settings.
References
Full preserved guide: references/full-guide.md
Signature verification: references/signature-verification.md
Subscriptions: references/subscriptions.md
Events: references/events.md
Common issues: troubleshooting/common-issues.md
Files
- ATTRIBUTION.mdAdded by AutoGineer874 B
- LICENSELicence file added by AutoGineer1.1 KiB
- RUNBOOK.md2.6 KiB
- SKILL.md1.2 KiB
- agents/openai.yaml144 B
- references/environment-variables.md642 B
- references/events.md1.9 KiB
- references/full-guide.md4.7 KiB
- references/signature-verification.md160 B
- references/subscriptions.md7.2 KiB
- references/verification.md2.1 KiB
- troubleshooting/common-issues.md1.2 KiB
references/subscriptions.md
Webhooks - Subscriptions
Configure webhook event subscriptions for real-time notifications.
Overview
Subscribe to Zoom events to receive real-time notifications at your endpoint. This enables:
Real-time meeting tracking (started, ended, participant changes)
Automated recording processing pipelines
User lifecycle management
Skill chaining: Combine REST API calls with event-driven workflows
Configuring Subscriptions
Method 1: Via Marketplace Portal (Recommended for Setup)
Go to your app in Marketplace
Navigate to Feature → Event Subscriptions
Add subscription name and endpoint URL
Select events to subscribe to
Save and activate
Method 2: Via API (Programmatic Management)
Use the Webhook Subscriptions API for programmatic subscription management.
Create Subscription
POST /webhooks/options{
"notification_endpoint_url": "https://your-server.com/zoom/webhook",
"events": [
"meeting.started",
"meeting.ended",
"meeting.participant_joined",
"recording.completed"
]
}Get Subscription
GET /webhooks/optionsResponse:
{
"notification_endpoint_url": "https://your-server.com/zoom/webhook",
"events": [
"meeting.started",
"meeting.ended",
"meeting.participant_joined",
"recording.completed"
]
}Update Subscription
PATCH /webhooks/options{
"events": [
"meeting.started",
"meeting.ended",
"recording.completed",
"user.created"
]
}Subscription Settings
| Setting | Description | Required |
|---|---|---|
| notification_endpoint_url | Your HTTPS endpoint (must be publicly accessible) | Yes |
| events | Array of event types to subscribe to | Yes |
Event Categories
Meeting Events
| Event | Trigger |
|---|---|
meeting.created | Meeting scheduled |
meeting.updated | Meeting settings changed |
meeting.deleted | Meeting deleted |
meeting.started | Meeting begins |
meeting.ended | Meeting ends |
meeting.participant_joined | Participant joins |
meeting.participant_left | Participant leaves |
meeting.sharing_started | Screen share begins |
meeting.sharing_ended | Screen share ends |
Recording Events
| Event | Trigger |
|---|---|
recording.started | Cloud recording begins |
recording.stopped | Cloud recording paused/stopped |
recording.paused | Cloud recording paused |
recording.resumed | Cloud recording resumed |
recording.completed | Recording processed and available |
recording.trashed | Recording moved to trash |
recording.deleted | Recording permanently deleted |
recording.recovered | Recording restored from trash |
User Events
| Event | Trigger |
|---|---|
user.created | New user added |
user.updated | User details changed |
user.deleted | User removed |
user.deactivated | User deactivated |
user.activated | User activated |
Webinar Events
| Event | Trigger |
|---|---|
webinar.created | Webinar scheduled |
webinar.started | Webinar begins |
webinar.ended | Webinar ends |
webinar.registration_created | New registration |
Subscription Object Schema
{
"notification_endpoint_url": "string (HTTPS URL)",
"events": ["array of event type strings"],
"secret_token": "string (for signature verification)"
}Code Examples
JavaScript - Express Webhook Handler with Subscription Check
const express = require('express');
const crypto = require('crypto');
const axios = require('axios');
const app = express();
app.use(express.json());
// Verify webhook signature
function verifyWebhookSignature(req, secret) {
const message = `v0:${req.headers['x-zm-request-timestamp']}:${JSON.stringify(req.body)}`;
const hashForVerify = crypto
.createHmac('sha256', secret)
.update(message)
.digest('hex');
const signature = `v0=${hashForVerify}`;
return signature === req.headers['x-zm-signature'];
}
// Handle webhook events
app.post('/zoom/webhook', (req, res) => {
const WEBHOOK_SECRET = process.env.ZOOM_WEBHOOK_SECRET;
if (!verifyWebhookSignature(req, WEBHOOK_SECRET)) {
return res.status(401).send('Unauthorized');
}
const { event, payload } = req.body;
switch (event) {
case 'meeting.started':
console.log(`Meeting started: ${payload.object.topic}`);
break;
case 'meeting.ended':
console.log(`Meeting ended: ${payload.object.uuid}`);
break;
case 'recording.completed':
processRecording(payload.object);
break;
}
res.status(200).send('OK');
});JavaScript - Manage Subscriptions via API
async function updateWebhookSubscription(accessToken, events) {
const response = await axios.patch(
'https://api.zoom.us/v2/webhooks/options',
{ events },
{
headers: {
'Authorization': `Bearer ${accessToken}`,
'Content-Type': 'application/json'
}
}
);
return response.data;
}
// Add new events to subscription
await updateWebhookSubscription(token, [
'meeting.started',
'meeting.ended',
'recording.completed',
'user.created', // New event
'user.deleted' // New event
]);Multiple Subscriptions
You can create multiple subscriptions to:
Send different events to different endpoints
Separate production and development endpoints
Organize by event type
Route events to different microservices
Skill Chaining
Webhooks are commonly combined with REST API in skill chains:
| Chain | Pattern | Use Case |
|---|---|---|
| REST API → Webhooks | Create meeting, subscribe to events | Track meeting lifecycle |
| Webhooks → REST API | Receive event, fetch details | Recording download on completion |
| Users API → Webhooks | Create user, subscribe to user events | User lifecycle tracking |
Example: Meeting creation with event tracking
// Step 1: Subscribe to meeting events (one-time setup)
await updateWebhookSubscription(token, ['meeting.started', 'meeting.ended']);
// Step 2: Create meeting via REST API
const meeting = await createMeeting(token, { topic: 'Team Standup', type: 2 });
// Step 3: When meeting.started webhook arrives, track it
// Step 4: When meeting.ended webhook arrives, process attendanceSee meeting-details-with-events.md for complete skill chaining patterns.
Testing Webhooks
Local development: Use ngrok to expose local endpoint
ngrok http 3000Webhook logs: Check Marketplace portal → App → Webhooks → Logs
Test endpoint: Validate signature handling before going live
Retry behavior: Zoom retries failed webhooks (5xx responses) up to 3 times
Required Scopes
| Scope | Operations |
|---|---|
webhook:read:admin | View webhook settings |
webhook:write:admin | Modify webhook settings |
Resources
Webhooks overview: https://developers.zoom.us/docs/api/rest/webhook-reference/
Event types: https://developers.zoom.us/docs/api/rest/reference/zoom-api/events/
Signature verification: See signature-verification.md
Requirements and compatibility
Written for: OpenAI Codex
Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta
“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.
Security
No issues found by our static scan· No issues found
A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.
Attribution and licence
- Created by
- Zoom
- Publisher
- OpenAI (Official)
- Distributed by
- OpenAI
- Source
- openai/plugins · plugins/zoom/skills/webhooks · commit d420d13
- Licence
- MIT License (redistribution allowed)
- LICENSE (added by AutoGineer from plugins/zoom/LICENSE)
- ATTRIBUTION.md (written by AutoGineer)
- Synced
AutoGineer is not affiliated with or endorsed by Zoom or OpenAI.
Download ZIP
The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download setup-zoom-webhooks.zip