calcom-api

TotalClaw 作者 calcom

与 Cal.com API v2 交互以管理日程安排、预订、活动类型、可用性和日历。在构建需要创建或管理预订、检查可用性、配置事件类型或与 Cal.com 的日程安排基础设施同步日历的集成时,请使用此技能。

安装 / 下载方式

TotalClaw CLI推荐
totalclaw install totalclaw:totalclaw~peerrich-calcom
cURL直接下载,无需登录
curl -fsSL https://skills.taituai.com/api/skills/totalclaw%3Atotalclaw~peerrich-calcom/file -o peerrich-calcom.md
## 概述(中文)

与 Cal.com API v2 交互以管理日程安排、预订、活动类型、可用性和日历。在构建需要创建或管理预订、检查可用性、配置事件类型或与 Cal.com 的日程安排基础设施同步日历的集成时,请使用此技能。

## 原文

# Cal.com API v2

This skill provides guidance for AI agents to interact with the Cal.com API v2, enabling scheduling automation, booking management, and calendar integrations.

## Base URL

All API requests should be made to:
```
https://api.cal.com/v2
```

## Authentication

All API requests require authentication via Bearer token in the Authorization header:

```
Authorization: Bearer cal_<your_api_key>
```

API keys must be prefixed with `cal_`. You can generate API keys from your Cal.com dashboard under Settings > Developer > API Keys.

## Core Concepts

### Event Types
Event types define bookable meeting configurations (duration, location, availability rules). Each event type has a unique slug used in booking URLs.

### Bookings
Bookings are confirmed appointments created when someone books an event type. Each booking has a unique UID for identification.

### Schedules
Schedules define when a user is available for bookings. Users can have multiple schedules with different working hours.

### Slots
Slots represent available time windows that can be booked based on event type configuration and user availability.

## Common Operations

### Check Available Slots

Before creating a booking, check available time slots:

```http
GET /v2/slots?startTime=2024-01-15T00:00:00Z&endTime=2024-01-22T00:00:00Z&eventTypeId=123&eventTypeSlug=30min
```

Query parameters:
- `startTime` (required): ISO 8601 start of range
- `endTime` (required): ISO 8601 end of range  
- `eventTypeId` or `eventTypeSlug`: Identify the event type
- `timeZone`: Timezone for slot display (default: UTC)

Response contains available slots grouped by date.

### Create a Booking

```http
POST /v2/bookings
Content-Type: application/json

{
  "start": "2024-01-15T10:00:00Z",
  "eventTypeId": 123,
  "attendee": {
    "name": "John Doe",
    "email": "john@example.com",
    "timeZone": "America/New_York"
  },
  "meetingUrl": "https://cal.com/team/meeting",
  "metadata": {}
}
```

Required fields:
- `start`: ISO 8601 booking start time
- `eventTypeId`: ID of the event type to book
- `attendee.name`: Attendee's full name
- `attendee.email`: Attendee's email address
- `attendee.timeZone`: Attendee's timezone

### Get Bookings

List bookings with optional filters:

```http
GET /v2/bookings?status=upcoming&take=10
```

Query parameters:
- `status`: Filter by status (upcoming, recurring, past, cancelled, unconfirmed)
- `attendeeEmail`: Filter by attendee email
- `eventTypeId`: Filter by event type
- `take`: Number of results (max 250)
- `skip`: Pagination offset

### Get a Single Booking

```http
GET /v2/bookings/{bookingUid}
```

### Cancel a Booking

```http
POST /v2/bookings/{bookingUid}/cancel
Content-Type: application/json

{
  "cancellationReason": "Schedule conflict"
}
```

### Reschedule a Booking

```http
POST /v2/bookings/{bookingUid}/reschedule
Content-Type: application/json

{
  "start": "2024-01-16T14:00:00Z",
  "reschedulingReason": "Conflict with another meeting"
}
```

### List Event Types

```http
GET /v2/event-types
```

Returns all event types for the authenticated user.

### Get a Single Event Type

```http
GET /v2/event-types/{eventTypeId}
```

### Create an Event Type

```http
POST /v2/event-types
Content-Type: application/json

{
  "title": "30 Minute Meeting",
  "slug": "30min",
  "lengthInMinutes": 30,
  "locations": [
    {
      "type": "integration",
      "integration": "cal-video"
    }
  ]
}
```

### List Schedules

```http
GET /v2/schedules
```

### Get Default Schedule

```http
GET /v2/schedules/default
```

### Create a Schedule

```http
POST /v2/schedules
Content-Type: application/json

{
  "name": "Working Hours",
  "timeZone": "America/New_York",
  "isDefault": true,
  "availability": [
    {
      "days": [1, 2, 3, 4, 5],
      "startTime": "09:00",
      "endTime": "17:00"
    }
  ]
}
```

Days are 0-indexed (0 = Sunday, 1 = Monday, etc.).

### Get Current User

```http
GET /v2/me
```

Returns the authenticated user's profile information.

## Team and Organization Endpoints

For team bookings and organization management, use the organization-scoped endpoints:

### List Organization Teams

```http
GET /v2/organizations/{orgId}/teams
```

### Get Team Event Types

```http
GET /v2/organizations/{orgId}/teams/{teamId}/event-types
```

### Create Team Booking

Team event types support different scheduling modes:
- `COLLECTIVE`: All team members must attend
- `ROUND_ROBIN`: Distributes bookings among team members

## Webhooks

Configure webhooks to receive real-time notifications:

### List Webhooks

```http
GET /v2/webhooks
```

### Create a Webhook

```http
POST /v2/webhooks
Content-Type: application/json

{
  "subscriberUrl": "https://your-app.com/webhook",
  "triggers": ["BOOKING_CREATED", "BOOKING_CANCELLED"],
  "active": true
}
```

Available triggers:
- `BOOKING_CREATED`
- `BOOKING_CANCELLED`
- `BOOKING_RESCHEDULED`
- `BOOKING_CONFIRMED`
- `MEETING_STARTED`
- `MEETING_ENDED`

## Calendar Integration

### List Connected Calendars

```http
GET /v2/calendars
```

### Check Busy Times

```http
GET /v2/calendars/busy-times?startTime=2024-01-15T00:00:00Z&endTime=2024-01-22T00:00:00Z
```

## Error Handling

The API returns standard HTTP status codes:

- `200`: Success
- `201`: Created
- `400`: Bad Request (invalid parameters)
- `401`: Unauthorized (invalid or missing API key)
- `403`: Forbidden (insufficient permissions)
- `404`: Not Found
- `422`: Unprocessable Entity (validation error)
- `500`: Internal Server Error

Error responses include a message field:

```json
{
  "status": "error",
  "message": "Booking not found"
}
```

## Rate Limiting

The API implements rate limiting. If you exceed the limit, you'll receive a `429 Too Many Requests` response. Implement exponential backoff for retries.

## Pagination

List endpoints support pagination via `take` and `skip` parameters:

- `take`: Number of items to return (default: 10, max: 250)
- `skip`: Number of items to skip

## Best Practices

1. Always check slot availability before creating bookings
2. Store booking UIDs for future reference (cancel, reschedule)
3. Handle timezone conversions carefully - always use ISO 8601 format
4. Implement webhook handlers for real-time booking updates
5. Cache event type data to reduce API calls
6. Use appropriate error handling for all API calls

## Additional Resources

- [Full API Reference](https://cal.com/docs/api-reference/v2)
- [OpenAPI Specification](https://api.cal.com/v2/docs)

---

## 中文说明

# Cal.com API v2

本技能为 AI 智能体提供与 Cal.com API v2 交互的指南,可实现日程安排自动化、预订管理和日历集成。

## Base URL

所有 API 请求都应发送至:
```
https://api.cal.com/v2
```

## Authentication

所有 API 请求都需要在 Authorization 请求头中通过 Bearer token 进行身份验证:

```
Authorization: Bearer cal_<your_api_key>
```

API 密钥必须以 `cal_` 为前缀。你可以在 Cal.com 控制台的 Settings > Developer > API Keys 下生成 API 密钥。

## Core Concepts

### Event Types
事件类型定义了可预订的会议配置(时长、地点、可用性规则)。每个事件类型都有一个用于预订 URL 的唯一 slug。

### Bookings
预订是在有人预订某个事件类型时创建的已确认约会。每个预订都有一个用于标识的唯一 UID。

### Schedules
日程定义了用户可供预订的时间。用户可以拥有多个具有不同工作时间的日程。

### Slots
时段表示根据事件类型配置和用户可用性可供预订的可用时间窗口。

## Common Operations

### Check Available Slots

在创建预订之前,先检查可用时段:

```http
GET /v2/slots?startTime=2024-01-15T00:00:00Z&endTime=2024-01-22T00:00:00Z&eventTypeId=123&eventTypeSlug=30min
```

查询参数:
- `startTime`(必填):ISO 8601 格式的范围起始时间
- `endTime`(必填):ISO 8601 格式的范围结束时间
- `eventTypeId` 或 `eventTypeSlug`:标识事件类型
- `timeZone`:用于显示时段的时区(默认:UTC)

响应包含按日期分组的可用时段。

### Create a Booking

```http
POST /v2/bookings
Content-Type: application/json

{
  "start": "2024-01-15T10:00:00Z",
  "eventTypeId": 123,
  "attendee": {
    "name": "John Doe",
    "email": "john@example.com",
    "timeZone": "America/New_York"
  },
  "meetingUrl": "https://cal.com/team/meeting",
  "metadata": {}
}
```

必填字段:
- `start`:ISO 8601 格式的预订开始时间
- `eventTypeId`:要预订的事件类型的 ID
- `attendee.name`:参与者的全名
- `attendee.emai