Claude-skill-registry calcom-api
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.
git clone https://github.com/majiayu000/claude-skill-registry
T=$(mktemp -d) && git clone --depth=1 https://github.com/majiayu000/claude-skill-registry "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/data/calcom-api" ~/.claude/skills/majiayu000-claude-skill-registry-calcom-api && rm -rf "$T"
skills/data/calcom-api/SKILL.mdCal.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:
GET /v2/slots?startTime=2024-01-15T00:00:00Z&endTime=2024-01-22T00:00:00Z&eventTypeId=123&eventTypeSlug=30min
Query parameters:
(required): ISO 8601 start of rangestartTime
(required): ISO 8601 end of rangeendTime
oreventTypeId
: Identify the event typeeventTypeSlug
: Timezone for slot display (default: UTC)timeZone
Response contains available slots grouped by date.
Create a Booking
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:
: ISO 8601 booking start timestart
: ID of the event type to bookeventTypeId
: Attendee's full nameattendee.name
: Attendee's email addressattendee.email
: Attendee's timezoneattendee.timeZone
Get Bookings
List bookings with optional filters:
GET /v2/bookings?status=upcoming&take=10
Query parameters:
: Filter by status (upcoming, recurring, past, cancelled, unconfirmed)status
: Filter by attendee emailattendeeEmail
: Filter by event typeeventTypeId
: Number of results (max 250)take
: Pagination offsetskip
Get a Single Booking
GET /v2/bookings/{bookingUid}
Cancel a Booking
POST /v2/bookings/{bookingUid}/cancel Content-Type: application/json { "cancellationReason": "Schedule conflict" }
Reschedule a Booking
POST /v2/bookings/{bookingUid}/reschedule Content-Type: application/json { "start": "2024-01-16T14:00:00Z", "reschedulingReason": "Conflict with another meeting" }
List Event Types
GET /v2/event-types
Returns all event types for the authenticated user.
Get a Single Event Type
GET /v2/event-types/{eventTypeId}
Create an Event Type
POST /v2/event-types Content-Type: application/json { "title": "30 Minute Meeting", "slug": "30min", "lengthInMinutes": 30, "locations": [ { "type": "integration", "integration": "cal-video" } ] }
List Schedules
GET /v2/schedules
Get Default Schedule
GET /v2/schedules/default
Create a Schedule
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
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
GET /v2/organizations/{orgId}/teams
Get Team Event Types
GET /v2/organizations/{orgId}/teams/{teamId}/event-types
Create Team Booking
Team event types support different scheduling modes:
: All team members must attendCOLLECTIVE
: Distributes bookings among team membersROUND_ROBIN
Webhooks
Configure webhooks to receive real-time notifications:
List Webhooks
GET /v2/webhooks
Create a Webhook
POST /v2/webhooks Content-Type: application/json { "subscriberUrl": "https://your-app.com/webhook", "triggers": ["BOOKING_CREATED", "BOOKING_CANCELLED"], "active": true }
Available triggers:
BOOKING_CREATEDBOOKING_CANCELLEDBOOKING_RESCHEDULEDBOOKING_CONFIRMEDMEETING_STARTEDMEETING_ENDED
Calendar Integration
List Connected Calendars
GET /v2/calendars
Check Busy Times
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:
: Success200
: Created201
: Bad Request (invalid parameters)400
: Unauthorized (invalid or missing API key)401
: Forbidden (insufficient permissions)403
: Not Found404
: Unprocessable Entity (validation error)422
: Internal Server Error500
Error responses include a message field:
{ "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:
: Number of items to return (default: 10, max: 250)take
: Number of items to skipskip
Best Practices
- Always check slot availability before creating bookings
- Store booking UIDs for future reference (cancel, reschedule)
- Handle timezone conversions carefully - always use ISO 8601 format
- Implement webhook handlers for real-time booking updates
- Cache event type data to reduce API calls
- Use appropriate error handling for all API calls