{
 "slug": "cal",
 "name": "Cal.com",
 "url": "https://cal.com",
 "domain": "cal.com",
 "category": "scheduling",
 "category_name": "Scheduling",
 "tested_at": "2026-10-06",
 "run": "20261006T061829Z",
 "draft": false,
 "reviewed": true,
 "owner_verified": null,
 "origin": "editorial",
 "history": [
  {
   "run": "20261001T193351Z",
   "date": "2026-10-01",
   "level": 1,
   "engine": {
    "runner": "omp",
    "model": null,
    "driver": null,
    "signed": true,
    "inbox": [
     "agentdrives.com"
    ],
    "robots": "start"
   },
   "drives": 2
  },
  {
   "run": "20261006T061829Z",
   "date": "2026-10-06",
   "level": 1,
   "engine": {
    "runner": "omp",
    "model": "claude-opus-5-5",
    "driver": 2,
    "signed": true,
    "inbox": [
     "agentdrives.com"
    ],
    "robots": "start"
   }
  }
 ],
 "level": 1,
 "level_name": "Needs a person",
 "level_selfhost": null,
 "entry": "closed",
 "door": {
  "passed": 0,
  "tries": 3,
  "self_start": false
 },
 "badges": [],
 "stages": [
  {
   "key": "in",
   "label": "Access",
   "state": "no",
   "text": "Can't get in on its own",
   "at": "signup"
  },
  {
   "key": "work",
   "label": "Use",
   "state": "unreached",
   "text": "Work not measured"
  },
  {
   "key": "pay",
   "label": "Pay",
   "state": "unreached",
   "text": "Payment not reached",
   "value": "unreached",
   "route": "card_checkout"
  },
  {
   "key": "leave",
   "label": "Leave",
   "state": "unreached",
   "text": "Leaving not reached",
   "how": "no-account"
  }
 ],
 "outcomes": [
  {
   "key": "find",
   "label": "Find",
   "state": "yes",
   "text": "Docs agents can read: llms.txt, an OpenAPI and an MCP server",
   "have": [
    "llms_txt",
    "openapi",
    "mcp"
   ]
  },
  {
   "key": "access",
   "label": "Access",
   "state": "no",
   "text": "Can't get in on its own",
   "at": "signup",
   "stage": "in"
  },
  {
   "key": "use",
   "label": "Use",
   "state": "unreached",
   "text": "Work not measured",
   "stage": "work"
  },
  {
   "key": "pay",
   "label": "Pay",
   "state": "unreached",
   "text": "Payment not reached",
   "value": "unreached",
   "route": "card_checkout",
   "stage": "pay"
  },
  {
   "key": "leave",
   "label": "Leave",
   "state": "unreached",
   "text": "Leaving not reached",
   "how": "no-account",
   "stage": "leave"
  }
 ],
 "access": [
  {
   "key": "person",
   "label": "A person sets it up",
   "routes": [],
   "minutes": null,
   "core": null
  }
 ],
 "minutes": null,
 "next": {
  "to": 2,
  "text": "Next: let an agent sign up on its own"
 },
 "stop": "signup",
 "core": "0/8",
 "scores": {
  "coverage": null,
  "reliability": null,
  "resilience": null,
  "setup": 100,
  "surface_coverage": null,
  "docs_accuracy": null,
  "docs_completeness": null
 },
 "parts": {
  "holds_up": null,
  "docs_match": null,
  "setup": 100,
  "security": null,
  "standards": [
   {
    "standard": "MCP client registration",
    "state": "behind",
    "behind": null,
    "value": "dcr"
   },
   {
    "standard": "OpenAPI",
    "state": "behind",
    "behind": 2,
    "value": "3.0.0"
   }
  ]
 },
 "reliability_method": null,
 "resilience": null,
 "stress": [],
 "surface_audit": null,
 "coverage_core": null,
 "after_wall": null,
 "coverage_source": "computed",
 "driver": {
  "version": 2,
  "model": "claude-opus-5-5",
  "profile": "full",
  "assisted": false,
  "handoff": null,
  "prompt_sha": "f3d0adeeb256",
  "kb_version": "2+overlay-9e43028a2c",
  "identity": null
 },
 "methodology": 15,
 "rules_date": "2026-10-15",
 "engine": {
  "runner": "omp",
  "model": "claude-opus-5-5",
  "driver": 2,
  "signed": true,
  "inbox": [
   "agentdrives.com"
  ],
  "robots": "start"
 },
 "same_level_drives": 3,
 "drives": 3,
 "works_assisted": null,
 "freshness": "fresh",
 "nothing_to_pay": false,
 "core_gated": false,
 "profiles": {},
 "agent_check": {
  "rung": "signup",
  "vendor": "Cloudflare Turnstile",
  "visible": true,
  "type": "network",
  "human": null,
  "how": "Let verified bots and signed agents past the check on sign-up: in Cloudflare, add a WAF custom rule that skips the bot challenge on your sign-up paths for verified bots and for signed agents (rule field cf.bot_management.signed_agent; since 1 July 2026 signed agents count as verified bots), and render Turnstile only when the request is not from a verified agent.",
  "signed": true
 },
 "agent_pass": null,
 "who_gets_in": {
  "server": {
   "state": "form"
  },
  "signed": {
   "state": "page",
   "kind": "signup",
   "at": "2026-10-12"
  },
  "browser": {
   "state": "through",
   "measured": false
  },
  "our_key": "pending",
  "robots": null,
  "tip": false
 },
 "ladder": {
  "docs": {
   "status": "headless",
   "note": "llms.txt, docs llms.txt with .md pages, OpenAPI 3.0.0 (235 paths, 356 operations), auth.md, agent-skills index, api-catalog, AI catalog: all fetched headless."
  },
  "signup": {
   "status": "human",
   "note": "No sign-up API (auth.md: no agent self-registration). Web form at app.cal.com/signup shows a visible Cloudflare Turnstile 'Verify you are human' that did not clear for our agent's browser; Get started stayed disabled."
  },
  "verify": {
   "status": "",
   "note": "Not reached: no account created.",
   "reached": false
  },
  "credentials": {
   "status": "",
   "note": "MCP DCR registration works headless (201 client_id), but authorization redirects to app.cal.com sign-in/consent and API keys are made in web settings; both need an account. No device flow or CIMD.",
   "reached": false
  },
  "first_call": {
   "status": "",
   "note": "Unauthenticated calls answer 401/403 with clear JSON errors; no credentials to go further. MCP server/discover answers 401 Bearer token required.",
   "reached": false
  },
  "first_action": {
   "status": "",
   "note": "No credentials.",
   "reached": false
  },
  "pay": {
   "status": "",
   "grade": "P1",
   "rails": [],
   "rail_ids": [],
   "first_party": false,
   "rail_scope": "none",
   "trial_path": "free tier",
   "note": "No 402 anywhere, x402./mpp./agents. subdomains do not resolve, no x-payment-info, not listed in x402 Bazaar or mpp.dev. No plan billing in the API (only credits and Stripe Connect for booking payments). Paid plans ($12/$28 per user/month, 14 day free trial) are bought in the web app after a sign-up a human must pass; checkout not observed, card requirement for the trial unknown.",
   "reached": false
  },
  "cancel": {
   "status": "",
   "grade": "n/a",
   "note": "No plan was started.",
   "reached": false
  },
  "delete": {
   "status": "",
   "note": "No account to delete; the OpenAPI has no DELETE /v2/me, so deletion is not an API call. The MCP DCR client registration we created could not be deleted (no client delete endpoint is advertised).",
   "account": false,
   "reached": false
  }
 },
 "routes": [],
 "checkout": null,
 "docs": null,
 "claims": null,
 "pay_options": {
  "checked": "2026-10-06",
  "source": "drive",
  "options": [],
  "agentic": [],
  "paid": null,
  "exercised": null,
  "detected_grade": null,
  "trial": {
   "no_card": null,
   "card_required": null,
   "free_plan": true
  },
  "owner_fixes": [
   {
    "title": "Accept x402 or MPP on your API",
    "how": "Answer an unpaid call with 402 and a payment challenge, so an agent pays per call or buys credits without an account or a card."
   },
   {
    "title": "List your plans on Stripe Projects",
    "how": "Agents buy a plan with `stripe projects add`, paid with a token under a spend cap the owner sets (projects.dev)."
   }
  ]
 },
 "surfaces": {
  "api": true,
  "openapi": true,
  "cli": false,
  "sdk": true,
  "mcp": "official",
  "llms_txt": true,
  "webhooks": true,
  "sandbox": false
 },
 "surface_notes": {
  "api": "REST v2, 235 paths / 356 operations, cal-api-version header",
  "openapi": "3.0.0, behind 3.2.1",
  "mcp": "official hosted, OAuth 2.1 with DCR; not driven (no account)",
  "sdk": "Atoms React components (llms.txt)",
  "llms_txt": "site and docs llms.txt; docs pages served as markdown"
 },
 "can_do": [
  "Discover the API, MCP server, OAuth metadata and agent skills from well-known files without an account",
  "Register an OAuth client on the MCP server headless (DCR)"
 ],
 "cannot_do": [
  {
   "what": "Create a Cal.com account",
   "why": "Cloudflare Turnstile on the sign-up form did not clear for our agent's browser; no API sign-up"
  },
  {
   "what": "Get an API key or MCP token",
   "why": "Both need a signed-in Cal.com user"
  },
  {
   "what": "Any core scheduling task (event types, availability, bookings)",
   "why": "No credentials"
  },
  {
   "what": "Delete the account headless",
   "why": "No DELETE /v2/me in the OpenAPI"
  }
 ],
 "blockers": [
  "Visible Cloudflare Turnstile on https://app.cal.com/signup"
 ],
 "tips_for_owner": [
  "Let signed agents pass the sign-up Turnstile",
  "Offer a headless agent sign-up or claim",
  "Fix the API protected-resource link",
  "Support MCP (the 28 Jul 2026 spec) discovery and CIMD",
  "Add an account delete endpoint"
 ],
 "tips_for_agents": [
  "Start at https://cal.com/auth.md and https://cal.com/.well-known/api-catalog: they list every machine-readable entry point.",
  "Every API v2 call needs a cal-api-version header whose value is per-endpoint in openapi.json.",
  "Get the human to create the account and an API key at app.cal.com/settings/developer/api-keys; sign-up has a Turnstile an agent cannot pass.",
  "Use https://cal.com/.well-known/oauth-protected-resource, not the api.cal.com one (410).",
  "Docs pages are available as markdown: append .md or send Accept: text/markdown."
 ],
 "selfhost": {
  "install": {
   "status": "skipped",
   "minutes": 0,
   "note": "no docker in the drive sandbox; self-hosted edition is Cal.diy (MIT), https://github.com/calcom/cal.diy per llms.txt"
  }
 },
 "summary": "Cal.com is very well prepared for agents on paper: AI catalog, MCP server card, auth.md, agent skills, llms.txt with markdown docs and a 356-operation OpenAPI. But sign-up has no API and the web form shows a Cloudflare Turnstile that did not clear for our signed agent browser, so the drive never got credentials and drove no core capability.",
 "wall": "Cloudflare Turnstile on the sign-up form",
 "plan_scope": "",
 "robots_stop": null,
 "robots": null,
 "plain": {
  "summary": "Cal.com is a scheduling tool that publishes a lot of machine-readable information for AI agents (docs, API spec, an MCP server). An agent could read all of that on its own, but could not create an account because the sign-up page shows a 'prove you're human' check that the agent's browser could not get past. Without an account, nothing else could be tested.",
  "can_do": [
   "Find and read all the tool's public documentation and API descriptions automatically",
   "Register itself as an API client with the scheduling server (a technical step short of a real account)"
  ],
  "cannot_do": [
   {
    "what": "Create a Cal.com account",
    "why": "The sign-up form has a human-verification check the agent could not pass"
   },
   {
    "what": "Get an API key or scheduling access",
    "why": "Both require a signed-in account, which could not be created"
   },
   {
    "what": "Create, book, reschedule, or cancel any meeting",
    "why": "No account or credentials were ever obtained"
   },
   {
    "what": "Delete the account",
    "why": "There is no account, and the tool's API offers no delete function anyway"
   }
  ]
 },
 "plan_gated": [],
 "reply": null,
 "capabilities": [
  {
   "id": "cap-01",
   "group": "Scheduling",
   "capability": "Create an event type (booking template)",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "POST /v2/event-types",
    "mcp": null,
    "cli": null,
    "ui": "Event Types page"
   },
   "check": "GET /v2/event-types/{id} returns the new event type",
   "source": "https://cal.com/docs/api-reference/v2/event-types/create-an-event-type; https://cal.com/pricing"
  },
  {
   "id": "cap-02",
   "group": "Scheduling",
   "capability": "Connect a calendar (Google/Outlook/Apple/Zoho) to sync availability",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "POST /v2/calendars/{calendar}/connect",
    "mcp": null,
    "cli": null,
    "ui": "Apps > Calendars settings"
   },
   "check": "GET /v2/calendars shows the connected calendar",
   "source": "https://cal.com/ (How it works: Connect your calendar); https://cal.com/pricing"
  },
  {
   "id": "cap-03",
   "group": "Scheduling",
   "capability": "Set availability (working hours, buffers, notice period)",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "POST /v2/schedules",
    "mcp": null,
    "cli": null,
    "ui": "Availability settings"
   },
   "check": "GET /v2/schedules/{id} reflects configured hours/buffers",
   "source": "https://cal.com/docs/api-reference/v2/schedules/create-a-schedule; https://cal.com/pricing"
  },
  {
   "id": "cap-04",
   "group": "Scheduling",
   "capability": "Book a meeting on someone's public booking link",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "POST /v2/bookings",
    "mcp": null,
    "cli": null,
    "ui": "cal.com/{username}/{event} booking page"
   },
   "check": "GET /v2/bookings/{uid} returns status accepted",
   "source": "https://cal.com/docs/api-reference/v2/bookings/create-a-booking"
  },
  {
   "id": "cap-05",
   "group": "Scheduling",
   "capability": "Reschedule a booking",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "POST /v2/bookings/{uid}/reschedule",
    "mcp": null,
    "cli": null,
    "ui": "Bookings page / booking confirmation email link"
   },
   "check": "GET /v2/bookings/{uid} shows new start time",
   "source": "https://cal.com/pricing (Meeting rescheduling); https://cal.com/docs/api-reference/v2/bookings"
  },
  {
   "id": "cap-06",
   "group": "Scheduling",
   "capability": "Cancel a booking",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "POST /v2/bookings/{uid}/cancel",
    "mcp": null,
    "cli": null,
    "ui": "Bookings page / cancellation link"
   },
   "check": "GET /v2/bookings/{uid} shows status cancelled",
   "source": "https://cal.com/pricing (Meeting cancellation); https://cal.com/docs/api-reference/v2/bookings"
  },
  {
   "id": "cap-07",
   "group": "Scheduling",
   "capability": "Choose meeting location/conferencing tool (Zoom, Google Meet, Teams, Cal Video, phone, in person)",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "POST /v2/event-types (locations field)",
    "mcp": null,
    "cli": null,
    "ui": "Event type > Location setting"
   },
   "check": "GET /v2/event-types/{id} shows configured location",
   "source": "https://cal.com/ (Choose how to meet); https://cal.com/pricing (Set custom meeting locations)"
  },
  {
   "id": "cap-08",
   "group": "Scheduling",
   "capability": "View upcoming/past bookings in calendar or list",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "GET /v2/bookings",
    "mcp": null,
    "cli": null,
    "ui": "Bookings page"
   },
   "check": "GET /v2/bookings returns list matching UI",
   "source": "https://cal.com/pricing (Booking calendar & list view)"
  },
  {
   "id": "cap-09",
   "group": "Scheduling",
   "capability": "Reassign a booking to another team member",
   "weight": "secondary",
   "plan": "teams",
   "surfaces": {
    "api": "POST /v2/bookings/{uid}/reassign",
    "mcp": null,
    "cli": null,
    "ui": "Bookings page > Reassign"
   },
   "check": "GET /v2/bookings/{uid} shows new host",
   "source": "https://cal.com/pricing (Meeting reassignment)"
  },
  {
   "id": "cap-10",
   "group": "Payments",
   "capability": "Accept payment for a booking via Stripe or PayPal",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "event type payment settings via /v2/event-types",
    "mcp": null,
    "cli": null,
    "ui": "Event type > Apps > Stripe/PayPal"
   },
   "check": "booking payload shows payment status paid",
   "source": "https://cal.com/ (Accept payments); https://cal.com/pricing (Stripe & Paypal for booking payments)"
  },
  {
   "id": "cap-11",
   "group": "Communication",
   "capability": "Send automated booking reminders/workflows (email, SMS)",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "POST /v2/workflows",
    "mcp": null,
    "cli": null,
    "ui": "Workflows page"
   },
   "check": "GET /v2/workflows/{id} shows configured trigger and steps",
   "source": "https://cal.com/features/workflows; https://cal.com/pricing"
  },
  {
   "id": "cap-12",
   "group": "Communication",
   "capability": "Customize booking confirmation questions/fields",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "event type bookingFields via /v2/event-types",
    "mcp": null,
    "cli": null,
    "ui": "Event type > Advanced > Booking questions"
   },
   "check": "GET /v2/event-types/{id} shows custom fields",
   "source": "https://cal.com/pricing (Change booking questions)"
  },
  {
   "id": "cap-13",
   "group": "Scheduling",
   "capability": "Require host approval before booking is confirmed",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "event type requiresConfirmation flag",
    "mcp": null,
    "cli": null,
    "ui": "Event type > Advanced > Requires confirmation"
   },
   "check": "booking created with status pending until accepted",
   "source": "https://cal.com/features/requires-confirmation; https://cal.com/pricing"
  },
  {
   "id": "cap-14",
   "group": "Scheduling",
   "capability": "Create a private, invite-only booking link",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "event type hidden/private link via /v2/event-types",
    "mcp": null,
    "cli": null,
    "ui": "Event type > sharing settings"
   },
   "check": "event type not listed publicly but reachable via private link",
   "source": "https://cal.com/pricing (Private links)"
  },
  {
   "id": "cap-15",
   "group": "Scheduling",
   "capability": "Offer group sessions with multiple seats per slot",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "event type seatsPerTimeSlot via /v2/event-types",
    "mcp": null,
    "cli": null,
    "ui": "Event type > Advanced > Offer seats"
   },
   "check": "GET /v2/event-types/{id} shows seats configuration",
   "source": "https://cal.com/pricing (Offer seats)"
  },
  {
   "id": "cap-16",
   "group": "Scheduling",
   "capability": "Set up recurring events (repeating bookings)",
   "weight": "secondary",
   "plan": "teams",
   "surfaces": {
    "api": "event type recurringEvent via /v2/event-types",
    "mcp": null,
    "cli": null,
    "ui": "Event type > Recurring"
   },
   "check": "booking series created with recurringEventId",
   "source": "https://cal.com/features/recurring-events; https://cal.com/pricing"
  },
  {
   "id": "cap-17",
   "group": "Teams",
   "capability": "Create a team and add shared availability",
   "weight": "secondary",
   "plan": "teams",
   "surfaces": {
    "api": "POST /v2/teams",
    "mcp": null,
    "cli": null,
    "ui": "Settings > Teams"
   },
   "check": "GET /v2/teams/{id} shows team members",
   "source": "https://cal.com/pricing (1 team, shared availability)"
  },
  {
   "id": "cap-18",
   "group": "Teams",
   "capability": "Set up round-robin scheduling across a team",
   "weight": "secondary",
   "plan": "teams",
   "surfaces": {
    "api": "event type schedulingType round_robin via /v2/event-types",
    "mcp": null,
    "cli": null,
    "ui": "Team event type > Assignment > Round Robin"
   },
   "check": "bookings distributed across hosts per weights/priority",
   "source": "https://cal.com/pricing (Round-robin scheduling)"
  },
  {
   "id": "cap-19",
   "group": "Teams",
   "capability": "Create collective event types (multiple hosts attend together)",
   "weight": "secondary",
   "plan": "teams",
   "surfaces": {
    "api": "event type schedulingType collective via /v2/event-types",
    "mcp": null,
    "cli": null,
    "ui": "Team event type > Assignment > Collective"
   },
   "check": "booking includes all collective hosts as attendees",
   "source": "https://cal.com/pricing (Collective events)"
  },
  {
   "id": "cap-20",
   "group": "Teams",
   "capability": "Create managed event types (admin-controlled templates pushed to members)",
   "weight": "secondary",
   "plan": "teams",
   "surfaces": {
    "api": "POST /v2/organizations/{orgId}/event-types (managed)",
    "mcp": null,
    "cli": null,
    "ui": "Team event type > Managed"
   },
   "check": "GET /v2/event-types shows copies on member accounts",
   "source": "https://cal.com/pricing (Managed events)"
  },
  {
   "id": "cap-21",
   "group": "Routing",
   "capability": "Build a routing form to route bookings to the right person/team",
   "weight": "secondary",
   "plan": "teams",
   "surfaces": {
    "api": "routing forms endpoints under /v2/organizations/{orgId}/teams/{teamId}/routing-forms",
    "mcp": null,
    "cli": null,
    "ui": "Routing Forms page"
   },
   "check": "GET routing-forms/{id} shows configured routing rules",
   "source": "https://cal.com/routing; https://cal.com/pricing (Basic routing, Routing forms)"
  },
  {
   "id": "cap-23",
   "group": "Insights",
   "capability": "View booking analytics/insights (trends, team workload)",
   "weight": "secondary",
   "plan": "teams",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Insights page"
   },
   "check": "Insights page renders charts for the account's bookings",
   "source": "https://cal.com/pricing (Insights - analytics, Booking analytics)"
  },
  {
   "id": "cap-24",
   "group": "Automation",
   "capability": "Subscribe to booking events via webhooks",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "POST /v2/webhooks",
    "mcp": null,
    "cli": null,
    "ui": "Settings > Developer > Webhooks"
   },
   "check": "GET /v2/webhooks/{id} shows subscribed triggers; test ping delivered",
   "source": "https://cal.com/docs/developing/guides/automation/webhooks; https://cal.com/pricing"
  },
  {
   "id": "cap-27",
   "group": "Integrations",
   "capability": "Two-way sync bookings/contacts with Salesforce or HubSpot CRM",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Apps > Salesforce/HubSpot"
   },
   "check": "contact/event record created in CRM after a booking",
   "source": "https://cal.com/docs/developing/guides/appstore-and-integration/salesforce.md; https://cal.com/pricing (Two-way Salesforce & HubSpot sync)"
  },
  {
   "id": "cap-30",
   "group": "Embedding",
   "capability": "Embed the booking page into an external site",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Event type > Embed"
   },
   "check": "embedded iframe/snippet renders booking widget on external page",
   "source": "https://cal.com/embed; https://cal.com/ (Easy embeds)"
  },
  {
   "id": "cap-34",
   "group": "Customization",
   "capability": "Set a custom short booking link/username",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "PATCH /v2/me (username)",
    "mcp": null,
    "cli": null,
    "ui": "Settings > My profile"
   },
   "check": "booking URL cal.com/{username} resolves to the user's page",
   "source": "https://cal.com/ (Stand out with a custom booking link)"
  },
  {
   "id": "cap-22",
   "group": "Routing",
   "capability": "Route bookings by custom attribute (region, role, priority)",
   "weight": "peripheral",
   "plan": "organizations",
   "surfaces": {
    "api": "POST /v2/organizations/{orgId}/attributes",
    "mcp": null,
    "cli": null,
    "ui": "Organization > Attributes"
   },
   "check": "GET /v2/organizations/{orgId}/attributes shows attribute used in routing form",
   "source": "https://cal.com/pricing (Attribute based routing, Member attributes)"
  },
  {
   "id": "cap-25",
   "group": "Automation",
   "capability": "Redirect bookers to a custom URL after booking",
   "weight": "peripheral",
   "plan": "teams",
   "surfaces": {
    "api": "event type successRedirectUrl via /v2/event-types",
    "mcp": null,
    "cli": null,
    "ui": "Event type > Advanced > Redirect on booking"
   },
   "check": "GET /v2/event-types/{id} shows successRedirectUrl set",
   "source": "https://cal.com/pricing (Redirect on booking)"
  },
  {
   "id": "cap-26",
   "group": "Automation",
   "capability": "Import existing events from Calendly in one click",
   "weight": "peripheral",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Settings > Import"
   },
   "check": "imported event types appear under Event Types",
   "source": "https://cal.com/pricing (1-click import Calendly events)"
  },
  {
   "id": "cap-29",
   "group": "Integrations",
   "capability": "Install apps from the App Store (100+ integrations)",
   "weight": "peripheral",
   "plan": "free",
   "surfaces": {
    "api": "GET /v2/apps",
    "mcp": null,
    "cli": null,
    "ui": "app.cal.com/apps"
   },
   "check": "GET /v2/apps/installed lists the installed app",
   "source": "https://cal.com/features/app-store; https://cal.com/pricing"
  },
  {
   "id": "cap-31",
   "group": "Embedding",
   "capability": "Embed Cal.com UI components into own app via Atoms SDK",
   "weight": "peripheral",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Atoms React components (Booker, EventType, AvailabilitySettings, etc.)"
   },
   "check": "Atoms component renders booking flow inside third-party app",
   "source": "https://cal.com/docs/atoms/introduction.md; https://cal.com/atoms"
  },
  {
   "id": "cap-32",
   "group": "Customization",
   "capability": "Customize booking page branding (logo, brand color, light/dark mode)",
   "weight": "peripheral",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Settings > Appearance"
   },
   "check": "booking page reflects configured brand color/logo",
   "source": "https://cal.com/ (Simple customization); https://cal.com/pricing (Custom branding on booking page)"
  },
  {
   "id": "cap-33",
   "group": "Customization",
   "capability": "Remove Cal.com branding from booking pages",
   "weight": "peripheral",
   "plan": "teams",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Settings > Appearance"
   },
   "check": "booking page footer no longer shows 'Powered by Cal.com'",
   "source": "https://cal.com/pricing (Remove Cal.com branding)"
  },
  {
   "id": "cap-35",
   "group": "Organization admin",
   "capability": "Set up SSO (SAML) and SCIM user provisioning for an organization",
   "weight": "peripheral",
   "plan": "organizations",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Organization settings > Security"
   },
   "check": "org members can log in via SSO; SCIM-provisioned user appears in org member list",
   "source": "https://cal.com/docs/developing/guides/auth-and-provision/sso-setup.md; https://cal.com/pricing (SAML SSO and SCIM)"
  },
  {
   "id": "cap-36",
   "group": "Organization admin",
   "capability": "Manage organization-wide roles and permissions",
   "weight": "peripheral",
   "plan": "organizations",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Organization settings > Members & roles"
   },
   "check": "member's role change restricts/grants access as configured",
   "source": "https://cal.com/pricing (Role-based permissions, Roles & permissions)"
  },
  {
   "id": "cap-37",
   "group": "Organization admin",
   "capability": "Create sub-teams within an organization",
   "weight": "peripheral",
   "plan": "organizations",
   "surfaces": {
    "api": "POST /v2/organizations/{orgId}/teams",
    "mcp": null,
    "cli": null,
    "ui": "Organization settings > Teams"
   },
   "check": "GET /v2/organizations/{orgId}/teams lists the new sub-team",
   "source": "https://cal.com/pricing (Unlimited sub-teams)"
  },
  {
   "id": "cap-38",
   "group": "Organization admin",
   "capability": "View audit logs of security and access events",
   "weight": "peripheral",
   "plan": "organizations",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Organization settings > Audit logs"
   },
   "check": "audit log lists recent admin actions",
   "source": "https://cal.com/docs/developing/guides/audit-logs.md"
  }
 ],
 "attempts": [
  {
   "t": "00:37",
   "cap": "discovery",
   "capability": "robots.txt",
   "task": "Read robots.txt AI preferences",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "GET https://cal.com/robots.txt 200: 'Content-Signal: ai-train=no, search=yes, ai-input=yes' (Cloudflare Content Signals scheme, parses: lowercase terms, yes/no values); no aipref Content-Usage line; 'Agentmap: https://cal.com/.well-known/ai-catalog.json'; User-agent * disallows /sandbox /api /settings.",
   "notes": ""
  },
  {
   "t": "00:37",
   "cap": "discovery",
   "capability": "AI catalog / MCP card",
   "task": "Fetch AI catalog and MCP server card",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "/.well-known/ai-catalog.json 200 application/json (specVersion 1.0, entries MCP server card + OpenAPI); /.well-known/mcp/server-card.json 200 application/json: transport streamable-http endpoint https://mcp.cal.com/mcp, PRM link. <endpoint>/server-card (https://mcp.cal.com/mcp/server-card) 404 {\"error\":\"not_found\"}.",
   "notes": ""
  },
  {
   "t": "00:37",
   "cap": "discovery",
   "capability": "A2A agent card",
   "task": "Probe A2A cards",
   "route": "api",
   "documented": true,
   "result": "failed",
   "verified": true,
   "evidence": "/.well-known/agent-card.json and /.well-known/agent.json both 404 text/html.",
   "notes": ""
  },
  {
   "t": "00:37",
   "cap": "discovery",
   "capability": "llms.txt / skills / auth.md",
   "task": "Fetch llms.txt, docs llms.txt, auth.md, agent-skills index, api-catalog",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "https://cal.com/llms.txt 200 text/plain; https://cal.com/docs/llms.txt 200 (links .md pages); /auth.md 200 text/markdown (says MCP uses OAuth 2.1 with DCR; API via user API key or OAuth code+PKCE; 'Cal.com does not currently offer agent-specific self-registration'); /.well-known/agent-skills/index.json 200 (2 SKILL.md); /.well-known/api-catalog 200 application/linkset+json. /SKILL.md 404, /.well-known/ucp 404.",
   "notes": ""
  },
  {
   "t": "00:37",
   "cap": "discovery",
   "capability": "MCP server/discover",
   "task": "POST server/discover 2026-07-28 to https://mcp.cal.com/mcp",
   "route": "mcp",
   "documented": true,
   "result": "blocked",
   "verified": true,
   "evidence": "401 application/json {\"error\":\"unauthorized\",\"error_description\":\"Bearer token required\"}; WWW-Authenticate: Bearer resource_metadata=\"https://mcp.cal.com/.well-known/oauth-protected-resource/mcp\"; exposes Mcp-Session-Id header (suggests legacy session model).",
   "notes": "Auth required before any protocol negotiation; retry with credentials later."
  },
  {
   "t": "00:37",
   "cap": "discovery",
   "capability": "OAuth metadata",
   "task": "Fetch PRM and AS metadata for MCP and API",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "mcp.cal.com PRM (root + /mcp suffix) 200 JSON; mcp.cal.com AS metadata: registration_endpoint https://mcp.cal.com/oauth/register (DCR), no client_id_metadata_document_supported, no device_authorization_endpoint, grants authorization_code+refresh_token, S256. cal.com PRM resource https://api.cal.com, AS https://cal.com (authorization_code+refresh_token, PKCE S256). https://api.cal.com/.well-known/oauth-protected-resource (linked from auth.md) returns 410 'API v1 has been decommissioned'.",
   "notes": "",
   "quality": {
    "docs_match": "drift"
   }
  },
  {
   "t": "00:51",
   "cap": "discovery",
   "capability": "Markdown docs",
   "task": "Fetch docs page with Accept: text/markdown and .md URL",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "GET https://cal.com/docs/api-reference/v2/introduction with Accept: text/markdown -> 200 content-type text/markdown; Vary: rsc, next-router-state-tree, next-router-prefetch, next-router-segment-prefetch, accept-encoding (no 'accept'). introduction.md -> 200 text/markdown.",
   "notes": ""
  },
  {
   "t": "00:51",
   "cap": "docs",
   "capability": "Find docs",
   "task": "Find API docs and OpenAPI",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "https://cal.com/docs/api-reference/v2/openapi.json 200 application/json, openapi '3.0.0', info.version 1.0.0, 235 paths / 356 operations; docs llms.txt; no signup/register endpoint in the OpenAPI (only /v2/api-keys/refresh for an existing key).",
   "notes": "",
   "quality": {
    "docs_match": "match"
   }
  },
  {
   "t": "01:25",
   "cap": "signup",
   "capability": "Sign up",
   "task": "Find a headless sign-up route",
   "route": "none",
   "documented": true,
   "result": "failed",
   "verified": true,
   "evidence": "No signup/registration operation in OpenAPI (235 paths); auth.md: 'Cal.com does not currently offer agent-specific self-registration. Agents act on behalf of a Cal.com user.'; MCP AS only supports authorization_code (needs an existing user). Sign-up is the web form at https://app.cal.com/signup.",
   "notes": "",
   "quality": {
    "docs_match": "match"
   }
  },
  {
   "t": "02:40",
   "cap": "signup",
   "capability": "Sign up",
   "task": "Sign up with email on https://app.cal.com/signup in the drive browser",
   "route": "browser",
   "documented": true,
   "result": "blocked",
   "verified": true,
   "evidence": "Form (username, email, password) filled; a visible Cloudflare Turnstile widget 'Verify you are human' (checkbox) appeared under the password field and did not clear on its own; 'Get started' stayed disabled (click timed out after 20 s). Screenshot browser/shots/004.png.",
   "notes": "Turnstile judges the browser; per rules, not clicked/solved by the agent. Asking a human to sign up in their own browser."
  },
  {
   "t": "02:52",
   "cap": "signup",
   "capability": "Sign up",
   "task": "Ask a human to sign up in their own browser (Turnstile)",
   "route": "browser",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "Step stays blocked at Cloudflare Turnstile.",
   "notes": ""
  },
  {
   "t": "03:48",
   "cap": "credentials",
   "capability": "Get API credentials",
   "task": "Register an MCP OAuth client (DCR) and start authorization",
   "route": "api",
   "documented": true,
   "result": "blocked",
   "verified": true,
   "evidence": "POST https://mcp.cal.com/oauth/register -> 201 client_id issued (DCR works headless). GET /oauth/authorize (PKCE S256, resource=https://mcp.cal.com/mcp) -> 302 to https://app.cal.com/auth/oauth2/authorize (cal.com sign-in + consent), which needs a Cal.com account we could not create. API keys live at app.cal.com/settings/developer/api-keys (web, signed-in). No device flow, no CIMD, no agent self-registration.",
   "notes": "Blocked by the sign-up wall (Cloudflare Turnstile).",
   "quality": {}
  },
  {
   "t": "03:48",
   "cap": "first_call",
   "capability": "First API call",
   "task": "Call the API without credentials",
   "route": "api",
   "documented": true,
   "result": "blocked",
   "verified": true,
   "evidence": "GET https://api.cal.com/v2/me -> 401 application/json {status:error, error:{code:UnauthorizedException, message:'ApiAuthStrategy - No authentication method provided. Either pass an API key as Bearer header or OAuth client credentials ...'}}; GET /v2/bookings, /v2/event-types -> 403 ForbiddenException 'PermissionsGuard - no authentication provided...'. Headers X-RateLimit-Limit-Default: 500, X-RateLimit-Remaining-Default, X-RateLimit-Reset-Default: 60 (legacy names). Errors are custom JSON, not application/problem+json.",
   "notes": "",
   "quality": {
    "error_legibility": "clear"
   }
  },
  {
   "t": "03:48",
   "cap": "pay",
   "capability": "Pay step",
   "task": "Probe agent payment rails and billing",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "x402.cal.com, mpp.cal.com, agents.cal.com: DNS does not resolve. Unauthenticated API calls answer 401/403, no 402. No x-payment-info / x-service-info in openapi.json; /.well-known/ucp 404; no cal.com entry in the CDP x402 Bazaar or mpp.dev/api/services; llms.txt mentions none of x402/MPP/402. OpenAPI has no plan/subscription billing operations (only /v2/credits/available, /v2/credits/charge and Stripe Connect for booking payments). Pricing page (text/markdown): Free forever; $12 and $28 per user/month with '14 day free trial'. Whether the trial needs a card: unknown (needs an account).",
   "notes": ""
  },
  {
   "t": "03:48",
   "cap": "cap-01",
   "capability": "Create an event type (booking template)",
   "task": "Drive via POST /v2/event-types",
   "route": "api",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "No credentials: sign-up blocked by Cloudflare Turnstile (see signup attempts); unauthenticated calls return 401/403.",
   "notes": "Route is documented in openapi.json but needs an API key or OAuth token of a Cal.com user; sign-up is behind Cloudflare Turnstile."
  },
  {
   "t": "03:48",
   "cap": "cap-02",
   "capability": "Connect a calendar",
   "task": "Drive via POST /v2/calendars/{calendar}/connect",
   "route": "api",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "No credentials: sign-up blocked by Cloudflare Turnstile (see signup attempts); unauthenticated calls return 401/403.",
   "notes": "Route is documented in openapi.json but needs an API key or OAuth token of a Cal.com user; sign-up is behind Cloudflare Turnstile."
  },
  {
   "t": "03:48",
   "cap": "cap-03",
   "capability": "Set availability",
   "task": "Drive via POST /v2/schedules",
   "route": "api",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "No credentials: sign-up blocked by Cloudflare Turnstile (see signup attempts); unauthenticated calls return 401/403.",
   "notes": "Route is documented in openapi.json but needs an API key or OAuth token of a Cal.com user; sign-up is behind Cloudflare Turnstile."
  },
  {
   "t": "03:48",
   "cap": "cap-04",
   "capability": "Book a meeting on someone's public booking link",
   "task": "Drive via POST /v2/bookings",
   "route": "api",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "No credentials: sign-up blocked by Cloudflare Turnstile (see signup attempts); unauthenticated calls return 401/403.",
   "notes": "Route is documented in openapi.json but needs an API key or OAuth token of a Cal.com user; sign-up is behind Cloudflare Turnstile. Booking a stranger's public link without auth would message a real person, which our rules forbid; our own event type could not be created."
  },
  {
   "t": "03:48",
   "cap": "cap-05",
   "capability": "Reschedule a booking",
   "task": "Drive via POST /v2/bookings/{uid}/reschedule",
   "route": "api",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "No credentials: sign-up blocked by Cloudflare Turnstile (see signup attempts); unauthenticated calls return 401/403.",
   "notes": "Route is documented in openapi.json but needs an API key or OAuth token of a Cal.com user; sign-up is behind Cloudflare Turnstile."
  },
  {
   "t": "03:48",
   "cap": "cap-06",
   "capability": "Cancel a booking",
   "task": "Drive via POST /v2/bookings/{uid}/cancel",
   "route": "api",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "No credentials: sign-up blocked by Cloudflare Turnstile (see signup attempts); unauthenticated calls return 401/403.",
   "notes": "Route is documented in openapi.json but needs an API key or OAuth token of a Cal.com user; sign-up is behind Cloudflare Turnstile."
  },
  {
   "t": "03:48",
   "cap": "cap-07",
   "capability": "Choose meeting location",
   "task": "Drive via POST /v2/event-types locations",
   "route": "api",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "No credentials: sign-up blocked by Cloudflare Turnstile (see signup attempts); unauthenticated calls return 401/403.",
   "notes": "Route is documented in openapi.json but needs an API key or OAuth token of a Cal.com user; sign-up is behind Cloudflare Turnstile."
  },
  {
   "t": "03:48",
   "cap": "cap-08",
   "capability": "View upcoming/past bookings",
   "task": "Drive via GET /v2/bookings",
   "route": "api",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "No credentials: sign-up blocked by Cloudflare Turnstile (see signup attempts); unauthenticated calls return 401/403.",
   "notes": "Route is documented in openapi.json but needs an API key or OAuth token of a Cal.com user; sign-up is behind Cloudflare Turnstile."
  },
  {
   "t": "03:48",
   "cap": "verify",
   "capability": "Verify email",
   "task": "Verify sign-up email",
   "route": "none",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "Not reached: no account was created (Turnstile on sign-up).",
   "notes": ""
  },
  {
   "t": "03:48",
   "cap": "delete",
   "capability": "Delete account",
   "task": "Delete account",
   "route": "none",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "No account to delete. OpenAPI has no user/account delete operation for a self-serve user (DELETE /v2/me absent; GET/PATCH only).",
   "notes": ""
  }
 ],
 "stale": false,
 "icon": "/logos/cal.png",
 "monitored": false,
 "verdict": "Needs a person to start: L1 · Needs a person. Our agent read the headless docs fine, including a large OpenAPI and an MCP server card, but stopped at signup: the web form shows a Cloudflare Turnstile that stayed visible and never cleared for our agent's browser, so Get started stayed disabled. MCP client registration worked on its own, but authorization then redirects to a sign-in and consent page, and API keys are made in web settings, so no credentials followed either way. With no account, our agent never made a booking call and never reached checkout. There's also no API path to delete an account or the MCP client it registered.",
 "page": "https://agentdrives.com/tools/cal?via=api"
}