cal-com

$npx mdskill add vm0-ai/vm0-skills/cal-com

Fetch Cal.com booking data and manage interview scheduling.

  • Retrieves user profiles, event types, and available time slots.
  • Depends on Cal.com open-source scheduling API v2 endpoints.
  • Executes requests using bearer tokens and API version headers.
  • Returns structured JSON responses containing booking details.
SKILL.md
.github/skills/cal-comView on GitHub ↗
---
name: cal-com
description: Cal.com open-source scheduling API. Use when user mentions "Cal.com", "cal.com", "open source scheduling", "booking", "event types", or asks about interview or meeting scheduling.
---

## Troubleshooting

If requests fail, run `zero doctor check-connector --env-name CALCOM_TOKEN` or `zero doctor check-connector --url https://api.cal.com/v2/me --method GET`

## Core APIs

### Get Current User

```bash
curl -s "https://api.cal.com/v2/me" --header "Authorization: Bearer $CALCOM_TOKEN" --header "cal-api-version: 2024-08-13" | jq '{id, email, name, username, timeZone}'
```

### List Event Types

```bash
curl -s "https://api.cal.com/v2/event-types" --header "Authorization: Bearer $CALCOM_TOKEN" --header "cal-api-version: 2024-08-13" | jq '[.data[] | {id, title, slug, length, hidden}]'
```

### Get Event Type

Replace `<event-type-id>` with the numeric ID from the list above:

```bash
curl -s "https://api.cal.com/v2/event-types/<event-type-id>" --header "Authorization: Bearer $CALCOM_TOKEN" --header "cal-api-version: 2024-08-13" | jq '.data | {id, title, length, description, locations}'
```

### Get Availability

Check available slots for an event type. Replace `<username>` and `<event-type-slug>` with actual values. Dates in `YYYY-MM-DD` format:

```bash
curl -s "https://api.cal.com/v2/slots/available?username=<username>&eventTypeSlug=<event-type-slug>&startTime=2025-01-15&endTime=2025-01-22&timeZone=America/New_York" --header "Authorization: Bearer $CALCOM_TOKEN" --header "cal-api-version: 2024-08-13" | jq '{slots: [.data.slots | to_entries[] | {date: .key, times: [.value[] | .time]}] | .[0:3]}'
```

### Create Booking

Write to `/tmp/calcom_request.json`:

```json
{
  "start": "2025-01-20T14:00:00.000Z",
  "eventTypeId": 123,
  "attendee": {
    "name": "Jane Doe",
    "email": "jane@example.com",
    "timeZone": "America/New_York",
    "language": "en"
  },
  "metadata": {
    "source": "clerk_sync"
  }
}
```

```bash
curl -s -X POST "https://api.cal.com/v2/bookings" --header "Authorization: Bearer $CALCOM_TOKEN" --header "cal-api-version: 2024-08-13" --header "Content-Type: application/json" -d @/tmp/calcom_request.json | jq '{uid, status, start, end, attendees: [.attendees[] | {name, email}]}'
```

Docs: https://cal.com/docs/api-reference/v2/bookings/create-a-booking

### List Bookings

```bash
curl -s "https://api.cal.com/v2/bookings?take=20" --header "Authorization: Bearer $CALCOM_TOKEN" --header "cal-api-version: 2024-08-13" | jq '[.data[] | {uid, status, title, start, end, attendeeName: .attendees[0].name}]'
```

### Get Booking

Replace `<booking-uid>` with the booking UID from the list above:

```bash
curl -s "https://api.cal.com/v2/bookings/<booking-uid>" --header "Authorization: Bearer $CALCOM_TOKEN" --header "cal-api-version: 2024-08-13" | jq '{uid, status, title, start, end, attendees}'
```

### Cancel Booking

Replace `<booking-uid>` with the booking UID.

Write to `/tmp/calcom_request.json`:

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

```bash
curl -s -X DELETE "https://api.cal.com/v2/bookings/<booking-uid>/cancel" --header "Authorization: Bearer $CALCOM_TOKEN" --header "cal-api-version: 2024-08-13" --header "Content-Type: application/json" -d @/tmp/calcom_request.json | jq '{status}'
```

### Reschedule Booking

Replace `<booking-uid>` with the booking UID.

Write to `/tmp/calcom_request.json`:

```json
{
  "start": "2025-01-22T15:00:00.000Z",
  "reschedulingReason": "Attendee requested different time"
}
```

```bash
curl -s -X POST "https://api.cal.com/v2/bookings/<booking-uid>/reschedule" --header "Authorization: Bearer $CALCOM_TOKEN" --header "cal-api-version: 2024-08-13" --header "Content-Type: application/json" -d @/tmp/calcom_request.json | jq '{uid, status, start, end}'
```

## Guidelines

1. **API version header**: Always include `cal-api-version: 2024-08-13` — requests without this header will fail.
2. **API key prefix**: Cal.com API keys are prefixed with `cal_live_` (production) or `cal_test_` (test environment).
3. **eventTypeId**: Required when creating a booking — get it from the List Event Types endpoint.
4. **Timestamps**: Use ISO 8601 format with UTC timezone (e.g., `2025-01-20T14:00:00.000Z`).
5. **Rate limits**: 120 requests per minute with API key auth. Response headers include `X-RateLimit-Remaining`.
6. **Self-hosted**: If using a self-hosted Cal.com instance, replace `api.cal.com` with your own domain.
7. **Booking confirmation**: If an event type requires manual confirmation, bookings start with `pending` status until confirmed.
More from vm0-ai/vm0-skills