Cal.com
Book, reschedule and cancel Cal.com meetings, find open slots, and manage event types, schedules, out-of-office and webhooks, cloud or self-hosted. Connect with an API key or OAuth.
- rest
https://api.superagnt.com/v1/connections/calcomplus the vendor's own path, with your superagnt_ API key asAuthorization: Bearer.- mcp
- Tools named
connection_calcom_*onhttps://mcp.superagnt.com/mcp, served once the account is connected. - billing
- Cal.com bills your own account. Calls cost no superagnt_ data credits.
- rate limit
- 5 requests a second, 120 a minute: the vendor's ceiling as the registry records it, for sizing bursts. Your plan's own limit is on Connections.
- sync
- Can copy 6 tables into your workspace database and keep them fresh: the tables.
The Cal.com connection lets an agent run scheduling on Cal.com, cloud or self-hosted. It finds open slots and books them, confirms or declines bookings that wait for the host, cancels, reschedules or reassigns meetings, marks no-shows, fetches Cal Video recordings and transcripts, manages event types, availability schedules and out-of-office periods, reads teams and organizations, and registers webhooks.
01
Setup
- Create a Cal.com API key. In Cal.com open Settings → Developer → API keys and create a key (
cal_live_...). Set it to never expire: keys expire after 30 days by default, and an expired key stops every call until you paste a new one. - Paste it. In the superagnt app open Integrations, pick Cal.com and paste the key. If Connect with Cal.com is offered, click Use API key instead to reach the key field. On a self-hosted Cal.com, also fill in Self-hosted API URL.
A Cal.com key has no scopes: it acts with your full Cal.com permissions.
API key or OAuth
An API key covers every tool. The Cal.com OAuth connection (Connect with Cal.com, where it is offered) requests only BOOKING_READ, BOOKING_WRITE, EVENT_TYPE_READ and PROFILE_READ, so it covers bookings, slots, event-type reads and your profile. These need an API key, and each tool's description says so:
- user-level webhooks, and creating, changing or deleting event-type webhooks
- schedules and out-of-office
- creating, updating and deleting event types
- updating your profile
- teams and organizations
When a workspace has both, calls use the OAuth connection, except on a self-hosted connection.
Self-hosted Cal.com
If you run Cal.com yourself, enter your instance's API v2 base URL in Self-hosted API URL when you paste the key, and leave it blank for Cal.com cloud (https://api.cal.com/v2). On a self-host, API v2 is its own service, so this is the full base URL, path included, for example https://cal-api.yourcompany.com/v2.
- It must be a public
https://address on the default port, with no query or login details. Private, internal and loopback addresses are refused when you save and again before every call. - superagnt_ checks the key with
GET /meagainst that URL before it saves the connection. - A connection with a self-hosted URL always uses its pasted key, never a Cal.com OAuth connection, which reaches only Cal.com cloud.
- To change the URL later, open the connection, enter the new URL (or tick Switch back to https://api.cal.com/v2) and paste the key again in the same save.
- The open-source edition (Cal.diy) has no teams, organizations or routing forms, so those tools answer 404 there.
02
Plans and limits
- Team tools need Cal.com's Teams plan and a team role. Organization tools need the Organizations plan and an org admin or owner. Use
organizationIdfromgetMeasorgId. - Routing-form responses are readable only on the Organizations plan. On Teams, form submissions reach you only as
FORM_SUBMITTEDwebhooks.
03
Things to know
- Booking tools take the booking
uid, not its numericid. listBookingsandlistOrganizationBookingspage by cursor: send each response'spagination.nextCursorback ascursoruntilpagination.hasMoreisfalse.limitis 1 to 100 (default 50).statuson those two takes one value. Omit it to walk every status; for several, run one request per status and merge on the bookinguid.- A booking's
updatedAtis null until it first changes, so an incremental pull pairsafterUpdatedAtwith anafterCreatedAtpass. - Most other lists (a team's members, bookings and schedules, the organization lists, webhooks and out-of-office) page with
takeandskip.takeis at most 250 on most of them, and 1,000 for organization users. - Attendees, hosts, no-show flags, cancellation and reschedule details (
rescheduledFromUid,rescheduledToUid) and booking-form answers come inline on every booking. - Rescheduling cancels the original booking and creates a new one with a new
uid. - Reassigning works only on round-robin bookings.
- Cal Video recording and transcript links expire after 1 hour, and Cal Video keeps recordings for 30 days.
- The connection does not cover Cal.com's deprecated Platform endpoints, API key refresh, credits, or edits to a booking's attendees, guests and location.
04
Permissions
These defaults decide whether a superagnt_ agent runs a call or waits for a person (Permissions). Reads run without asking. Creating and changing event types, schedules and out-of-office entries run by default. Creating or changing a webhook and updating your profile ask by default. Creating, cancelling, rescheduling, confirming, declining and reassigning bookings, marking no-shows, asking an attendee to reschedule, and every delete always ask a person first, because they email attendees or cannot be undone.
05
Examples
Check the connection
curl "https://api.superagnt.com/v1/connections/calcom/me" \
-H "Authorization: Bearer $AGNTDATA_API_KEY"List upcoming bookings
curl "https://api.superagnt.com/v1/connections/calcom/bookings?status=upcoming&limit=25" \
-H "Authorization: Bearer $AGNTDATA_API_KEY"Find open slots for an event type
curl "https://api.superagnt.com/v1/connections/calcom/slots?eventTypeId=12345&start=2026-11-02&end=2026-11-06&timeZone=America/Los_Angeles" \
-H "Authorization: Bearer $AGNTDATA_API_KEY"Create a booking
curl -X POST "https://api.superagnt.com/v1/connections/calcom/bookings" \
-H "Authorization: Bearer $AGNTDATA_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"eventTypeId": 12345,
"start": "2026-11-03T17:00:00Z",
"attendee": {
"name": "Jenny Rosen",
"email": "jenny.rosen@example.com",
"timeZone": "America/Los_Angeles"
}
}'Register a webhook
curl -X POST "https://api.superagnt.com/v1/connections/calcom/webhooks" \
-H "Authorization: Bearer $AGNTDATA_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"subscriberUrl": "https://api.superagnt.com/webhooks/ingest/<endpoint id>",
"active": true,
"triggers": ["BOOKING_CREATED", "BOOKING_RESCHEDULED", "BOOKING_CANCELLED"],
"version": "2021-10-20"
}'06
API versions
Cal.com versions each endpoint through a cal-api-version header and quietly answers an older response shape for a wrong or missing value. superagnt_ sends the version each endpoint's reference page names, and 2026-02-25, the bookings default, everywhere else. A REST caller can send its own cal-api-version header to override it.
| Endpoints | Version |
|---|---|
GET /bookings (cursor paging) | 2026-05-01 |
GET /organizations/* (organization bookings cursor paging) | 2026-05-01 |
GET /teams/* (team event types) | 2026-06-12 |
GET /event-types, GET /event-types/* | 2024-06-14 |
POST /event-types, PATCH /event-types/*, DELETE /event-types/* | 2026-06-12 |
/schedules, /schedules/* (every method) | 2024-06-11 |
GET /slots | 2024-09-04 |
Event-type reads stay on 2024-06-14 while creates and updates use 2026-06-12. A bookingFields array sent on an update replaces the whole set, so read the event type first and send every question you want kept.
07
Receiving Cal.com webhooks
createWebhook sends the user's events, across every event type, to a URL, and createEventTypeWebhook does the same for one event type. Both need an API-key connection. Point one at a superagnt_ inbound webhook endpoint to trigger an agent. Pick from 28 triggers (BOOKING_CREATED, BOOKING_RESCHEDULED, BOOKING_CANCELLED, BOOKING_NO_SHOW_UPDATED, MEETING_ENDED, RECORDING_READY, FORM_SUBMITTED, OOO_CREATED and more), and:
- Cal.com signs each delivery with
X-Cal-Signature-256, a hex HMAC-SHA256 of the body under the webhook'ssecret, with no timestamp. An inbound endpoint does not check that header, so leave the endpoint's signature verification off and keep its URL secret. A receiver of your own should setsecret, check the header and deduplicate deliveries. - Send
version: "2021-10-20"and never setpayloadTemplate, so every delivery has the standard shape. - The Cal Video no-show triggers (
AFTER_HOSTS_CAL_VIDEO_NO_SHOW,AFTER_GUESTS_CAL_VIDEO_NO_SHOW) also needtimeandtimeUnit. - Cal.com cloud delivers only to public
https://URLs. - Cal.com documents no delivery retries. Treat webhooks as best effort and reconcile with
listBookings(afterUpdatedAt).
08
Sync
A Cal.com sync copies your bookings, their attendees, your event types and availability schedules (and, when you turn them on, your teams and every webhook delivery) into tables in your workspace database and keeps them fresh, so agents read local tables instead of calling Cal.com on every run. Turn it on from the Sync panel on the Cal.com connection page in the superagnt app. The panel previews the rows and webhook events against your plan before anything is created. How syncs work in general: Vendor sync.
How updates arrive. On an API-key connection the sync registers one Cal.com webhook of its own for booking changes (created, rescheduled, cancelled, requested, rejected, no-show, reassigned, location changed and paid), with a secret only the sync holds, and checks the signature on every delivery. A delivery makes the sync re-read that booking from the API, so the tables always hold the API's shape. Polling picks up bookings created or updated since the last pass, and once a day re-reads the last week of bookings, because a cancellation or no-show may not change a booking's updatedAt. Triggers with no booking behind them (meetings started and ended, form submissions, recordings and more) are opt-in and land only in calcom_events.
Plans and scope.
- A connection made with OAuth syncs by polling only and cannot sync schedules or teams, because its grant covers bookings, event types and the profile. Connect with an API key for webhooks.
- Event types are a filter on the sync: pick the ones whose bookings it copies.
- The sync's calls share Cal.com's per-key rate limit with your agents' Cal.com tool calls, so it keeps well under it.
What a Cal.com sync copies
A sync copies these tables into your workspace database and keeps them fresh, so an agent reads local rows instead of calling Cal.com on every run. Turn tables on and off from the Sync panel on the connection. Every table also carries _raw, _hash, _synced_at and _deleted_at. How syncs work: Vendor sync.
| Table | What it holds | Default |
|---|---|---|
calcom_bookingsBookings | Every booking in the history window plus all upcoming ones, kept current by booking webhooks and a repair poll. | on |
calcom_booking_attendeesBooking attendees | One row per attendee (or seat) of each synced booking. | on |
calcom_event_typesEvent types | The bookable event types on the account, re-read every hour. | on |
calcom_schedulesSchedules | Availability schedules, re-read daily. Not available on an OAuth connection. | on |
calcom_teamsTeams | Teams the account belongs to, re-read daily. Not available on an OAuth connection. | off |
calcom_eventsWebhook events | One row per webhook delivery, including events with no other record (meetings started and ended, form submissions, recordings). Kept for 90 days by default. | off |
21 tools, one per resource and risk
MCP servers and agents on the grouped surface list Cal.com as these tools. Each takes an action, and the ones that work across record types an object. Every operation also keeps its own per-operation name, in the next table, which works on every server. How grouping works: Grouped tools.
| Tool | Risk | Actions |
|---|---|---|
connection_calcom_slots_readFind open Cal.com slots Find open booking slots for an event type in a date range. | read | available |
connection_calcom_event_types_readRead Cal.com event types List or get event types (the kinds of meeting people can book). | read | listget |
connection_calcom_event_types_writeCreate and edit Cal.com event types Create an event type, or change one (title, slug, length, description, visibility). | write | createupdate |
connection_calcom_event_types_deleteDelete Cal.com event types Delete an event type by id. People can no longer book it. | destructive | delete |
connection_calcom_schedules_readRead Cal.com availability schedules List the user's availability schedules, or get one (or the default one). | read | listgetdefault |
connection_calcom_schedules_writeCreate and edit Cal.com schedules Create an availability schedule, or change one (name, time zone, hours, date overrides, default). | write | createupdate |
connection_calcom_schedules_deleteDelete Cal.com schedules Delete an availability schedule by id. | destructive | delete |
connection_calcom_profile_readRead the Cal.com user Read the connected Cal.com user: id, time zone and preferences. | read | me |
connection_calcom_profile_writeUpdate the Cal.com user Change the connected user's name, email, time zone, time format, week start or default schedule. | write | update |
connection_calcom_out_of_office_readList Cal.com out-of-office entries List the user's out-of-office entries. | read | list |
connection_calcom_out_of_office_writeAdd and edit Cal.com out-of-office entries Add an out-of-office entry (dates, reason, notes, who bookings go to), or change one. | write | createupdate |
connection_calcom_out_of_office_deleteDelete Cal.com out-of-office entries Delete an out-of-office entry by id. | destructive | delete |
connection_calcom_bookings_readRead Cal.com bookings List bookings (filter by status, attendee email or date range) or get one booking by uid. | read | listgetrecordingstranscriptscalendar_links |
connection_calcom_bookings_writeBook and reschedule on Cal.com Book an event type for an attendee at a start time (find open slots with connection_calcom_slots_read first), or move an existing booking to a new start time. | write | createreschedule |
connection_calcom_booking_actions_writeAct on Cal.com bookings Confirm or decline a booking that needs approval, ask the attendee to reschedule, mark the host or attendees absent, or reassign the booking (automatically, or to a user). | write | confirmdeclinerequest_reschedulemark_absentreassignreassign_to_user |
connection_calcom_bookings_deleteCancel Cal.com bookings Cancel a booking by uid, with an optional reason. A cancelled booking cannot be restored. | destructive | cancel |
connection_calcom_teams_readRead Cal.com teams List the user's teams, or read one team: its members, bookings, event types or schedules. | read | listgetmembershipsmembershipbookingsevent_typesschedules |
connection_calcom_organization_readRead the Cal.com organization Read an organization's bookings, users, memberships, teams, routing forms, or one routing form's responses. | read | bookingsusersmembershipsteamsrouting_formsrouting_form_responses |
connection_calcom_webhooks_readRead Cal.com webhooks List or get the user's webhooks, or one event type's. | read | listgetlist_event_typeget_event_type |
connection_calcom_webhooks_writeCreate and edit Cal.com webhooks Create or change a webhook for the user, or for one event type (subscriber URL, triggers, secret, on/off). | write | createupdatecreate_event_typeupdate_event_type |
connection_calcom_webhooks_deleteDelete Cal.com webhooks Delete one of the user's webhooks, or one event type's. | destructive | deletedelete_event_type |
All 55 operations
Each operation is a REST path under https://api.superagnt.com/v1/connections/calcom and an MCP tool. The per-operation tool name is the one permissions, approvals and usage records use.
| Operation | MCP tool |
|---|---|
GET /meGet current user | connection_calcom_getmegrouped: connection_calcom_profile_read, action me |
PATCH /meUpdate current user | connection_calcom_updatemegrouped: connection_calcom_profile_write, action update |
GET /bookingsList bookings | connection_calcom_listbookingsgrouped: connection_calcom_bookings_read, action list |
POST /bookingsCreate a booking | connection_calcom_createbookinggrouped: connection_calcom_bookings_write, action create |
GET /bookings/{bookingUid}Get a booking | connection_calcom_getbookinggrouped: connection_calcom_bookings_read, action get |
POST /bookings/{bookingUid}/cancelCancel a booking | connection_calcom_cancelbookinggrouped: connection_calcom_bookings_delete, action cancel |
POST /bookings/{bookingUid}/rescheduleReschedule a booking | connection_calcom_reschedulebookinggrouped: connection_calcom_bookings_write, action reschedule |
POST /bookings/{bookingUid}/request-rescheduleRequest a reschedule | connection_calcom_requestbookingreschedulegrouped: connection_calcom_booking_actions_write, action request_reschedule |
POST /bookings/{bookingUid}/confirmConfirm a booking | connection_calcom_confirmbookinggrouped: connection_calcom_booking_actions_write, action confirm |
POST /bookings/{bookingUid}/declineDecline a booking | connection_calcom_declinebookinggrouped: connection_calcom_booking_actions_write, action decline |
POST /bookings/{bookingUid}/mark-absentMark no-shows | connection_calcom_markbookingabsentgrouped: connection_calcom_booking_actions_write, action mark_absent |
POST /bookings/{bookingUid}/reassignReassign to the next host | connection_calcom_reassignbookinggrouped: connection_calcom_booking_actions_write, action reassign |
POST /bookings/{bookingUid}/reassign/{userId}Reassign to a host | connection_calcom_reassignbookingtousergrouped: connection_calcom_booking_actions_write, action reassign_to_user |
GET /bookings/{bookingUid}/recordingsList booking recordings | connection_calcom_listbookingrecordingsgrouped: connection_calcom_bookings_read, action recordings |
GET /bookings/{bookingUid}/transcriptsList booking transcripts | connection_calcom_listbookingtranscriptsgrouped: connection_calcom_bookings_read, action transcripts |
GET /bookings/{bookingUid}/calendar-linksGet add-to-calendar links | connection_calcom_getbookingcalendarlinksgrouped: connection_calcom_bookings_read, action calendar_links |
GET /slotsGet available slots | connection_calcom_getavailableslotsgrouped: connection_calcom_slots_read, action available |
GET /event-typesList event types | connection_calcom_listeventtypesgrouped: connection_calcom_event_types_read, action list |
POST /event-typesCreate an event type | connection_calcom_createeventtypegrouped: connection_calcom_event_types_write, action create |
GET /event-types/{eventTypeId}Get an event type | connection_calcom_geteventtypegrouped: connection_calcom_event_types_read, action get |
PATCH /event-types/{eventTypeId}Update an event type | connection_calcom_updateeventtypegrouped: connection_calcom_event_types_write, action update |
DELETE /event-types/{eventTypeId}Delete an event type | connection_calcom_deleteeventtypegrouped: connection_calcom_event_types_delete, action delete |
GET /event-types/{eventTypeId}/webhooksList event type webhooks | connection_calcom_listeventtypewebhooksgrouped: connection_calcom_webhooks_read, action list_event_type |
POST /event-types/{eventTypeId}/webhooksCreate an event type webhook | connection_calcom_createeventtypewebhookgrouped: connection_calcom_webhooks_write, action create_event_type |
GET /event-types/{eventTypeId}/webhooks/{webhookId}Get an event type webhook | connection_calcom_geteventtypewebhookgrouped: connection_calcom_webhooks_read, action get_event_type |
PATCH /event-types/{eventTypeId}/webhooks/{webhookId}Update an event type webhook | connection_calcom_updateeventtypewebhookgrouped: connection_calcom_webhooks_write, action update_event_type |
DELETE /event-types/{eventTypeId}/webhooks/{webhookId}Delete an event type webhook | connection_calcom_deleteeventtypewebhookgrouped: connection_calcom_webhooks_delete, action delete_event_type |
GET /schedulesList schedules | connection_calcom_listschedulesgrouped: connection_calcom_schedules_read, action list |
POST /schedulesCreate a schedule | connection_calcom_createschedulegrouped: connection_calcom_schedules_write, action create |
GET /schedules/defaultGet the default schedule | connection_calcom_getdefaultschedulegrouped: connection_calcom_schedules_read, action default |
GET /schedules/{scheduleId}Get a schedule | connection_calcom_getschedulegrouped: connection_calcom_schedules_read, action get |
PATCH /schedules/{scheduleId}Update a schedule | connection_calcom_updateschedulegrouped: connection_calcom_schedules_write, action update |
DELETE /schedules/{scheduleId}Delete a schedule | connection_calcom_deleteschedulegrouped: connection_calcom_schedules_delete, action delete |
GET /me/oooList out-of-office entries | connection_calcom_listoutofofficegrouped: connection_calcom_out_of_office_read, action list |
POST /me/oooCreate an out-of-office entry | connection_calcom_createoutofofficegrouped: connection_calcom_out_of_office_write, action create |
PATCH /me/ooo/{oooId}Update an out-of-office entry | connection_calcom_updateoutofofficegrouped: connection_calcom_out_of_office_write, action update |
DELETE /me/ooo/{oooId}Delete an out-of-office entry | connection_calcom_deleteoutofofficegrouped: connection_calcom_out_of_office_delete, action delete |
GET /teamsList teams | connection_calcom_listteamsgrouped: connection_calcom_teams_read, action list |
GET /teams/{teamId}Get a team | connection_calcom_getteamgrouped: connection_calcom_teams_read, action get |
GET /teams/{teamId}/membershipsList team memberships | connection_calcom_listteammembershipsgrouped: connection_calcom_teams_read, action memberships |
GET /teams/{teamId}/memberships/{membershipId}Get a team membership | connection_calcom_getteammembershipgrouped: connection_calcom_teams_read, action membership |
GET /teams/{teamId}/bookingsList team bookings | connection_calcom_listteambookingsgrouped: connection_calcom_teams_read, action bookings |
GET /teams/{teamId}/event-typesList team event types | connection_calcom_listteameventtypesgrouped: connection_calcom_teams_read, action event_types |
GET /teams/{teamId}/schedulesList team member schedules | connection_calcom_listteamschedulesgrouped: connection_calcom_teams_read, action schedules |
GET /organizations/{orgId}/bookingsList organization bookings | connection_calcom_listorganizationbookingsgrouped: connection_calcom_organization_read, action bookings |
GET /organizations/{orgId}/usersList organization users | connection_calcom_listorganizationusersgrouped: connection_calcom_organization_read, action users |
GET /organizations/{orgId}/membershipsList organization memberships | connection_calcom_listorganizationmembershipsgrouped: connection_calcom_organization_read, action memberships |
GET /organizations/{orgId}/teamsList organization teams | connection_calcom_listorganizationteamsgrouped: connection_calcom_organization_read, action teams |
GET /organizations/{orgId}/routing-formsList routing forms | connection_calcom_listorganizationroutingformsgrouped: connection_calcom_organization_read, action routing_forms |
GET /organizations/{orgId}/routing-forms/{routingFormId}/responsesList routing form responses | connection_calcom_listroutingformresponsesgrouped: connection_calcom_organization_read, action routing_form_responses |
GET /webhooksList webhooks | connection_calcom_listwebhooksgrouped: connection_calcom_webhooks_read, action list |
POST /webhooksCreate a webhook | connection_calcom_createwebhookgrouped: connection_calcom_webhooks_write, action create |
GET /webhooks/{webhookId}Get a webhook | connection_calcom_getwebhookgrouped: connection_calcom_webhooks_read, action get |
PATCH /webhooks/{webhookId}Update a webhook | connection_calcom_updatewebhookgrouped: connection_calcom_webhooks_write, action update |
DELETE /webhooks/{webhookId}Delete a webhook | connection_calcom_deletewebhookgrouped: connection_calcom_webhooks_delete, action delete |