通过托管 OAuth 调用 Zoom Admin API,管理用户、会议和 Webinar。
文档
Zoom
试用通过 OAuth 网关调度与管理 Zoom 会议、研讨会与云录制。
它能做什么
覆盖 Zoom 用户资料、会议(列表、创建、修改、删除、报名者、历史参会者)、云录制和研讨会等接口。所有请求都经过托管 OAuth 网关转发,调用方只需在 Authorization 头带上 MATON_API_KEY,Zoom 的 OAuth Token 由网关自动注入。分页采用基于 cursor 的方式,每页最多 300 条;存在多个 Zoom 连接时,可通过 Maton-Connection 头显式指定。研讨会相关接口要求目标 Zoom 账户开通 Webinar 增值插件,并且该技能默认要求在执行任何写入或破坏性操作前先与用户确认。
什么时候用它
- 创建一场 Zoom 会议并返回加入链接
- 按日期范围列出云录制
- 创建或修改一场 Webinar
- 查询当前登录的 Zoom 用户信息
技能文档
Zoom
Access the Zoom API with managed OAuth authentication. Manage meetings, webinars, cloud recordings, and user profiles.
Quick Start
# Get current user profile
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://gateway.maton.ai/zoom/v2/users/me')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
Base URL
https://gateway.maton.ai/zoom/v2/
All endpoints documented below are accessed under this base URL. The gateway proxies requests to api.zoom.us and automatically injects your OAuth token. Only the endpoints listed in the API Reference section below are supported.
Security & Permissions
- The Maton API key acts as a credential — treat it as a secret and do not expose it in client-side code or public repositories
- The OAuth connection grants scoped access to meetings, webinars, recordings, and user profiles on the connected Zoom account
- Read operations (GET) retrieve data from the connected Zoom account
- Write operations (POST, PATCH, DELETE) create, modify, or delete meetings, webinars, and recordings — confirm with the user before destructive actions
- Access is limited to the Zoom account linked through the OAuth connection
Authentication
All requests require the Maton API key in the Authorization header:
Authorization: Bearer $MATON_API_KEY
Environment Variable: Set your API key as MATON_API_KEY:
export MATON_API_KEY="YOUR_API_KEY"
Getting Your API Key
- Sign in or create an account at maton.ai
- Go to maton.ai/settings
- Copy your API key
Connection Management
Manage your Zoom OAuth connections at https://ctrl.maton.ai.
List Connections
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://ctrl.maton.ai/connections?app=zoom&status=ACTIVE')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
Create Connection
python <<'EOF'
import urllib.request, os, json
data = json.dumps({'app': 'zoom'}).encode()
req = urllib.request.Request('https://ctrl.maton.ai/connections', data=data, method='POST')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Content-Type', 'application/json')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
Get Connection
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://ctrl.maton.ai/connections/{connection_id}')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
Response:
{
"connection": {
"connection_id": "{connection_id}",
"status": "ACTIVE",
"creation_time": "2026-04-10T00:35:13.470841Z",
"last_updated_time": "2026-04-10T00:37:08.985792Z",
"url": "https://connect.maton.ai/?session_token=...",
"app": "zoom",
"metadata": {}
}
}
Open the returned url in a browser to complete OAuth authorization.
Delete Connection
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://ctrl.maton.ai/connections/{connection_id}', method='DELETE')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
Specifying Connection
If you have multiple Zoom connections, specify which one to use with the Maton-Connection header:
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://gateway.maton.ai/zoom/v2/users/me')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Maton-Connection', '{connection_id}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
If omitted, the gateway uses the default (oldest) active connection.
API Reference
Users
Get Current User
GET /zoom/v2/users/me
Response:
{
"id": "APv5EPHiSvitxgPAw0DbaQ",
"first_name": "John",
"last_name": "Doe",
"display_name": "John Doe",
"email": "john@example.com",
"type": 1,
"role_name": "Owner",
"pmi": 5017823017,
"timezone": "America/Los_Angeles",
"status": "active",
"created_at": "2023-06-01T19:33:22Z",
"last_login_time": "2026-04-10T00:35:21Z"
}
User Types:
1- Basic2- Licensed3- On-prem
Meetings
List User's Meetings
GET /zoom/v2/users/me/meetings
GET /zoom/v2/users/{userId}/meetings
Query Parameters:
| Parameter | Type | Description |
|---|---|---|
type | string | scheduled, live, upcoming, upcoming_meetings, previous_meetings |
page_size | integer | Results per page (max 300, default 30) |
next_page_token | string | Pagination token |
from | string | Start date (YYYY-MM-DD) |
to | string | End date (YYYY-MM-DD) |
Response:
{
"page_size": 30,
"total_records": 1,
"next_page_token": "",
"meetings": [
{
"uuid": "RPrVctdSRxaVmIUTHVUlGQ==",
"id": 82931897821,
"host_id": "APv5EPHiSvitxgPAw0DbaQ",
"topic": "Team Standup",
"type": 2,
"start_time": "2026-04-10T00:39:32Z",
"duration": 30,
"timezone": "America/Los_Angeles",
"join_url": "https://us05web.zoom.us/j/82931897821?pwd=..."
}
]
}
Get Upcoming Meetings
GET /zoom/v2/users/me/upcoming_meetings
Returns meetings scheduled for the future.
Create Meeting
POST /zoom/v2/users/me/meetings
POST /zoom/v2/users/{userId}/meetings
Content-Type: application/json
{
"topic": "Weekly Team Sync",
"type": 2,
"start_time": "2026-04-15T14:00:00Z",
"duration": 60,
"timezone": "America/Los_Angeles",
"agenda": "Discuss project updates",
"settings": {
"host_video": true,
"participant_video": true,
"join_before_host": false,
"mute_upon_entry": true,
"waiting_room": true
}
}
Meeting Types:
1- Instant meeting2- Scheduled meeting3- Recurring meeting with no fixed time8- Recurring meeting with fixed time
Example - Create Meeting:
python <<'EOF'
import urllib.request, os, json
data = json.dumps({
"topic": "Project Review",
"type": 2,
"start_time": "2026-04-15T14:00:00Z",
"duration": 60,
"timezone": "America/Los_Angeles",
"settings": {
"host_video": True,
"participant_video": True,
"waiting_room": True
}
}).encode()
req = urllib.request.Request('https://gateway.maton.ai/zoom/v2/users/me/meetings', data=data, method='POST')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Content-Type', 'application/json')
resp = json.load(urllib.request.urlopen(req))
print(f"Meeting created! Join URL: {resp['join_url']}")
EOF
Response:
{
"uuid": "RPrVctdSRxaVmIUTHVUlGQ==",
"id": 82931897821,
"host_id": "APv5EPHiSvitxgPAw0DbaQ",
"host_email": "john@example.com",
"topic": "Project Review",
"type": 2,
"status": "waiting",
"start_time": "2026-04-15T14:00:00Z",
"duration": 60,
"timezone": "America/Los_Angeles",
"start_url": "https://us05web.zoom.us/s/82931897821?zak=...",
"join_url": "https://us05web.zoom.us/j/82931897821?pwd=...",
"password": "AX2hsd"
}
Get Meeting
GET /zoom/v2/meetings/{meetingId}
Path Parameters:
meetingId- Meeting ID or UUID (double-encode UUID if it contains/or//)
Update Meeting
PATCH /zoom/v2/meetings/{meetingId}
Content-Type: application/json
{
"topic": "Updated Meeting Title",
"duration": 45,
"settings": {
"waiting_room": false
}
}
Example - Update Meeting:
python <<'EOF'
import urllib.request, os, json
data = json.dumps({
"topic": "Updated Weekly Sync",
"duration": 45
}).encode()
req = urllib.request.Request('https://gateway.maton.ai/zoom/v2/meetings/82931897821', data=data, method='PATCH')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Content-Type', 'application/json')
urllib.request.urlopen(req)
print("Meeting updated!")
EOF
Delete Meeting
DELETE /zoom/v2/meetings/{meetingId}
Query Parameters:
schedule_for_reminder- Send cancellation email to registrants (boolean)cancel_meeting_reminder- Send cancellation email notification (boolean)
Recordings
List User's Cloud Recordings
GET /zoom/v2/users/me/recordings
GET /zoom/v2/users/{userId}/recordings
Query Parameters:
| Parameter | Type | Description |
|---|---|---|
from | string | Start date (YYYY-MM-DD) |
to | string | End date (YYYY-MM-DD) |
page_size | integer | Results per page (max 300, default 30) |
next_page_token | string | Pagination token |
trash | boolean | List trashed recordings |
trash_type | string | meeting_recordings or recording_file |
Response:
{
"from": "2026-04-01",
"to": "2026-04-10",
"page_count": 1,
"page_size": 30,
"total_records": 2,
"next_page_token": "",
"meetings": [
{
"uuid": "...",
"id": 123456789,
"topic": "Team Meeting",
"start_time": "2026-04-05T14:00:00Z",
"duration": 45,
"total_size": 52428800,
"recording_count": 2,
"recording_files": [
{
"id": "...",
"meeting_id": "...",
"recording_start": "2026-04-05T14:00:00Z",
"recording_end": "2026-04-05T14:45:00Z",
"file_type": "MP4",
"file_size": 50000000,
"play_url": "https://...",
"download_url": "https://...",
"status": "completed",
"recording_type": "shared_screen_with_speaker_view"
}
]
}
]
}
Get Meeting Recordings
GET /zoom/v2/meetings/{meetingId}/recordings
Delete Meeting Recordings
DELETE /zoom/v2/meetings/{meetingId}/recordings
Webinars
Note: Webinar endpoints require a Webinar add-on plan.
List User's Webinars
GET /zoom/v2/users/me/webinars
GET /zoom/v2/users/{userId}/webinars
Create Webinar
POST /zoom/v2/users/{userId}/webinars
Content-Type: application/json
{
"topic": "Product Launch Webinar",
"type": 5,
"start_time": "2026-05-01T10:00:00Z",
"duration": 90,
"timezone": "America/Los_Angeles"
}
Webinar Types:
5- Scheduled webinar6- Recurring webinar with no fixed time9- Recurring webinar with fixed time
Get Webinar
GET /zoom/v2/webinars/{webinarId}
Update Webinar
PATCH /zoom/v2/webinars/{webinarId}
Content-Type: application/json
{
"topic": "Updated Webinar Title"
}
Delete Webinar
DELETE /zoom/v2/webinars/{webinarId}
Meeting Registrants
List Meeting Registrants
GET /zoom/v2/meetings/{meetingId}/registrants
Add Meeting Registrant
POST /zoom/v2/meetings/{meetingId}/registrants
Content-Type: application/json
{
"email": "attendee@example.com",
"first_name": "Jane",
"last_name": "Smith"
}
Meeting Participants
List Past Meeting Participants
GET /zoom/v2/past_meetings/{meetingUUID}/participants
Note: Use double-encoded UUID if it contains / or //.
Pagination
Zoom uses cursor-based pagination with next_page_token:
GET /zoom/v2/users/me/meetings?page_size=50
Response includes pagination info:
{
"page_size": 50,
"total_records": 150,
"next_page_token": "Tva2CuIdTgsv8wAnhyAdU3m06Y2HuLQtlh3",
"meetings": [...]
}
Get next page:
GET /zoom/v2/users/me/meetings?page_size=50&next_page_token=Tva2CuIdTgsv8wAnhyAdU3m06Y2HuLQtlh3
When next_page_token is empty, there are no more pages.
Code Examples
JavaScript
const response = await fetch(
'https://gateway.maton.ai/zoom/v2/users/me/meetings',
{
headers: {
'Authorization': `Bearer ${process.env.MATON_API_KEY}`
}
}
);
const data = await response.json();
console.log(data.meetings);
Python
import os
import requests
response = requests.get(
'https://gateway.maton.ai/zoom/v2/users/me/meetings',
headers={'Authorization': f'Bearer {os.environ["MATON_API_KEY"]}'}
)
meetings = response.json()['meetings']
Create Meeting and Get Join URL
import os
import requests
headers = {
'Authorization': f'Bearer {os.environ["MATON_API_KEY"]}',
'Content-Type': 'application/json'
}
# Create a meeting
meeting = requests.post(
'https://gateway.maton.ai/zoom/v2/users/me/meetings',
headers=headers,
json={
'topic': 'Quick Sync',
'type': 2,
'duration': 30,
'settings': {
'waiting_room': True,
'join_before_host': False
}
}
).json()
print(f"Meeting ID: {meeting['id']}")
print(f"Join URL: {meeting['join_url']}")
print(f"Password: {meeting['password']}")
Notes
- Meeting IDs are numeric; UUIDs are base64-encoded strings
- When using UUID in path, double-encode if it contains
/or// - User
mecan be used to reference the authenticated user - Some endpoints require admin scopes and may not be available with standard OAuth
- Webinar endpoints require a Webinar add-on subscription
- Recordings are only available for cloud recording-enabled accounts
- Rate limits vary by plan and endpoint category
- IMPORTANT: When using curl commands, use
curl -gwhen URLs contain brackets to disable glob parsing - IMPORTANT: When piping curl output to
jq, environment variables may not expand correctly in some shells
Error Handling
| Status | Meaning |
|---|---|
| 400 | Bad request or missing required parameter |
| 401 | Invalid or missing Maton API key |
| 403 | Forbidden - insufficient permissions |
| 404 | Resource not found |
| 429 | Rate limited |
| 4xx/5xx | Passthrough error from Zoom API |
Common Error Codes
| Code | Message |
|---|---|
| 3001 | Meeting does not exist |
| 4711 | Invalid access token, missing required scopes |
| 200 (in body) | Feature not available (e.g., Webinar plan missing) |
Resources
常见问题
- 认证流程是怎样的?
- 设置环境变量 MATON_API_KEY,作为 Bearer 头发送给网关即可,Zoom 的 OAuth Token 由网关自动注入,调用方无需自行处理 OAuth 流程。
- 写入操作会直接执行吗?
- 该技能明确规定,POST、PATCH、DELETE 等写入或破坏性操作需先征得用户同意再调用,默认只进行读取与列表操作。
- 除了会议还支持哪些能力?
- 还覆盖用户资料、会议报名者、历史参会者、云录制,以及研讨会接口(后者要求 Zoom 账户开通 Webinar 增值插件)。
相关技能
通过托管 OAuth 网关读写 Zoho 日历的日历与事件。
通过 Maton API 代理,使用托管 OAuth 管理 Zoho Bookings 的预约、服务、员工和工作区。
通过 Server-to-Server OAuth,在智能体工作流中管理 Zoom 会议、云录像与账户用户。
通过托管 OAuth 网关读写 Calendly 排程数据。
通过托管 OAuth 代理访问 Fathom API,获取会议录像、转写、摘要并管理 Webhook。