> ## Documentation Index
> Fetch the complete documentation index at: https://docs.modulex.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# Cal.com Integration for AI Agents & Workflows

> Scheduling and booking management via the Cal.com v2 API

{/* Self-hosted logo — build-time vendored from modulex.json / Iconify (see scripts/lib/logo.js). */}

<img className="block dark:hidden" src="https://mintcdn.com/modulexaillc/zKB2qsP6Q61VNLfB/logos/cal-com-light.svg?fit=max&auto=format&n=zKB2qsP6Q61VNLfB&q=85&s=df6722a9d745f5669179025f6eb3a4d9" alt="Cal.com logo" width="72" height="72" data-path="logos/cal-com-light.svg" />

<img className="hidden dark:block" src="https://mintcdn.com/modulexaillc/zKB2qsP6Q61VNLfB/logos/cal-com-dark.svg?fit=max&auto=format&n=zKB2qsP6Q61VNLfB&q=85&s=bb8d5b3c0a77d8174ad54124f32712dd" alt="Cal.com logo" width="72" height="72" data-path="logos/cal-com-dark.svg" />

## Overview

Add **Cal.com** to any ModuleX agent or workflow. Scheduling and booking management via the Cal.com v2 REST API (`api.cal.com/v2`).

<Info>
  **Categories**: Scheduling & Events · Productivity & Collaboration · Scheduling · Calendar · **Auth**: API Key · **Actions**: 6
</Info>

## Authentication

### API Key

Authenticate using your Cal.com v2 API key

<Steps>
  <Step title="Step 1">
    Sign in to Cal.com at [https://app.cal.com](https://app.cal.com)
  </Step>

  <Step title="Step 2">
    Navigate to Settings > Developer > API Keys
  </Step>

  <Step title="Step 3">
    Create a new API key or copy an existing one
  </Step>

  <Step title="Step 4">
    Paste the API key below
  </Step>
</Steps>

#### Required Credentials

| Field           | Description                                                  | Required | Format                                      |
| --------------- | ------------------------------------------------------------ | -------- | ------------------------------------------- |
| Cal.com API Key | Your Cal.com v2 API key from Settings > Developer > API Keys | Yes      | `cal_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx` |

## Available Actions

<AccordionGroup>
  <Accordion title="create_booking — Create a new booking on Cal.com">
    ### Parameters

    <ResponseField name="booking_type" type="string" required>
      Type of booking: booking, instant, or recurring
    </ResponseField>

    <ResponseField name="attendee_name" type="string" required>
      Full name of the attendee
    </ResponseField>

    <ResponseField name="attendee_time_zone" type="string" required>
      Time zone of the attendee, e.g. America/New\_York
    </ResponseField>

    <ResponseField name="start" type="string" required>
      Booking start time in ISO 8601 UTC format, e.g. 2024-08-13T09:00:00Z
    </ResponseField>

    <ResponseField name="attendee_email" type="string">
      Email address of the attendee
    </ResponseField>

    <ResponseField name="attendee_phone_number" type="string">
      Phone number in international format, e.g. +919876543210
    </ResponseField>

    <ResponseField name="attendee_language" type="string">
      Language for the booking confirmation
    </ResponseField>

    <ResponseField name="event_type_id" type="integer">
      ID of the event type (alternative to slug-based identification)
    </ResponseField>

    <ResponseField name="event_type_slug" type="string">
      Slug of the event type (use with username or team\_slug)
    </ResponseField>

    <ResponseField name="username" type="string">
      Username of the individual event owner
    </ResponseField>

    <ResponseField name="team_slug" type="string">
      Team slug for team event type identification
    </ResponseField>

    <ResponseField name="organization_slug" type="string">
      Organization slug for slug-based event type identification
    </ResponseField>

    <ResponseField name="end_time" type="string">
      Booking end time in ISO 8601 format
    </ResponseField>

    <ResponseField name="length_in_minutes" type="integer">
      Override the event type default duration in minutes
    </ResponseField>

    <ResponseField name="guests" type="array">
      Additional guest email addresses to invite
    </ResponseField>

    <ResponseField name="location" type="string">
      Meeting location type: attendeeAddress, attendeeDefined, attendeePhone, integration
    </ResponseField>

    <ResponseField name="location_address" type="string">
      Physical address if location is attendeeAddress
    </ResponseField>

    <ResponseField name="location_value" type="string">
      Location string if location is attendeeDefined
    </ResponseField>

    <ResponseField name="location_phone" type="string">
      Phone number if location is attendeePhone
    </ResponseField>

    <ResponseField name="location_integration" type="string">
      Video conferencing integration if location is integration
    </ResponseField>

    <ResponseField name="recurrence_count" type="integer">
      Number of occurrences for recurring booking type
    </ResponseField>

    <ResponseField name="metadata" type="object">
      Custom key-value metadata, e.g. \{"source": "website"}
    </ResponseField>

    <ResponseField name="booking_fields_responses" type="object">
      Responses to custom booking form fields keyed by field slug
    </ResponseField>

    <ResponseField name="allow_conflicts" type="boolean">
      Bypass availability checks and allow double-booking
    </ResponseField>

    <ResponseField name="allow_booking_out_of_bounds" type="boolean">
      Allow booking outside the event type scheduling window
    </ResponseField>

    <ResponseField name="email_verification_code" type="string">
      Required when event type has email verification enabled
    </ResponseField>

    ### Response

    ```json theme={null}
    {
      "$defs": {
        "BookingItem": {
          "additionalProperties": false,
          "description": "A booking object returned by the Cal.com API.",
          "properties": {
            "uid": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Uid"
            },
            "title": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Title"
            },
            "status": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Status"
            },
            "start": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Start"
            },
            "end": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "End"
            },
            "attendees": {
              "items": {
                "additionalProperties": true,
                "type": "object"
              },
              "title": "Attendees",
              "type": "array"
            },
            "hosts": {
              "items": {
                "additionalProperties": true,
                "type": "object"
              },
              "title": "Hosts",
              "type": "array"
            },
            "event_type_id": {
              "anyOf": [
                {
                  "type": "integer"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Event Type Id"
            },
            "meeting_url": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Meeting Url"
            },
            "location": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Location"
            }
          },
          "title": "BookingItem",
          "type": "object"
        }
      },
      "additionalProperties": false,
      "properties": {
        "success": {
          "title": "Success",
          "type": "boolean"
        },
        "error": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Error"
        },
        "status": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Status"
        },
        "booking": {
          "anyOf": [
            {
              "$ref": "#/$defs/BookingItem"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        }
      },
      "required": [
        "success"
      ],
      "title": "CreateBookingOutput",
      "type": "object"
    }
    ```
  </Accordion>

  <Accordion title="delete_booking — Cancel an existing booking by its UID">
    ### Parameters

    <ResponseField name="booking_id" type="string" required>
      The UID of the booking to cancel
    </ResponseField>

    <ResponseField name="cancellation_reason" type="string">
      The reason for cancelling the booking
    </ResponseField>

    <ResponseField name="cancel_subsequent_bookings" type="boolean">
      Whether to cancel all subsequent occurrences of a recurring booking
    </ResponseField>

    ### Response

    ```json theme={null}
    {
      "additionalProperties": false,
      "properties": {
        "success": {
          "title": "Success",
          "type": "boolean"
        },
        "error": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Error"
        },
        "status": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Status"
        }
      },
      "required": [
        "success"
      ],
      "title": "DeleteBookingOutput",
      "type": "object"
    }
    ```
  </Accordion>

  <Accordion title="get_all_bookings — Retrieve all bookings from Cal.com with optional filters">
    ### Parameters

    <ResponseField name="max_pages" type="integer">
      Maximum number of pages to fetch (1-500, default 50)
    </ResponseField>

    <ResponseField name="status" type="array">
      Filter by status: upcoming, recurring, past, cancelled, unconfirmed
    </ResponseField>

    <ResponseField name="after_start" type="string">
      Return bookings that start after this time (ISO 8601)
    </ResponseField>

    <ResponseField name="before_end" type="string">
      Return bookings that end before this time (ISO 8601)
    </ResponseField>

    <ResponseField name="after_created_at" type="string">
      Return bookings created after this time (ISO 8601)
    </ResponseField>

    <ResponseField name="before_created_at" type="string">
      Return bookings created before this time (ISO 8601)
    </ResponseField>

    <ResponseField name="attendee_email" type="string">
      Filter bookings by attendee email
    </ResponseField>

    <ResponseField name="attendee_name" type="string">
      Filter bookings by attendee name
    </ResponseField>

    <ResponseField name="booking_uid" type="string">
      Filter bookings by booking UID
    </ResponseField>

    <ResponseField name="event_type_id" type="integer">
      Filter bookings by event type ID
    </ResponseField>

    <ResponseField name="sort_start" type="string">
      Sort bookings by start time: asc or desc
    </ResponseField>

    <ResponseField name="sort_end" type="string">
      Sort bookings by end time: asc or desc
    </ResponseField>

    <ResponseField name="sort_created" type="string">
      Sort bookings by creation time: asc or desc
    </ResponseField>

    ### Response

    ```json theme={null}
    {
      "$defs": {
        "BookingItem": {
          "additionalProperties": false,
          "description": "A booking object returned by the Cal.com API.",
          "properties": {
            "uid": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Uid"
            },
            "title": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Title"
            },
            "status": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Status"
            },
            "start": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Start"
            },
            "end": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "End"
            },
            "attendees": {
              "items": {
                "additionalProperties": true,
                "type": "object"
              },
              "title": "Attendees",
              "type": "array"
            },
            "hosts": {
              "items": {
                "additionalProperties": true,
                "type": "object"
              },
              "title": "Hosts",
              "type": "array"
            },
            "event_type_id": {
              "anyOf": [
                {
                  "type": "integer"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Event Type Id"
            },
            "meeting_url": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Meeting Url"
            },
            "location": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Location"
            }
          },
          "title": "BookingItem",
          "type": "object"
        }
      },
      "additionalProperties": false,
      "properties": {
        "success": {
          "title": "Success",
          "type": "boolean"
        },
        "error": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Error"
        },
        "bookings": {
          "items": {
            "$ref": "#/$defs/BookingItem"
          },
          "title": "Bookings",
          "type": "array"
        },
        "total": {
          "default": 0,
          "title": "Total",
          "type": "integer"
        }
      },
      "required": [
        "success"
      ],
      "title": "GetAllBookingsOutput",
      "type": "object"
    }
    ```
  </Accordion>

  <Accordion title="get_bookable_slots — Retrieve available bookable slots between a datetime range">
    ### Parameters

    <ResponseField name="start" type="string" required>
      Start date/time in ISO 8601 format (UTC)
    </ResponseField>

    <ResponseField name="end" type="string" required>
      End date/time in ISO 8601 format (UTC)
    </ResponseField>

    <ResponseField name="event_type_id" type="integer">
      ID of the event type to get slots for
    </ResponseField>

    <ResponseField name="event_type_slug" type="string">
      Slug of the event type (requires username or team\_slug)
    </ResponseField>

    <ResponseField name="username" type="string">
      Username of the individual event owner
    </ResponseField>

    <ResponseField name="usernames" type="array">
      List of at least 2 usernames for a dynamic event
    </ResponseField>

    <ResponseField name="team_slug" type="string">
      Slug of the team for team event type slot lookup
    </ResponseField>

    <ResponseField name="organization_slug" type="string">
      Organization slug for slug-based event type lookup
    </ResponseField>

    <ResponseField name="time_zone" type="string">
      The time zone for the slot lookup
    </ResponseField>

    <ResponseField name="duration" type="integer">
      Override the default slot duration in minutes
    </ResponseField>

    <ResponseField name="format" type="string">
      Response format: range (start and end) or time (start only)
    </ResponseField>

    <ResponseField name="booking_uid_to_reschedule" type="string">
      UID of the booking being rescheduled to exclude from busy calculations
    </ResponseField>

    ### Response

    ```json theme={null}
    {
      "$defs": {
        "GetBookableSlot": {
          "additionalProperties": false,
          "description": "A single available time slot.",
          "properties": {
            "time": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Time"
            },
            "start": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Start"
            },
            "end": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "End"
            }
          },
          "title": "GetBookableSlot",
          "type": "object"
        }
      },
      "additionalProperties": false,
      "properties": {
        "success": {
          "title": "Success",
          "type": "boolean"
        },
        "error": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Error"
        },
        "slots": {
          "additionalProperties": {
            "items": {
              "$ref": "#/$defs/GetBookableSlot"
            },
            "type": "array"
          },
          "title": "Slots",
          "type": "object"
        }
      },
      "required": [
        "success"
      ],
      "title": "GetBookableSlotsOutput",
      "type": "object"
    }
    ```
  </Accordion>

  <Accordion title="get_booking — Retrieve a booking by its UID">
    ### Parameters

    <ResponseField name="booking_id" type="string" required>
      The UID of the booking to retrieve
    </ResponseField>

    ### Response

    ```json theme={null}
    {
      "$defs": {
        "BookingItem": {
          "additionalProperties": false,
          "description": "A booking object returned by the Cal.com API.",
          "properties": {
            "uid": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Uid"
            },
            "title": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Title"
            },
            "status": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Status"
            },
            "start": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Start"
            },
            "end": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "End"
            },
            "attendees": {
              "items": {
                "additionalProperties": true,
                "type": "object"
              },
              "title": "Attendees",
              "type": "array"
            },
            "hosts": {
              "items": {
                "additionalProperties": true,
                "type": "object"
              },
              "title": "Hosts",
              "type": "array"
            },
            "event_type_id": {
              "anyOf": [
                {
                  "type": "integer"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Event Type Id"
            },
            "meeting_url": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Meeting Url"
            },
            "location": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Location"
            }
          },
          "title": "BookingItem",
          "type": "object"
        }
      },
      "additionalProperties": false,
      "properties": {
        "success": {
          "title": "Success",
          "type": "boolean"
        },
        "error": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Error"
        },
        "status": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Status"
        },
        "booking": {
          "anyOf": [
            {
              "$ref": "#/$defs/BookingItem"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        }
      },
      "required": [
        "success"
      ],
      "title": "GetBookingOutput",
      "type": "object"
    }
    ```
  </Accordion>

  <Accordion title="list_event_type_id_options — Retrieve available event types with their IDs">
    ### Response

    ```json theme={null}
    {
      "$defs": {
        "EventTypeOption": {
          "additionalProperties": false,
          "description": "An event type with its ID and title.",
          "properties": {
            "label": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Label"
            },
            "value": {
              "anyOf": [
                {
                  "type": "integer"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Value"
            }
          },
          "title": "EventTypeOption",
          "type": "object"
        }
      },
      "additionalProperties": false,
      "properties": {
        "success": {
          "title": "Success",
          "type": "boolean"
        },
        "error": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Error"
        },
        "event_types": {
          "items": {
            "$ref": "#/$defs/EventTypeOption"
          },
          "title": "Event Types",
          "type": "array"
        }
      },
      "required": [
        "success"
      ],
      "title": "ListEventTypeIdOptionsOutput",
      "type": "object"
    }
    ```
  </Accordion>
</AccordionGroup>

## Limits & Quotas

* Cal.com does not publicly document rate limits for the v2 API; enterprise plans may have higher thresholds.
* The free tier has a limited number of event types and team members.
* Error model: non-2xx responses and timeouts are caught and returned as `success=False` + `error` rather than raising.

## Related integrations

<CardGroup cols={3}>
  <Card title="Calendly" href="/integrations/tools/calendly" />

  <Card title="Google Calendar" href="/integrations/tools/google-calendar" />

  <Card title="Luma" href="/integrations/tools/luma" />
</CardGroup>

## Links

* [Cal.com](https://cal.com)
