Install
openclaw skills install calcomInteract 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.
openclaw skills install calcomThis skill provides guidance for AI agents to interact with the Cal.com API v2, enabling scheduling automation, booking management, and calendar integrations.
All API requests should be made to:
https://api.cal.com/v2
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.
Event types define bookable meeting configurations (duration, location, availability rules). Each event type has a unique slug used in booking URLs.
Bookings are confirmed appointments created when someone books an event type. Each booking has a unique UID for identification.
Schedules define when a user is available for bookings. Users can have multiple schedules with different working hours.
Slots represent available time windows that can be booked based on event type configuration and user availability.
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:
startTime (required): ISO 8601 start of rangeendTime (required): ISO 8601 end of rangeeventTypeId or eventTypeSlug: Identify the event typetimeZone: Timezone for slot display (default: UTC)Response contains available slots grouped by date.
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 timeeventTypeId: ID of the event type to bookattendee.name: Attendee's full nameattendee.email: Attendee's email addressattendee.timeZone: Attendee's timezoneList bookings with optional filters:
GET /v2/bookings?status=upcoming&take=10
Query parameters:
status: Filter by status (upcoming, recurring, past, cancelled, unconfirmed)attendeeEmail: Filter by attendee emaileventTypeId: Filter by event typetake: Number of results (max 250)skip: Pagination offsetGET /v2/bookings/{bookingUid}
POST /v2/bookings/{bookingUid}/cancel
Content-Type: application/json
{
"cancellationReason": "Schedule conflict"
}
POST /v2/bookings/{bookingUid}/reschedule
Content-Type: application/json
{
"start": "2024-01-16T14:00:00Z",
"reschedulingReason": "Conflict with another meeting"
}
GET /v2/event-types
Returns all event types for the authenticated user.
GET /v2/event-types/{eventTypeId}
POST /v2/event-types
Content-Type: application/json
{
"title": "30 Minute Meeting",
"slug": "30min",
"lengthInMinutes": 30,
"locations": [
{
"type": "integration",
"integration": "cal-video"
}
]
}
GET /v2/schedules
GET /v2/schedules/default
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 /v2/me
Returns the authenticated user's profile information.
For team bookings and organization management, use the organization-scoped endpoints:
GET /v2/organizations/{orgId}/teams
GET /v2/organizations/{orgId}/teams/{teamId}/event-types
Team event types support different scheduling modes:
COLLECTIVE: All team members must attendROUND_ROBIN: Distributes bookings among team membersConfigure webhooks to receive real-time notifications:
GET /v2/webhooks
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_ENDEDGET /v2/calendars
GET /v2/calendars/busy-times?startTime=2024-01-15T00:00:00Z&endTime=2024-01-22T00:00:00Z
The API returns standard HTTP status codes:
200: Success201: Created400: Bad Request (invalid parameters)401: Unauthorized (invalid or missing API key)403: Forbidden (insufficient permissions)404: Not Found422: Unprocessable Entity (validation error)500: Internal Server ErrorError responses include a message field:
{
"status": "error",
"message": "Booking not found"
}
The API implements rate limiting. If you exceed the limit, you'll receive a 429 Too Many Requests response. Implement exponential backoff for retries.
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