zoom

Zoom API for managing meetings, webinars, cloud recordings, and user data. Use when user mentions "Zoom", "Zoom meeting", "join URL", "cloud recording", or "webinar".

50 stars

Best use case

zoom is best used when you need a repeatable AI agent workflow instead of a one-off prompt.

Zoom API for managing meetings, webinars, cloud recordings, and user data. Use when user mentions "Zoom", "Zoom meeting", "join URL", "cloud recording", or "webinar".

Teams using zoom should expect a more consistent output, faster repeated execution, less prompt rewriting.

When to use this skill

  • You want a reusable workflow that can be run more than once with consistent structure.

When not to use this skill

  • You only need a quick one-off answer and do not need a reusable workflow.
  • You cannot install or maintain the underlying files, dependencies, or repository context.

Installation

Claude Code / Cursor / Codex

$curl -o ~/.claude/skills/zoom/SKILL.md --create-dirs "https://raw.githubusercontent.com/vm0-ai/vm0-skills/main/zoom/SKILL.md"

Manual Installation

  1. Download SKILL.md from GitHub
  2. Place it in .claude/skills/zoom/SKILL.md inside your project
  3. Restart your AI agent — it will auto-discover the skill

How zoom Compares

Feature / AgentzoomStandard Approach
Platform SupportNot specifiedLimited / Varies
Context Awareness High Baseline
Installation ComplexityUnknownN/A

Frequently Asked Questions

What does this skill do?

Zoom API for managing meetings, webinars, cloud recordings, and user data. Use when user mentions "Zoom", "Zoom meeting", "join URL", "cloud recording", or "webinar".

Where can I find the source code?

You can find the source code on GitHub using the link provided at the top of the page.

SKILL.md Source

## Troubleshooting

If requests fail, run `zero doctor check-connector --env-name ZOOM_TOKEN` or `zero doctor check-connector --url https://api.zoom.us/v2/users/me --method GET`

## How to Use

Base URL: `https://api.zoom.us/v2`

All calls use `Authorization: Bearer $ZOOM_TOKEN`. The token is a short-lived (1 hour) OAuth access token — vm0 refreshes it automatically; skills never need to touch refresh tokens.

The `me` keyword can be substituted for a user ID when the authenticated user is the target (e.g. `/users/me/meetings`).

## Users

### Get Current User

```bash
curl -s "https://api.zoom.us/v2/users/me" --header "Authorization: Bearer $ZOOM_TOKEN" | jq '{id, email, first_name, last_name, account_id, type}'
```

### Get a User

```bash
curl -s "https://api.zoom.us/v2/users/<user-id>" --header "Authorization: Bearer $ZOOM_TOKEN" | jq '{id, email, first_name, last_name, type}'
```

## Meetings

### List Meetings

List meetings scheduled for the authenticated user. `type` can be `scheduled` (default), `live`, `upcoming`, `upcoming_meetings`, or `previous_meetings`.

```bash
curl -s "https://api.zoom.us/v2/users/me/meetings?type=upcoming&page_size=30" --header "Authorization: Bearer $ZOOM_TOKEN" | jq '.meetings[] | {id, topic, start_time, duration, join_url}'
```

### Get a Meeting

```bash
curl -s "https://api.zoom.us/v2/meetings/<meeting-id>" --header "Authorization: Bearer $ZOOM_TOKEN" | jq '{id, topic, start_time, duration, join_url, start_url, status, agenda, settings}'
```

### Create a Meeting

Meeting `type` values: `1` (instant), `2` (scheduled), `3` (recurring, no fixed time), `8` (recurring, fixed time).

Write to `/tmp/zoom_meeting.json`:

```json
{
  "topic": "Weekly sync",
  "type": 2,
  "start_time": "2026-05-01T10:00:00Z",
  "duration": 30,
  "timezone": "UTC",
  "agenda": "Review progress and blockers",
  "settings": {
    "join_before_host": true,
    "mute_upon_entry": true,
    "waiting_room": false,
    "auto_recording": "cloud"
  }
}
```

```bash
curl -s -X POST "https://api.zoom.us/v2/users/me/meetings" --header "Authorization: Bearer $ZOOM_TOKEN" --header "Content-Type: application/json" -d @/tmp/zoom_meeting.json | jq '{id, topic, start_time, join_url, start_url}'
```

### Update a Meeting

Zoom uses `PATCH` and only sends fields that changed. Write to `/tmp/zoom_meeting_update.json`:

```json
{
  "topic": "Weekly sync — rescheduled",
  "start_time": "2026-05-01T11:00:00Z",
  "duration": 45
}
```

```bash
curl -s -X PATCH "https://api.zoom.us/v2/meetings/<meeting-id>" --header "Authorization: Bearer $ZOOM_TOKEN" --header "Content-Type: application/json" -d @/tmp/zoom_meeting_update.json
```

Returns HTTP 204 with an empty body on success.

### Delete a Meeting

```bash
curl -s -X DELETE "https://api.zoom.us/v2/meetings/<meeting-id>" --header "Authorization: Bearer $ZOOM_TOKEN"
```

### End a Live Meeting

Set `action` to `end` to force-end an in-progress meeting.

Write to `/tmp/zoom_meeting_status.json`:

```json
{
  "action": "end"
}
```

```bash
curl -s -X PUT "https://api.zoom.us/v2/meetings/<meeting-id>/status" --header "Authorization: Bearer $ZOOM_TOKEN" --header "Content-Type: application/json" -d @/tmp/zoom_meeting_status.json
```

## Past Meeting Data

### List Past Meeting Participants

```bash
curl -s "https://api.zoom.us/v2/past_meetings/<meeting-uuid>/participants?page_size=100" --header "Authorization: Bearer $ZOOM_TOKEN" | jq '.participants[] | {id, name, user_email, join_time, leave_time, duration}'
```

The UUID is the `uuid` field from the meeting record, URL-encoded. If it contains `/` or `//`, encode twice.

### Get Past Meeting Summary

```bash
curl -s "https://api.zoom.us/v2/past_meetings/<meeting-uuid>" --header "Authorization: Bearer $ZOOM_TOKEN" | jq '{id, uuid, topic, start_time, end_time, participants_count, total_minutes}'
```

## Cloud Recordings

### List User Recordings

Required query parameters: `from` and `to` (ISO date strings). Lists recordings created within the date range (max 30 days).

```bash
curl -s "https://api.zoom.us/v2/users/me/recordings?from=2026-04-01&to=2026-04-30&page_size=30" --header "Authorization: Bearer $ZOOM_TOKEN" | jq '.meetings[] | {id, uuid, topic, start_time, recording_count, share_url}'
```

### Get Recordings for a Meeting

```bash
curl -s "https://api.zoom.us/v2/meetings/<meeting-id>/recordings" --header "Authorization: Bearer $ZOOM_TOKEN" | jq '{id, topic, recording_files: [.recording_files[] | {id, file_type, recording_type, download_url, play_url, status}]}'
```

`download_url` requires appending `?access_token=$ZOOM_TOKEN` (or a dedicated download token) to authenticate the download.

### Get Recording Transcript

If Zoom AI Companion or cloud recording transcripts are enabled, the transcript appears in `recording_files` with `file_type: "TRANSCRIPT"`. Download it via the file's `download_url`.

```bash
curl -s "https://api.zoom.us/v2/meetings/<meeting-id>/recordings" --header "Authorization: Bearer $ZOOM_TOKEN" | jq '.recording_files[] | select(.file_type == "TRANSCRIPT") | {id, download_url}'
```

## Webinars

### List Webinars

```bash
curl -s "https://api.zoom.us/v2/users/me/webinars?page_size=30" --header "Authorization: Bearer $ZOOM_TOKEN" | jq '.webinars[] | {id, topic, start_time, duration, join_url}'
```

### Get a Webinar

```bash
curl -s "https://api.zoom.us/v2/webinars/<webinar-id>" --header "Authorization: Bearer $ZOOM_TOKEN" | jq '{id, topic, start_time, duration, join_url, registration_url}'
```

## Common Patterns

### Find the Most Recent Cloud Recording

```bash
curl -s "https://api.zoom.us/v2/users/me/recordings?from=2026-04-01&to=2026-04-30&page_size=1" --header "Authorization: Bearer $ZOOM_TOKEN" | jq '.meetings[0] | {id, uuid, topic, start_time, recording_files: [.recording_files[] | {file_type, recording_type, download_url}]}'
```

### Get the Join URL for the Next Scheduled Meeting

```bash
curl -s "https://api.zoom.us/v2/users/me/meetings?type=upcoming&page_size=1" --header "Authorization: Bearer $ZOOM_TOKEN" | jq '.meetings[0] | {topic, start_time, join_url}'
```

## Guidelines

1. **Meeting ID vs UUID**: Numeric meeting IDs identify a series; UUIDs identify a specific instance. Past-meeting endpoints (`/past_meetings/...`) require the UUID, and UUIDs containing `/` must be URL-encoded (double-encoded if they start with `/` or contain `//`).
2. **Pagination**: Responses include `next_page_token` when more pages exist. Pass it back as a query parameter to fetch subsequent pages. `page_size` defaults to 30, max 300 for most endpoints.
3. **Date ranges**: `/recordings` and historical endpoints cap ranges at 30 days. Split longer ranges into multiple calls.
4. **Timezones**: `start_time` in requests should be UTC (trailing `Z`) unless `timezone` is also provided. Responses always use UTC.
5. **Downloading recordings**: `download_url` is not bearer-authenticated — append `?access_token=$ZOOM_TOKEN` as a query parameter or request a short-lived download token. Do NOT send `Authorization: Bearer` for the file download itself.
6. **Rate limits**: Meeting-create endpoints are Light (≤20 req/s); recording list endpoints are Heavy (≤20 req/min). Back off on HTTP 429 using the `Retry-After` header.
7. **API version**: All endpoints use `/v2`. Older `/v1` endpoints are deprecated and return 404.

## API Reference

- REST API index: https://developers.zoom.us/docs/api/
- Meetings: https://developers.zoom.us/docs/api/meetings/
- Cloud Recording: https://developers.zoom.us/docs/api/cloud-recording/
- Webinars: https://developers.zoom.us/docs/api/webinars/
- Users: https://developers.zoom.us/docs/api/users/
- OAuth scopes reference: https://developers.zoom.us/docs/integrations/oauth-scopes/

Related Skills

zeptomail

50
from vm0-ai/vm0-skills

ZeptoMail API for transactional email. Use when user mentions "ZeptoMail", "transactional email", "send email", or Zoho email.

zep

50
from vm0-ai/vm0-skills

Zep API for long-term memory and conversation history management in AI agents. Use when user mentions "Zep", "conversation memory", "session memory", "memory search", "user facts", "agent memory", or "long-term memory".

zendesk

50
from vm0-ai/vm0-skills

Zendesk API for customer support. Use when user mentions "Zendesk", "support ticket", "customer service", or help desk.

zapsign

50
from vm0-ai/vm0-skills

ZapSign API for e-signatures. Use when user mentions "ZapSign", "e-signature", "sign document", or Brazilian e-signature.

zapier

50
from vm0-ai/vm0-skills

Zapier API for workflow automation. Use when user mentions "Zapier", "zap", "automation", or asks about connecting apps.

youtube

50
from vm0-ai/vm0-skills

YouTube API for videos and channels. Use when user mentions "YouTube", "youtube.com", "youtu.be", shares a video link, "channel stats", or asks about video content.

xero

50
from vm0-ai/vm0-skills

Xero API for accounting. Use when user mentions "Xero", "accounting", "invoices", "bookkeeping", or asks about financial management.

x

50
from vm0-ai/vm0-skills

X (Twitter) API for tweets and profiles. Use when user mentions "X", "Twitter", "x.com", "twitter.com", shares a tweet link, "check X", or asks about social media posts.

wrike

50
from vm0-ai/vm0-skills

Wrike API for project management. Use when user mentions "Wrike", "wrike.com", shares a Wrike link, "Wrike task", or asks about Wrike workspace.

workos

50
from vm0-ai/vm0-skills

WorkOS API for enterprise SSO, SCIM directory sync, RBAC fine-grained authorization, and audit logs. Use when user mentions "WorkOS", "SSO", "SAML", "SCIM", "directory sync", "enterprise authentication", "audit log", or "fine-grained authorization".

workflow-migration

50
from vm0-ai/vm0-skills

VM0 migration helper for Claude Code workflows. Use when user says "migrate to VM0", "move to VM0", "convert skill to VM0", or asks about migrating local Claude Code workflows.

wix

50
from vm0-ai/vm0-skills

Wix API for website management. Use when user mentions "Wix", "wix.com", "wixsite.com", shares a Wix link, "Wix site", or asks about Wix CMS.