Calendly
Calendly API 与托管 OAuth 集成。访问事件类型、安排的事件、受邀者、可用性以及管理 Webhook。当用户想要查看计划数据、检查可用性、预订会议或与 Calendly 工作流程集成时,请使用此技能。对于其他第三方应用程序,请使用 api-gateway 技能 (https://clawhub.ai/byungkyu/api-gateway)。
安装 / 下载方式
TotalClaw CLI推荐
totalclaw skills install shop:totalclaw:byungkyu~calendly-apicURL直接下载,无需登录
curl -fsSL https://skills.taituai.com/api/skills/totalclaw%3Abyungkyu~calendly-api/file -o calendly-api.mdGit 仓库获取源码
git clone https://github.com/openclaw/skills/commit/97e8e67ec7e858cf825801b323a054eb07274d2f## 概述(中文)
Calendly API 与托管 OAuth 集成。访问事件类型、安排的事件、受邀者、可用性以及管理 Webhook。当用户想要查看计划数据、检查可用性、预订会议或与 Calendly 工作流程集成时,请使用此技能。对于其他第三方应用程序,请使用 api-gateway 技能 (https://clawhub.ai/byungkyu/api-gateway)。
## 原文
# Calendly
Access the Calendly API with managed OAuth authentication. Retrieve event types, scheduled events, invitees, availability data, and manage webhook subscriptions for scheduling automation.
## Quick Start
```bash
# Get current user
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://gateway.maton.ai/calendly/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/calendly/{native-api-path}
```
Replace `{native-api-path}` with the actual Calendly API endpoint path. The gateway proxies requests to `api.calendly.com` and automatically injects your OAuth token.
## 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`:
```bash
export MATON_API_KEY="YOUR_API_KEY"
```
### Getting Your API Key
1. Sign in or create an account at [maton.ai](https://maton.ai)
2. Go to [maton.ai/settings](https://maton.ai/settings)
3. Copy your API key
## Connection Management
Manage your Calendly OAuth connections at `https://ctrl.maton.ai`.
### List Connections
```bash
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://ctrl.maton.ai/connections?app=calendly&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
```bash
python <<'EOF'
import urllib.request, os, json
data = json.dumps({'app': 'calendly'}).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
```bash
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:**
```json
{
"connection": {
"connection_id": "21fd90f9-5935-43cd-b6c8-bde9d915ca80",
"status": "ACTIVE",
"creation_time": "2025-12-08T07:20:53.488460Z",
"last_updated_time": "2026-01-31T20:03:32.593153Z",
"url": "https://connect.maton.ai/?session_token=...",
"app": "calendly",
"metadata": {}
}
}
```
Open the returned `url` in a browser to complete OAuth authorization.
### Delete Connection
```bash
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 Calendly connections, specify which one to use with the `Maton-Connection` header:
```bash
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://gateway.maton.ai/calendly/users/me')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Maton-Connection', '21fd90f9-5935-43cd-b6c8-bde9d915ca80')
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
```bash
GET /calendly/users/me
```
**Example:**
```bash
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://gateway.maton.ai/calendly/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
```
**Response:**
```json
{
"resource": {
"uri": "https://api.calendly.com/users/AAAAAAAAAAAAAAAA",
"name": "Alice Johnson",
"slug": "alice-johnson",
"email": "alice.johnson@acme.com",
"scheduling_url": "https://calendly.com/alice-johnson",
"timezone": "America/New_York",
"avatar_url": "https://example.com/avatar.png",
"created_at": "2024-01-15T10:30:00.000000Z",
"updated_at": "2025-06-20T14:45:00.000000Z",
"current_organization": "https://api.calendly.com/organizations/BBBBBBBBBBBBBBBB"
}
}
```
#### Get a User
```bash
GET /calendly/users/{uuid}
```
### Event Types
#### List Event Types
```bash
GET /calendly/event_types
```
Query parameters:
- `user` - User URI to filter event types
- `organization` - Organization URI to filter event types
- `active` - Filter by active status (true/false)
- `count` - Number of results to return (default 20, max 100)
- `page_token` - Token for pagination
- `sort` - Sort order (e.g., `name:asc`, `created_at:desc`)
**Example:**
```bash
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://gateway.maton.ai/calendly/event_types?user=https://api.calendly.com/users/AAAAAAAAAAAAAAAA&active=true')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
```
**Response:**
```json
{
"collection": [
{
"uri": "https://api.calendly.com/event_types/CCCCCCCCCCCCCCCC",
"name": "30 Minute Meeting",
"active": true,
"slug": "30min",
"scheduling_url": "https://calendly.com/alice-johnson/30min",
"duration": 30,
"kind": "solo",
"type": "StandardEventType",
"color": "#0066FF",
"created_at": "2024-02-01T09:00:00.000000Z",
"updated_at": "2025-05-15T11:30:00.000000Z",
"description_plain": "A quick 30-minute catch-up call",
"description_html": "<p>A quick 30-minute catch-up call</p>",
"profile": {
"type": "User",
"name": "Alice Johnson",
"owner": "https://api.calendly.com/users/AAAAAAAAAAAAAAAA"
}
}
],
"pagination": {
"count": 1,
"next_page_token": null
}
}
```
#### Get an Event Type
```bash
GET /calendly/event_types/{uuid}
```
### Scheduled Events
#### List Scheduled Events
```bash
GET /calendly/scheduled_events
```
Query parameters:
- `user` - User URI to filter events
- `organization` - Organization URI to filter events
- `invitee_email` - Filter by invitee email
- `status` - Filter by status (`active`, `canceled`)
- `min_start_time` - Filter events starting after this time (ISO 8601)
- `max_start_time` - Filter events starting before this time (ISO 8601)
- `count` - Number of results (default 20, max 100)
- `page_token` - Token for pagination
- `sort` - Sort order (e.g., `start_time:asc`)
**Example:**
```bash
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://gateway.maton.ai/calendly/scheduled_events?user=https://api.calendly.com/users/AAAAAAAAAAAAAAAA&status=active&min_start_time=2025-03-01T00:00:00Z')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
```
**Response:**
```json
{
"collection": [
{
"uri": "https://api.calendly.com/scheduled_events/DDDDDDDDDDDDDDDD",
"name": "30 Minute Meeting",
"status": "active",
"start_time": "2025-03-15T14:00:00.000000Z",
"end_time": "2025-03-15T14:30:00.000000Z",
"event_type": "https://api.calendly.com/event_types/CCCCCCCCCCCCCCCC",
"location": {
"type": "zoom",
"join_url": "https://zoom.us/j/123456789"
},
"invitees_counter": {
"total": 1,
"active": 1,