Skip to main content
skill Claude Code CX Codex Cursor GitHub Copilot official · Anthropic

setup-zoom-webhooks — Claude Code skill: install

A reference for Zoom webhooks, covering subscriptions, signature checks, and event delivery. Use it when building an HTTP integration with Zoom.

Install into Claude Code · Skills CLI (Vercel) All methods and platforms ↓
npx skills add anthropics/knowledge-work-plugins --skill setup-zoom-webhooks -a claude-code
npx skills add anthropics/knowledge-work-plugins --skill webhooks -a claude-code
Open on GitHub

What setup-zoom-webhooks does

This skill covers Zoom event delivery over HTTP after an event-driven workflow has been selected. It explains subscriptions, event-type selection, signature verification, webhook handling, and delivery retries. The reference includes common events such as meetings starting or ending, participants joining, recordings becoming ready, and users being created.

The included Express.js example captures the raw request body, reads x-zm-signature and x-zm-request-timestamp, builds an HMAC SHA-256 value, and rejects an invalid signature. Supporting material covers event types, subscription APIs, URL validation, environment variables, and troubleshooting for retries and verification failures.

You need a Zoom app with Event Subscriptions enabled, an HTTPS endpoint, and a webhook secret token. For the reader, the raw-body requirement matters: re-serializing the JSON before verification can invalidate the signature.

What it helps with

  • verify an incoming Zoom webhook signature
  • select event types for a Zoom subscription
  • receive events and return an HTTP response
  • handle repeated webhook deliveries
  • debug URL validation and signature failures

Example prompts for the agent

  • Set up an `Express.js` Zoom webhook handler that checks `x-zm-signature` and `x-zm-request-timestamp`.
  • Show how to subscribe to `recording.completed` and process a completed cloud recording.
  • Investigate a failed Zoom webhook signature check and verify that the raw request body is preserved.

How to install setup-zoom-webhooks

1Skills CLI (Vercel)

npx skills add anthropics/knowledge-work-plugins --skill setup-zoom-webhooks -a claude-code
npx skills add anthropics/knowledge-work-plugins --skill webhooks -a claude-code

2Manually: put the files in place

~/.claude/skills/webhooks/SKILL.md

Copy the whole skill folder; for one project use .claude/skills/webhooks/

From the same set133

The whole set →
data-visualization official anthropics Selects chart types based on data structure and produces Python visualization code in matplotlib, seaborn, and plotly. Useful for reports and research figures. Claude Code CX Codex Cursor +1 13,700installs documentation official anthropics A skill for technical writing that drafts READMEs, API references, runbooks, architecture docs and onboarding guides. Useful when the code exists but the description does not. Claude Code CX Codex Cursor +1 10,300installs build-dashboard official anthropics Builds a self-contained HTML dashboard with Chart.js charts, KPI cards, and filterable tables. Useful for turning raw data or queries into a standalone browser report. Claude Code CX Codex Cursor +1 9,100installs memory-management official anthropics This skill organizes workplace shorthand, names, and project details into files an agent can consult. It fits projects where requests rely on an internal vocabulary and shared context. Claude Code CX Codex Cursor +1 7,400installs task-management official anthropics Tracks commitments, active work, and follow-ups in a local TASKS.md file. Useful when managing project to-dos directly from the AI coding chat. Claude Code CX Codex Cursor +1 7,200installs architecture official anthropics Writes an Architecture Decision Record or reviews a system design: options, trade-offs, consequences. Useful when you have to pick between technologies. Claude Code CX Codex Cursor +1 6,700installs knowledge-synthesis official anthropics Merges search results across chats, emails, and documents into deduplicated answers with source attribution. Flags conflicting facts and scores source reliability. Claude Code CX Codex Cursor +1 6,400installs testing-strategy official anthropics This skill designs testing strategies and test plans for a project. Use it when you need test types, coverage goals, or gaps in existing checks. Claude Code CX Codex Cursor +1 6,400installs

Similar

prisma-compute prisma Skill for deploying TypeScript apps to Prisma Compute via Prisma 8 CLI. Manage deployments, versions, environment variables, and custom domains from your editor. Claude Code CX Codex Cursor +1 370,000installs prisma-mongodb-upgrade prisma Decision guide for Prisma ORM MongoDB projects on v6 to navigate the lack of Prisma 7 support and evaluate moving to Prisma 8. Claude Code CX Codex Cursor +1 368,500installs neon-postgres neondatabase This skill guides agents through Neon Postgres connections, schema changes, branching, and database checks. Use it when working with an existing schema or DATABASE_URL. Claude Code CX Codex Cursor +1 278,200installs cmux-billing manaflow-ai Runbook for cmux billing architecture covering Stripe Checkout, subscription tiers, webhooks, and entitlement overrides during backend development. Claude Code CX Codex Cursor +1 3,700installs mcp-builder official anthropics This skill walks through building an MCP server in TypeScript or Python, from reading the protocol spec to writing tests and evaluation questions. Claude Code Claude.ai 130,949installs google-agents-cli-adk-code official Google A reference skill for building ADK agents with tools, callbacks, state, and workflows. Use it when an agent project needs concrete API patterns or code examples. Claude Code CX Codex Cursor +1 511,400installs lark-im larksuite This skill lets an agent work with Lark IM messages, chats, files, and interactive cards. Use it when coding tasks need access to team conversations. Claude Code CX Codex Cursor +1 472,300installs lark-event larksuite Listens to Lark/Feishu events and streams them as NDJSON. Use it for bots, message processing, and long-running subscribers. Claude Code CX Codex Cursor +1 466,200installs

Questions about setup-zoom-webhooks

How do I install setup-zoom-webhooks in Claude Code?

Run npx skills add anthropics/knowledge-work-plugins --skill setup-zoom-webhooks -a claude-code, then run npx skills add anthropics/knowledge-work-plugins --skill webhooks -a claude-code. The installed file is at ~/.claude/skills/webhooks/SKILL.md.

What does setup-zoom-webhooks do?

It documents Zoom webhook subscriptions, event selection, HMAC signature verification, and delivery handling. It also includes an Express.js handler example and reference material.

What do I need before using Zoom webhooks?

Prepare a Zoom app with Event Subscriptions enabled, an HTTPS endpoint that receives webhooks, and a webhook secret token for verification.

Source text

SKILL.md · Apache-2.0
---
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](../oauth/SKILL.md)** skill for OAuth setup.

## Quick Start

```javascript
// 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](references/events.md)** - Complete event types reference
- **[references/verification.md](references/verification.md)** - Webhook URL validation
- **[references/subscriptions.md](references/subscriptions.md)** - Event subscriptions API

## Troubleshooting

- **[RUNBOOK.md](RUNBOOK.md)** - 5-minute preflight checks before deep debugging
- **[troubleshooting/common-issues.md](troubleshooting/common-issues.md)** - Signature verification, retries, URL validation

## Sample Repositories

### Official (by Zoom)

| Type | Repository | Stars |
|------|------------|-------|
| Node.js | [webhook-sample](https://github.com/zoom/webhook-sample) | 34 |
| PostgreSQL | [webhook-to-postgres](https://github.com/zoom/webhook-to-postgres) | 5 |
| Go/Fiber | [Go-Webhooks](https://github.com/zoom/Go-Webhooks) | - |
| Header Auth | [zoom-webhook-verification-headers](https://github.com/zoom/zoom-webhook-verification-headers) | - |

### Community

| Language | Repository | Description |
|----------|------------|-------------|
| Laravel | [binary-cats/laravel-webhooks](https://github.com/binary-cats/laravel-webhooks) | Laravel webhook handler |
| AWS Lambda | [splunk/zoom-webhook-to-hec](https://github.com/splunk/zoom-webhook-to-hec) | Serverless to Splunk HEC |
| Node.js | [Will4950/zoom-webhook-listener](https://github.com/Will4950/zoom-webhook-listener) | Webhook forwarder |
| Express+Redis | [ojusave/eventSubscriptionPlayground](https://github.com/ojusave/eventSubscriptionPlayground) | Socket.io + Redis |

### Multi-Language Samples (by tanchunsiong)

| Language | Repository |
|----------|------------|
| Node.js | [Zoom-Webhook-Signature-OAuth-and-REST-API-Development-Sample-In-NodeJS](https://github.com/tanchunsiong/Zoom-Webhook-Signature-OAuth-and-REST-API-Development-Sample-In-NodeJS) |
| C# | [Zoom-Webhook-Signature-OAuth-and-REST-API-Development-Sample-In-ASP.NET-Core-C-](https://github.com/tanchunsiong/Zoom-Webhook-Signature-OAuth-and-REST-API-Development-Sample-In-ASP.NET-Core-C-) |
| Java | [Zoom-Webhook-Signature-OAuth-and-REST-API-Development-Sample-In-Java-Spring-Boot](https://github.com/tanchunsiong/Zoom-Webhook-Signature-OAuth-and-REST-API-Development-Sample-In-Java-Spring-Boot) |
| Python | [Zoom-Webhook-Signature-OAuth-and-REST-API-Development-Sample-In-Python](https://github.com/tanchunsiong/Zoom-Webhook-Signature-OAuth-and-REST-API-Development-Sample-In-Python) |
| PHP | [Zoom-Webhook-Signature-OAuth-and-REST-API-Development-Sample-In-PHP](https://github.com/tanchunsiong/Zoom-Webhook-Signature-OAuth-and-REST-API-Development-Sample-In-PHP) |

**Full list**: See [general/references/community-repos.md](../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](references/environment-variables.md) for standardized `.env` keys and where to find each value.

© anthropics · Apache-2.0 · anthropics/knowledge-work-plugins

See also

Project sponsors

Companies that keep this analytics open
Gold sponsor

Impressions, clicks and code copies — open statistics. We keep the numbers public for the same reason NeBlask itself is public. Become a sponsor