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

# Cal.com setup

ConfigView reads your Cal.com account through Cal.com's API v2, using an **API key** that you create in Cal.com.

You will end up with **1 secret** in ConfigView (`CALCOM_API_KEY`) when setup is complete.

> **Scope of this integration today.** ConfigView reads who has Cal.com and with what role, the teams they belong to, the video apps and calendars they have connected, the webhooks and workflows that send booking data to other systems, any domain-wide calendar access Cal.com has been given, and bookings from the last year and ahead. ConfigView only reads. It never creates, changes or cancels anything.

***

## Step 1: Open the Cal.com page in ConfigView

Open ConfigView in a second browser tab and leave it open:

`https://{companyname}.configview.com/admin/integrations/calcom`

Cal.com shows the key once, when you create it, so paste it straight into ConfigView instead of keeping it in a notes file.

***

## Step 2: Create an API key in Cal.com

1. Sign in to [Cal.com](https://app.cal.com/) as an **organization owner or admin**. See *Which user owns the key* below
2. Open **Settings → Security → API keys**
3. Create a new key. Name it `ConfigView` and choose **Never expires** if you can. A key with an expiry date stops working on that date without warning
4. Copy the key. A live key starts with `cal_live_`. A key starting with just `cal_` is a test-mode key and sees no real data
5. Switch to the ConfigView tab, paste it into `CALCOM_API_KEY` under **Credentials**, and click the save icon

### Which user owns the key

A Cal.com API key acts as the user who created it.

* **Organizations plan:** the organization-wide lists (users, memberships, teams, webhooks, bookings, delegation credentials) need the key's owner to be an organization **admin or owner**. A member's key gets a 403 on every one of them, so those tables stay empty and only the key owner's own data is collected.
* **Teams plan:** there is no organization-wide view. ConfigView reads the teams the key's owner belongs to, their members and their event types.

If the key's owner leaves and their account is removed, collection stops. A shared admin account that won't leave is the safer owner.

***

## Step 3: Connect and verify

1. Back on `https://{companyname}.configview.com/admin/integrations/calcom`, confirm the credential shows as saved
2. Click **Connect**. ConfigView creates its tables and schedules every collector at your default run time. Stop any you don't want under **Collectors**:

| Script | Notes |
| - | - |
| **Key Owner** | The Cal.com account behind the API key, and the organization it belongs to (empty on a Teams plan). |
| **Connected Calendars** | Calendars the key owner has connected (Google, Outlook, Apple, CalDAV): account email, read-only flag and whether each is checked for conflicts. |
| **Conferencing Apps** | Video apps (Zoom, Google Meet, Teams, Cal Video) the key owner has installed, and which one is their default. |
| **User Webhooks** | Webhooks on the key owner's account: the outside URL Cal.com posts booking data to, which events trigger it, and whether it is active. |
| **Event Types** | The key owner's bookable event types: length, video app or location, destination calendar, redirect URL and visibility. |
| **Schedules** | The key owner's availability schedules: name, time zone, whether it is the default, and how many blocks and overrides it has. |
| **Workflows** | The key owner's automated workflows: what triggers them and which emails, SMS, WhatsApp messages or AI phone calls they send. |
| **Verified Emails** | Email addresses verified on the key owner's account for sending workflow messages from. |
| **Bookings** | The key owner's bookings over the last year and ahead: host, attendee emails, status, times, location and video link. |
| **Organization Users** | Every user in the Cal.com organization: name, email, username, when the account was created and whether the email is verified. |
| **Organization Memberships** | Each user's role in the organization (owner, admin, member) and whether they accepted the invite. |
| **Organization Teams** | Teams inside the Cal.com organization, with their slug, privacy setting and time zone. |
| **Organization Roles** | Custom and built-in organization roles and the permissions each one grants. |
| **Organization Attributes** | Custom user attributes the organization defines (department, region, skills) and used for routing. |
| **Attribute Options** | The allowed values of each organization attribute. |
| **Organization Webhooks** | Organization-wide webhooks: the outside URL Cal.com sends booking data to for every member, and which events trigger it. |
| **Delegation Credentials** | Domain-wide calendar access granted to Cal.com: which Google Workspace or Microsoft 365 domain, the service account, and whether it is on. |
| **Organization Schedules** | Availability schedules of every user in the organization: owner, time zone, default flag, blocks and overrides. |
| **Out of Office** | Out-of-office entries across the organization: who, when, the reason, and who bookings are redirected to. |
| **Routing Forms** | Routing forms that send people who book to a team or person, with how many fields and routes each has. |
| **Routing Form Responses** | When each routing form was filled in and which booking it led to. The answers themselves are not stored. |
| **Organization Bookings** | Every booking in the organization over the last year and ahead: host, attendee emails, status, times, location and video link. |
| **Team Event Types** | Every team event type in the organization: round-robin or collective, hosts, video app and destination calendar. |
| **User Event Types** | Each organization user's personal event types: length, video app or location, destination calendar and redirect URL. |
| **Event Type Webhooks** | Webhooks attached to the key owner's event types: the outside URL that receives their bookings and which events trigger it. |
| **User Conferencing Apps** | Video apps each organization user has connected (Zoom, Google Meet, Teams, Cal Video), their default, and any broken connection. |
| **Team Memberships** | Who belongs to each organization team, their team role and whether they accepted. |
| **Team Workflows** | Automated team workflows: what triggers them and which emails, SMS, WhatsApp messages or AI phone calls they send. |
| **Team Conferencing Apps** | Video apps installed at team level and which one each team uses by default. |
| **Team Verified Emails** | Email addresses verified for a team to send workflow messages from. |
| **Teams** | Teams the key owner belongs to on a Cal.com Teams plan (Organizations accounts use Organization Teams). |
| **Teams-Plan Memberships** | Who belongs to each team on a Teams plan, their role and whether they accepted. |
| **Teams-Plan Event Types** | Team event types on a Teams plan: round-robin or collective, hosts, video app and destination calendar. |

3. Click **Verify now**. The health check confirms the key, reports whether this is an Organizations account, then reads one record from each kind of data the plan offers.

If a check fails:

* **Auth fails with 401.** The key is wrong, revoked, or past its expiry date. Create a new key and paste it again.
* **Organization checks are skipped with 403.** The key's owner is not an organization admin or owner. Create the key from an admin account.
* **"Teams (Teams plan)" is skipped on an Organizations account.** Expected: Cal.com serves team data to organizations under the organization endpoints instead.

***

## Data Tables

Once the scripts run, these tables are created in your database. Each includes a `run_at` column for historical tracking, and a `raw_json` column holding the record as Cal.com returned it, minus the fields listed under *What isn't collected*. Each table keeps only the newest run.

| Table | Source | Key Columns |
| - | - | - |
| `calcom_me` | `GET /v2/me` | user\_id, uuid, email, name, username, time\_zone, organization\_id, organization\_is\_platform |
| `calcom_calendars` | `GET /v2/calendars` | integration, integration\_title, account\_email, credential\_id, delegation\_credential\_id, calendar\_external\_id, calendar\_name, calendar\_email, is\_primary, read\_only, is\_selected, is\_destination |
| `calcom_conferencing` | `GET /v2/conferencing` | credential\_id, app\_type, app\_slug, owner\_user\_id, is\_default, invalid |
| `calcom_webhooks` | `GET /v2/webhooks` | webhook\_id, subscriber\_url, active, triggers, payload\_version, has\_payload\_template, has\_secret, delay\_value, delay\_unit |
| `calcom_event_types` | `GET /v2/event-types` | event\_type\_id, title, slug, length\_minutes, hidden, locations, destination\_calendar, owner\_id, schedule\_id, price, currency, seats\_per\_time\_slot, requires\_booker\_email\_verification, booking\_requires\_authentication, hide\_calendar\_event\_details, success\_redirect\_url, booking\_url, booking\_field\_count |
| `calcom_schedules` | `GET /v2/schedules` | schedule\_id, owner\_id, name, time\_zone, is\_default, availability\_blocks, override\_count |
| `calcom_workflows` | `GET /v2/workflows` | workflow\_id, name, workflow\_type, owner\_user\_id, owner\_team\_id, trigger\_type, active\_on\_all\_event\_types, active\_on\_event\_type\_ids, step\_actions, step\_recipients, step\_count, created\_at, updated\_at |
| `calcom_verified_emails` | `GET /v2/verified-resources/emails` | verified\_email\_id, email, owner\_user\_id, owner\_team\_id |
| `calcom_bookings` | `GET /v2/bookings` | booking\_id, uid, title, status, start\_time, end\_time, duration\_minutes, event\_type\_id, event\_type\_slug, host\_emails, attendee\_emails, attendee\_count, guest\_emails, location, meeting\_url, absent\_host, rating, cancelled\_by\_email, rescheduled\_by\_email, rescheduled\_from\_uid, created\_at, updated\_at |
| `calcom_org_users` | `GET /v2/organizations/{orgId}/users` | org\_id, user\_id, uuid, email, name, username, email\_verified\_at, verified, time\_zone, locale, invited\_to, created\_date |
| `calcom_org_memberships` | `GET /v2/organizations/{orgId}/memberships` | org\_id, membership\_id, member\_user\_id, member\_team\_id, member\_email, member\_name, member\_username, role, accepted, disable\_impersonation, attributes |
| `calcom_org_teams` | `GET /v2/organizations/{orgId}/teams` | org\_id, team\_id, name, slug, parent\_id, is\_organization, is\_private, hide\_book\_a\_team\_member, time\_zone |
| `calcom_org_roles` | `GET /v2/organizations/{orgId}/roles` | org\_id, role\_id, name, role\_type, description, permissions, permission\_count, created\_at, updated\_at |
| `calcom_org_attributes` | `GET /v2/organizations/{orgId}/attributes` | org\_id, attribute\_id, name, slug, attribute\_type, enabled, users\_can\_edit |
| `calcom_org_attribute_options` | `GET /v2/organizations/{orgId}/attributes/{attributeId}/options` | org\_id, attribute\_id, attribute\_name, option\_id, option\_value, slug |
| `calcom_org_webhooks` | `GET /v2/organizations/{orgId}/webhooks` | org\_id, webhook\_id, subscriber\_url, active, triggers, payload\_version, has\_payload\_template, has\_secret, delay\_value, delay\_unit, webhook\_team\_id |
| `calcom_org_delegation_credentials` | `GET /v2/organizations/{orgId}/delegation-credentials` | org\_id, credential\_id, domain, enabled, workspace\_platform, service\_account\_client\_id, created\_at, updated\_at |
| `calcom_org_schedules` | `GET /v2/organizations/{orgId}/schedules` | org\_id, schedule\_id, owner\_id, name, time\_zone, is\_default, availability\_blocks, override\_count |
| `calcom_org_ooo` | `GET /v2/organizations/{orgId}/ooo` | org\_id, ooo\_id, ooo\_user\_id, redirect\_to\_user\_id, start\_time, end\_time, reason |
| `calcom_org_routing_forms` | `GET /v2/organizations/{orgId}/routing-forms` | org\_id, routing\_form\_id, name, form\_team\_id, form\_user\_id, disabled, field\_count, route\_count, created\_at, updated\_at |
| `calcom_org_routing_form_responses` | `GET /v2/organizations/{orgId}/routing-forms/{routingFormId}/responses` | org\_id, routing\_form\_id, routing\_form\_name, response\_id, form\_filler\_id, routed\_to\_booking\_uid, created\_at |
| `calcom_org_bookings` | `GET /v2/organizations/{orgId}/bookings` | org\_id, booking\_id, uid, title, status, start\_time, end\_time, duration\_minutes, event\_type\_id, event\_type\_slug, host\_emails, attendee\_emails, attendee\_count, guest\_emails, location, meeting\_url, absent\_host, rating, cancelled\_by\_email, rescheduled\_by\_email, rescheduled\_from\_uid, created\_at, updated\_at |
| `calcom_org_team_event_types` | `GET /v2/organizations/{orgId}/teams/event-types` | org\_id, event\_type\_id, title, slug, length\_minutes, hidden, locations, destination\_calendar, owner\_id, schedule\_id, price, currency, seats\_per\_time\_slot, requires\_booker\_email\_verification, booking\_requires\_authentication, hide\_calendar\_event\_details, success\_redirect\_url, booking\_url, booking\_field\_count, event\_team\_id, scheduling\_type, assign\_all\_team\_members, host\_user\_ids, host\_count, parent\_event\_type\_id |
| `calcom_org_user_event_types` | `GET /v2/event-types?username=&orgId=` | org\_id, user\_id, username, user\_email, event\_type\_id, title, slug, length\_minutes, hidden, locations, destination\_calendar, owner\_id, schedule\_id, price, currency, seats\_per\_time\_slot, requires\_booker\_email\_verification, booking\_requires\_authentication, hide\_calendar\_event\_details, success\_redirect\_url, booking\_url, booking\_field\_count |
| `calcom_org_event_type_webhooks` | `GET /v2/event-types/{eventTypeId}/webhooks` | event\_type\_id, event\_type\_slug, webhook\_id, subscriber\_url, active, triggers, payload\_version, has\_payload\_template, has\_secret, delay\_value, delay\_unit |
| `calcom_org_user_conferencing` | `GET /v2/organizations/{orgId}/users/{userId}/conferencing` | org\_id, user\_id, username, user\_email, credential\_id, app\_type, app\_slug, owner\_user\_id, is\_default, invalid |
| `calcom_org_team_memberships` | `GET /v2/organizations/{orgId}/teams/{teamId}/memberships` | org\_id, team\_id, team\_name, membership\_id, member\_user\_id, member\_team\_id, member\_email, member\_name, member\_username, role, accepted, disable\_impersonation |
| `calcom_org_team_workflows` | `GET /v2/organizations/{orgId}/teams/{teamId}/workflows` | org\_id, team\_id, team\_name, workflow\_id, name, workflow\_type, owner\_user\_id, owner\_team\_id, trigger\_type, active\_on\_all\_event\_types, active\_on\_event\_type\_ids, step\_actions, step\_recipients, step\_count, created\_at, updated\_at |
| `calcom_org_team_conferencing` | `GET /v2/organizations/{orgId}/teams/{teamId}/conferencing` | org\_id, team\_id, team\_name, credential\_id, app\_type, app\_slug, owner\_user\_id, is\_default, invalid |
| `calcom_org_team_verified_emails` | `GET /v2/organizations/{orgId}/teams/{teamId}/verified-resources/emails` | org\_id, team\_id, team\_name, verified\_email\_id, email, owner\_user\_id, owner\_team\_id |
| `calcom_teams` | `GET /v2/teams` | team\_id, name, slug, parent\_id, is\_organization, is\_private, hide\_book\_a\_team\_member, time\_zone |
| `calcom_team_memberships` | `GET /v2/teams/{teamId}/memberships` | team\_id, team\_name, membership\_id, member\_user\_id, member\_team\_id, member\_email, member\_name, member\_username, role, accepted, disable\_impersonation |
| `calcom_team_event_types` | `GET /v2/teams/{teamId}/event-types` | team\_id, team\_name, event\_type\_id, title, slug, length\_minutes, hidden, locations, destination\_calendar, owner\_id, schedule\_id, price, currency, seats\_per\_time\_slot, requires\_booker\_email\_verification, booking\_requires\_authentication, hide\_calendar\_event\_details, success\_redirect\_url, booking\_url, booking\_field\_count, event\_team\_id, scheduling\_type, assign\_all\_team\_members, host\_user\_ids, host\_count, parent\_event\_type\_id |

***

## Things worth knowing

**About half the tables will be empty, and that's expected.** Cal.com serves organization data only to Organizations accounts and team data only to Teams accounts. ConfigView collects both families. `calcom_me.organization_id` tells you which one applies: when it's filled in, read the `calcom_org_*` tables.

**Connected calendars are the key owner's only.** Cal.com has no organization-wide list of connected calendars. To see who else gave Cal.com access to their calendar, look at the Google Workspace or Microsoft 365 integration's app grants.

**`locations` names the video app.** An event type's `locations` column reads like `integration:zoom` or `integration:google-meet`. That's where a booking's meeting link comes from.

**Bookings cover a rolling window.** Each run reads bookings that started in the last 365 days plus everything booked ahead. Older bookings drop out of the table.

**Event type webhooks are the key owner's only.** Cal.com refuses to show webhooks on another user's event type, even to an organization admin. Organization-wide webhooks are collected in full.

**User event types are the public list.** `calcom_org_user_event_types` reads each user's booking page, so event types they've hidden may be missing.

## What isn't collected

* Webhook signing secrets. `has_secret` records only that one exists
* Booking descriptions, booking-form answers and cancellation or rescheduling reasons, which are free text typed in by the person booking
* Routing form answers. Only when a form was filled in and which booking it led to
* Meeting recordings and transcripts


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.