setup-zoom-webhooks
anthropics/knowledge-work-plugins
Reference for implementing Zoom webhooks with signature verification and event subscriptions.
What is setup-zoom-webhooks?
This skill provides reference documentation for setting up Zoom event-driven webhooks over HTTPS. Use it after routing to an event workflow to implement webhook signature verification, subscription management, delivery handling, and event-type selection.
- Verify webhook signatures using HMAC-SHA256 and x-zm-signature headers
- Handle common Zoom events (meeting lifecycle, participant joins, recording completion, user creation)
- Implement HTTPS endpoint configuration for webhook delivery
- Manage event subscriptions and filtering
- Implement retry and delivery handling patterns
How to install setup-zoom-webhooks
npx skills add https://github.com/anthropics/knowledge-work-plugins --skill setup-zoom-webhooks- Zoom app with Event Subscriptions enabled
- HTTPS endpoint to receive webhooks
- Webhook secret token for signature verification
How to use setup-zoom-webhooks
- 1.Set up an HTTPS endpoint (e.g., Express.js route) to receive POST requests
- 2.Extract x-zm-signature and x-zm-request-timestamp headers from incoming requests
- 3.Reconstruct the payload as v0:timestamp:body and compute HMAC-SHA256 hash using your webhook secret
- 4.Compare computed hash against the signature header; reject if mismatch
- 5.Parse the event type and payload from req.body and route to appropriate handler
- 6.Return HTTP 200 to acknowledge receipt; implement retry logic for transient failures
Use cases
- Trigger automated workflows when Zoom meetings start, end, or participants join
- Process cloud recordings automatically when recording.completed events fire
- Log and audit Zoom user creation events in real-time
- Build event-driven integrations that respond to Zoom meeting state changes
- Validate webhook authenticity before processing events
- Backend engineers building Zoom integrations
- DevOps engineers setting up event-driven workflows
- Full-stack developers implementing meeting automation
- Integration architects designing Zoom-connected systems
setup-zoom-webhooks FAQ
Extract the x-zm-signature and x-zm-request-timestamp headers, construct the payload as v0:timestamp:body, compute HMAC-SHA256 using your webhook secret, and compare the result against the signature header prefixed with v0=.
Common events include meeting.started, meeting.ended, meeting.participant_joined, recording.completed, and user.created. See the complete event types reference in references/events.md.
Webhooks use a separate secret token for verification, not OAuth. See the zoom-oauth skill if you need to authenticate API calls separately.
Zoom will retry failed deliveries. Always return HTTP 200 to acknowledge receipt, even if you process asynchronously. See troubleshooting/common-issues.md for retry patterns.
You need an HTTPS endpoint accessible from the internet. Use ngrok or similar tunneling tools to expose a local server, or deploy to a staging environment first.
Full instructions (SKILL.md)
Source of truth, from anthropics/knowledge-work-plugins.
name: setup-zoom-webhooks description: Reference skill for Zoom webhooks. Use after routing to an event-driven workflow when implementing subscriptions, signature verification, delivery handling, retries, or event-type selection. triggers:
- "zoom webhook"
- "webhook signature"
- "x-zm-signature"
- "event subscription"
- "recording completed webhook"
/setup-zoom-webhooks
Background reference for Zoom event delivery over HTTP. Prefer workflow skills first, then use this file for verification, subscription, and delivery details.
Prerequisites
- Zoom app with Event Subscriptions enabled
- HTTPS endpoint to receive webhooks
- Webhook secret token for verification
Need help with authentication? See the zoom-oauth skill for OAuth setup.
Quick Start
// Express.js webhook handler
const crypto = require('crypto');
// Capture raw body for signature verification (avoid re-serializing JSON).
app.use(require('express').json({
verify: (req, _res, buf) => { req.rawBody = buf; }
}));
app.post('/webhook', (req, res) => {
// Verify webhook signature
const signature = req.headers['x-zm-signature'];
const timestamp = req.headers['x-zm-request-timestamp'];
const body = req.rawBody ? req.rawBody.toString('utf8') : JSON.stringify(req.body);
const payload = `v0:${timestamp}:${body}`;
const hash = crypto.createHmac('sha256', WEBHOOK_SECRET)
.update(payload).digest('hex');
if (signature !== `v0=${hash}`) {
return res.status(401).send('Invalid signature');
}
// Handle event
const { event, payload } = req.body;
console.log(`Received: ${event}`);
res.status(200).send();
});
Common Events
| Event | Description |
|---|---|
meeting.started | Meeting has started |
meeting.ended | Meeting has ended |
meeting.participant_joined | Participant joined meeting |
recording.completed | Cloud recording ready |
user.created | New user added |
Detailed References
- references/events.md - Complete event types reference
- references/verification.md - Webhook URL validation
- references/subscriptions.md - Event subscriptions API
Troubleshooting
- RUNBOOK.md - 5-minute preflight checks before deep debugging
- troubleshooting/common-issues.md - Signature verification, retries, URL validation
Sample Repositories
Official (by Zoom)
| Type | Repository | Stars |
|---|---|---|
| Node.js | webhook-sample | 34 |
| PostgreSQL | webhook-to-postgres | 5 |
| Go/Fiber | Go-Webhooks | - |
| Header Auth | zoom-webhook-verification-headers | - |
Community
| Language | Repository | Description |
|---|---|---|
| Laravel | binary-cats/laravel-webhooks | Laravel webhook handler |
| AWS Lambda | splunk/zoom-webhook-to-hec | Serverless to Splunk HEC |
| Node.js | Will4950/zoom-webhook-listener | Webhook forwarder |
| Express+Redis | ojusave/eventSubscriptionPlayground | Socket.io + Redis |
Multi-Language Samples (by tanchunsiong)
Full list: See general/references/community-repos.md
Resources
- Webhook docs: https://developers.zoom.us/docs/api/webhooks/
- Event reference: https://developers.zoom.us/docs/api/rest/reference/zoom-api/events/
- Developer forum: https://devforum.zoom.us/
Environment Variables
- See references/environment-variables.md for standardized
.envkeys and where to find each value.
Related skills
More from anthropics/knowledge-work-plugins and the wider catalog.

setup-zoom-websockets
Set up persistent Zoom WebSocket connections for low-latency event delivery as an alternative to webhooks.

signature-request
Prepare and route documents for e-signature with pre-flight checks and signing order configuration.

single-cell-rna-qc
Automated QC for single-cell RNA-seq data with MAD-based filtering and scverse best practices.

slack-messaging
Guidance for composing well-formatted, effective Slack messages using mrkdwn syntax

slack-search
Find messages, files, channels, and people in Slack with effective search strategies and modifiers.

smb-onboard
Onboard SMB owners in 15–20 minutes: connect tools, run a proof-of-value recipe, capture business context, and set a weekly rhythm.