Interact with the Cal.com API v2 to manage scheduling, bookings, event types, availability, and calendars. Use this skill when building integrations that need to create or manage bookings, check availability, configure event types, or sync calendars with Cal.com's scheduling infrastructure.
Scanned 2/12/2026
Install to Claude Code
npx -y skills add majiayu000/claude-skill-registry --skill calcom-api --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Calcom Api?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/majiayu000-calcom-api)More formats (shields.io, HTML) on the badges page.
---
name: calcom-api
description: Interact with the Cal.com API v2 to manage scheduling, bookings, event types, availability, and calendars. Use this skill when building integrations that need to create or manage bookings, check availability, configure event types, or sync calendars with Cal.com's scheduling infrastructure.
license: MIT
metadata:
author: calcom
version: "1.0.0"
api-version: "v2"
---
# 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)
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!