Вебхуки Zoom: приём событий
Справочник по вебхукам Zoom: как подписаться на события встреч и записей, проверить подпись запроса и обработать доставку.
- Что делает
- Справочник по вебхукам Zoom: как подписаться на события встреч и записей, проверить подпись запроса и обработать доставку.
- Когда брать
- Когда нужно, чтобы ваш сервис автоматически получал события Zoom: начало и конец встречи, вход участников, готовую запись.
- Когда не брать
- Если нужна постоянная связь с минимальной задержкой без публичного адреса: тогда смотри скилл про WebSockets.
- Пример запроса
- Настрой приём вебхуков Zoom с проверкой подписи, чтобы после каждой встречи мы получали уведомление о готовой записи.
- Нужно подключить
- терминал
Входит в плагин zoom-plugin. В Cowork и Claude Code можно поставить плагин целиком.
Как включить
- Скачайте архив и распакуйте его.
- Положите папку
setup-zoom-webhooksв~/.claude/skills/. - Откройте Claude Code и опишите задачу своими словами: Claude подхватит скилл по описанию.
Текст
---
name: setup-zoom-webhooks
description: Справочный скилл по вебхукам Zoom. Используй после маршрутизации в событийный рабочий процесс, когда реализуешь подписки, проверку подписи, обработку доставки, повторные попытки или выбор типов событий.
triggers:
- "zoom webhook"
- "webhook signature"
- "x-zm-signature"
- "event subscription"
- "recording completed webhook"
---
/setup-zoom-webhooks
Справочный материал о доставке событий Zoom по HTTP. Сначала обращайся к скиллам рабочих процессов, а этот файл используй за подробностями о проверке, подписках и доставке.
Предварительные требования
- Приложение Zoom с включёнными подписками на события (Event Subscriptions)
- HTTPS-адрес для приёма вебхуков
- Секретный токен вебхука для проверки подписи
Нужна помощь с аутентификацией? Настройку OAuth смотри в скилле [zoom-oauth](../oauth/SKILL.md).
Быстрый старт
// 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();
});
Частые события
| Событие | Описание |
|---|---|
meeting.started | Встреча началась |
meeting.ended | Встреча закончилась |
meeting.participant_joined | Участник вошёл во встречу |
recording.completed | Облачная запись готова |
user.created | Добавлен новый пользователь |
Подробные справочники
- [references/events.md](references/events.md) - Полный справочник типов событий
- [references/verification.md](references/verification.md) - Проверка адреса вебхука
- [references/subscriptions.md](references/subscriptions.md) - API подписок на события
Устранение неполадок
- [RUNBOOK.md](RUNBOOK.md) - Пятиминутная предварительная проверка перед глубокой отладкой
- [troubleshooting/common-issues.md](troubleshooting/common-issues.md) - Проверка подписи, повторные попытки, проверка адреса
Примеры репозиториев
Официальные (от Zoom)
| Тип | Репозиторий | Звёзды |
|---|---|---|
| Node.js | webhook-sample | 34 |
| PostgreSQL | webhook-to-postgres | 5 |
| Go/Fiber | Go-Webhooks | - |
| Header Auth | zoom-webhook-verification-headers | - |
Сообщество
| Язык | Репозиторий | Описание |
|---|---|---|
| Laravel | binary-cats/laravel-webhooks | Обработчик вебхуков для Laravel |
| AWS Lambda | splunk/zoom-webhook-to-hec | Бессерверная передача в Splunk HEC |
| Node.js | Will4950/zoom-webhook-listener | Пересылка вебхуков |
| Express+Redis | ojusave/eventSubscriptionPlayground | Socket.io + Redis |
Примеры на разных языках (автор tanchunsiong)
Полный список: см. [general/references/community-repos.md](../general/references/community-repos.md)
Ресурсы
- Документация по вебхукам: https://developers.zoom.us/docs/api/webhooks/
- Справочник событий: https://developers.zoom.us/docs/api/rest/reference/zoom-api/events/
- Форум разработчиков: https://devforum.zoom.us/
Переменные окружения
- Стандартизированные ключи
.envи где найти каждое значение — в [references/environment-variables.md](references/environment-variables.md).
Перевод: iiuniversitet. Оригинал: https://github.com/anthropics/knowledge-work-plugins/tree/main/partner-built/zoom-plugin/skills/webhooks, лицензия MIT. Изменения: перевод на русский язык.
Оригинал на английском
---
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/knowledge-work-plugins / zoom-plugin / setup-zoom-webhooks ↗. Ссылка проверена 2026-10-10.