Webhook tool

Cal.com AI voice agents that book callers into open slots

The agent reads open Cal.com slots for an event type, offers two to the caller, and books the one they pick with their name and email.

Booking agent

Reads slots and books meetings.

Instructions

Ask what the caller needs, offer two slots from the slots tool, then book with the caller's name, email and time zone. Spell the email back. If the caller asks for a person, transfer to the team line.

Handoff
Team line

Connected tools

  • Get slotsWebhook
  • Create bookingWebhook
  • Transfer to team lineTransfer

What a Cal.com AI voice agent can do

Open one to watch a call. The grey lines are the tools the agent calls mid-sentence.

Open times come from Cal.com's slots endpoint for the event type, so the agent only offers times Cal.com lists as available.

Tool definitions

Webhook tools go to POST /v1/agents/tools. Transfers are a system tool on the agent. Replace the placeholder values in capitals with your own.

Webhook

Get slots

Lists available slots for an event type.

Show the JSON definition
get_slots
{
  "type": "webhook",
  "name": "get_slots",
  "description": "Lists available slots for the event type.",
  "pre_tool_speech": "auto",
  "execution_mode": "immediate",
  "response_timeout_secs": 20,
  "api_schema": {
    "url": "https://api.cal.com/v2/slots",
    "method": "GET",
    "query_params_schema": {
      "properties": {
        "eventTypeId": {
          "type": "integer",
          "constant_value": 12345678
        },
        "start": {
          "type": "string",
          "description": "Start of the range, ISO 8601 in UTC."
        },
        "end": {
          "type": "string",
          "description": "End of the range, ISO 8601 in UTC."
        }
      },
      "required": [
        "start",
        "end"
      ]
    },
    "request_headers": {
      "cal-api-version": "2024-09-04"
    },
    "authentication": {
      "mode": "bearer",
      "token": {
        "type": "secret",
        "secret_value": "YOUR_CAL_API_KEY"
      }
    }
  }
}

Webhook

Create booking

Creates a booking.

Show the JSON definition
create_booking
{
  "type": "webhook",
  "name": "create_booking",
  "description": "Books the slot the caller chose.",
  "pre_tool_speech": "auto",
  "execution_mode": "immediate",
  "response_timeout_secs": 20,
  "api_schema": {
    "url": "https://api.cal.com/v2/bookings",
    "method": "POST",
    "request_body_schema": {
      "type": "object",
      "properties": {
        "start": {
          "type": "string",
          "description": "The chosen slot start, ISO 8601 in UTC."
        },
        "eventTypeId": {
          "type": "integer",
          "constant_value": 12345678
        },
        "attendee": {
          "type": "object",
          "properties": {
            "name": {
              "type": "string",
              "description": "Caller's name."
            },
            "email": {
              "type": "string",
              "description": "Caller's email."
            },
            "timeZone": {
              "type": "string",
              "description": "IANA time zone, such as America/Chicago."
            },
            "phoneNumber": {
              "type": "string",
              "dynamic_variable": "system__caller_id"
            }
          },
          "required": [
            "name",
            "email",
            "timeZone"
          ]
        }
      },
      "required": [
        "start",
        "attendee"
      ]
    },
    "request_headers": {
      "cal-api-version": "2026-02-25"
    },
    "authentication": {
      "mode": "bearer",
      "token": {
        "type": "secret",
        "secret_value": "YOUR_CAL_API_KEY"
      }
    }
  }
}

Transfer

Transfer to team line

Cold transfer to your team line.

Show the JSON definition
transfer_to_team
{
  "config": {
    "system_tools": {
      "transfer_to_number": {
        "description": null,
        "pre_tool_speech": "auto",
        "transfers": [
          {
            "destination": {
              "type": "phone",
              "phone_number": "+14155550120"
            },
            "condition": "The caller asks for a person, or none of the open slots work."
          }
        ]
      }
    }
  }
}

Set it up

No native connector. The tools call Cal.com's v2 API directly, with an API key you store as a secret and the cal-api-version header. Vendor details read in October 2026.

  1. Create an API key

    In Cal.com Settings, open the Security tab and create an API key. Store it as a secret on both tools.

  2. Note the event type ID

    Replace 12345678 in eventTypeId with your event type's ID on both tools.

  3. Keep the API version headers

    Slots take cal-api-version 2024-09-04 and bookings take 2026-02-25, as the tools on this page send them.

  4. Test

    Book a slot and check the invite.

Before you build

Header versions differ by endpoint

Cal.com versions each endpoint with the cal-api-version header. Send a different value and Cal.com falls back to an older version of the endpoint.

SMS reminders need a phone

If the event type has SMS reminders on, Cal.com requires the attendee's phone number. The booking tool sends the caller's number from system__caller_id.

Enterprise-grade security

  • HIPAA compliant badge

    HIPAA compliant

  • SOC 2 Type 2 badge

    SOC 2 Type 2

  • GDPR badge

    GDPR

Cal.com AI voice agent FAQs

How does an AI voice agent book a Cal.com meeting?

It reads open slots for an event type from GET /v2/slots, offers the caller two, and creates the booking with POST /v2/bookings using the caller's name, email and time zone. Both tools send an API key you store as a secret, and the agent only offers slots Cal.com returns as available.

Which cal-api-version headers do the Cal.com tools need?

Slots take cal-api-version 2024-09-04 and bookings take 2026-02-25, as the tools on this page send them. Cal.com versions each endpoint with this header, and other values fall back to an older version of the endpoint.

What does a Cal.com voice agent cost to run?

Agents run at $0.03/min, plus LLM usage and telephony. Your Cal.com plan is billed separately. Transfers work only on Twilio and SIP trunk numbers, not on Cartesia numbers, so put the number on Twilio or a SIP trunk if the agent hands callers to staff.

Where do I get a Cal.com API key for the agent?

In Cal.com Settings, open the Security tab and create an API key. Store it as a secret on both tools, and replace 12345678 in eventTypeId with your event type's ID.

Does a Cal.com booking need the caller's phone number?

Cal.com requires the attendee's phone number when the event type has SMS reminders on. The booking tool sends the caller's number from system__caller_id, so the agent doesn't have to ask for it.

Get started today

Talk to an expert.

Connect with a member of our team and learn how Cartesia can help you build world-class voice experiences.

Contact Sales

Start building.

Access our models via API and bring a voice agent into production in minutes.

Try Cartesia