{
 "slug": "zcal",
 "name": "zcal",
 "url": "https://zcal.co",
 "domain": "zcal.co",
 "category": "scheduling",
 "category_name": "Scheduling",
 "tested_at": "2026-10-06",
 "run": "20261006T052349Z",
 "draft": false,
 "reviewed": true,
 "owner_verified": null,
 "origin": "editorial",
 "history": [
  {
   "run": "20261006T052349Z",
   "date": "2026-10-06",
   "level": 0,
   "engine": {
    "runner": "omp",
    "model": "claude-opus-5-5",
    "driver": 2,
    "signed": true,
    "inbox": [
     "agentdrives.com"
    ],
    "robots": "start"
   }
  }
 ],
 "level": 0,
 "level_name": "Read-only",
 "level_selfhost": null,
 "entry": "closed",
 "door": {
  "passed": 0,
  "tries": 1,
  "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": "part",
   "text": "Some docs agents can read: llms.txt",
   "have": [
    "llms_txt"
   ]
  },
  {
   "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": null,
  "text": "No API, CLI or MCP to drive it with"
 },
 "stop": "signup",
 "core": "0/7",
 "scores": {
  "coverage": null,
  "reliability": null,
  "resilience": null,
  "setup": 50,
  "surface_coverage": null,
  "docs_accuracy": null,
  "docs_completeness": null
 },
 "parts": {
  "holds_up": null,
  "docs_match": null,
  "setup": 50,
  "security": null,
  "standards": []
 },
 "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": 1,
 "drives": 1,
 "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": "",
  "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-13"
  },
  "browser": {
   "state": "through",
   "measured": false
  },
  "our_key": "pending",
  "robots": null,
  "tip": false
 },
 "ladder": {
  "docs": {
   "status": "headless",
   "note": "help.zcal.co (GitBook) serves llms.txt (text/markdown), .md page URLs, and text/markdown on Accept negotiation. zcal.co/llms.txt is an SPA soft-404."
  },
  "signup": {
   "status": "human",
   "note": "No headless route: sign-up is web only (Google, Microsoft or email form). The email form at zcal.co/signup/local has a visible Cloudflare Turnstile 'Verify you are human'; our agent's browser got 'We could not verify your browser'.",
   "via": ""
  },
  "verify": {
   "status": "",
   "note": "Not reached: no account was created, so no verification mail was expected.",
   "reached": false
  },
  "credentials": {
   "status": "",
   "note": "zcal has no public API, API key, OAuth app, CLI, SDK or MCP server in its docs; only outbound webhooks and Zapier, set up in the web app after sign-up.",
   "via": "",
   "reached": false
  },
  "first_call": {
   "status": "",
   "note": "No API to call; the web app needs an account, which sits behind Turnstile.",
   "reached": false
  },
  "first_action": {
   "status": "",
   "note": "No account, so no invite link could be created.",
   "reached": false
  },
  "pay": {
   "status": "",
   "grade": "P1",
   "rails": [
    "Stripe billing portal (web, after sign-up)"
   ],
   "rail_ids": [
    "stripe-portal"
   ],
   "first_party": false,
   "rail_scope": "none",
   "trial_path": "free tier",
   "note": "No 402, no x402/MPP/UCP, not in mpp.dev or the x402 Bazaar. Pricing page: 14-day free trial of Pro and Business; billing via zcal.co/account > Manage Billing (Stripe portal). Whether the trial needs a card is unknown. Buying needs an account, and the account needs a human past Turnstile.",
   "reached": false
  },
  "cancel": {
   "status": "",
   "note": "Docs (pricing/payments-and-billing.md): cancel in the Stripe portal via zcal.co/account > Manage Billing > Cancel Plan, web UI only. Not exercised: no plan started.",
   "docs_grade": "",
   "reached": false
  },
  "delete": {
   "status": "",
   "note": "The web app has a 'Delete account' action (string in the app bundle), web UI only; no API. Not exercised: no account existed. Nothing was created, so nothing to clean up.",
   "account": false,
   "reached": false
  }
 },
 "routes": [],
 "checkout": null,
 "docs": null,
 "claims": null,
 "pay_options": {
  "checked": "2026-10-06",
  "source": "drive",
  "options": [
   {
    "id": "stripe-portal",
    "name": "stripe-portal",
    "kind": "checkout",
    "first_party": false,
    "lead": false,
    "networks": [],
    "testnet": false
   }
  ],
  "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": false,
  "openapi": false,
  "cli": false,
  "sdk": false,
  "mcp": "none",
  "llms_txt": true,
  "webhooks": true,
  "sandbox": false
 },
 "surface_notes": {
  "api": "none public",
  "webhooks": "outbound event.created/rescheduled/cancelled, optional HMAC-SHA256 x-zcal-webhook-signature; set up in web UI",
  "llms_txt": "help.zcal.co/llms.txt, 60+ pages"
 },
 "can_do": [
  "Read the full help docs as Markdown (llms.txt, .md URLs, Accept: text/markdown) without an account"
 ],
 "cannot_do": [
  {
   "what": "Create an account",
   "why": "Visible Cloudflare Turnstile on the sign-up form rejected our agent's browser"
  },
  {
   "what": "Create, book, reschedule or cancel invites, polls or group invites",
   "why": "Needs an account; and zcal has no API, CLI or MCP server, only the web app"
  },
  {
   "what": "Get API credentials",
   "why": "zcal offers no public API"
  }
 ],
 "blockers": [
  "Cloudflare Turnstile on sign-up",
  "No public API, CLI or MCP server"
 ],
 "tips_for_owner": [
  "Let verified signed agents past Turnstile",
  "Publish an API for invites and bookings",
  "Offer an API key or OAuth for agents",
  "Ship an MCP server for scheduling"
 ],
 "tips_for_agents": [
  "There is no zcal API: everything happens in the web app at zcal.co.",
  "Docs: fetch https://help.zcal.co/llms.txt and append .md to any help page.",
  "Sign-up has a Cloudflare Turnstile; plan for a human to create the account.",
  "Booking events reach you only as outbound webhooks or via Zapier, configured in the web UI."
 ],
 "selfhost": null,
 "summary": "zcal has no public API, CLI or MCP server; everything happens in its web app. Sign-up shows a Cloudflare Turnstile that rejected our agent's browser, so an agent could not get an account. Its help docs are agent-friendly: llms.txt and Markdown pages.",
 "wall": "Cloudflare Turnstile on the sign-up form",
 "plan_scope": "",
 "robots_stop": null,
 "robots": null,
 "plain": null,
 "plan_gated": [
  {
   "capability": "Create a team and collective/round-robin scheduling",
   "plan": "Pro",
   "evidence": "help.zcal.co/pricing/pro-plan.md lists Team creation, Round robin and Collective scheduling"
  }
 ],
 "reply": null,
 "capabilities": [
  {
   "id": "cap-01",
   "group": "Scheduling pages",
   "capability": "Create an invite link (one-on-one)",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "zcal Home, '+ New Link' > One-on-One"
   },
   "check": "Invite link appears on profile page and is bookable at its URL",
   "source": "https://help.zcal.co/getting-started.md"
  },
  {
   "id": "cap-02",
   "group": "Scheduling pages",
   "capability": "Invitee books a time slot on an invite",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "public invite page"
   },
   "check": "Event appears on host's connected write calendar and confirmation emails are sent",
   "source": "https://help.zcal.co/master.md; https://help.zcal.co/getting-started.md"
  },
  {
   "id": "cap-03",
   "group": "Scheduling pages",
   "capability": "Design/customize invite page (theme, fonts, colors, layout, media)",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "invite editor > Design theme"
   },
   "check": "Invite page renders chosen font/colors/layout when viewed publicly",
   "source": "https://zcal.co/; https://help.zcal.co/invite-settings/design-theme.md"
  },
  {
   "id": "cap-04",
   "group": "Calendar sync",
   "capability": "Connect and sync calendars (Google/Outlook/Apple) to block busy times",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "https://zcal.co/account/calendars"
   },
   "check": "Availability troubleshooter shows events pulled from connected calendar as busy",
   "source": "https://help.zcal.co/calendar/overview.md; https://help.zcal.co/availability/availability-troubleshooter.md"
  },
  {
   "id": "cap-05",
   "group": "Teams",
   "capability": "Create a team and collective/round-robin scheduling",
   "weight": "core",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Teams section"
   },
   "check": "Team invite link shows available slots cross-referenced across members (collective) or assigns booking to one member (round robin)",
   "source": "https://help.zcal.co/teams/collective-invites.md; https://help.zcal.co/teams/round-robin.md; https://help.zcal.co/pricing/pro-plan.md"
  },
  {
   "id": "cap-06",
   "group": "Scheduling pages",
   "capability": "Run a meeting poll (vote on candidate times, finalize winner)",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "'+ New Link' > Meeting poll"
   },
   "check": "Poll page shows invitee votes; after finalizing, calendar invites are sent to all invitees",
   "source": "https://help.zcal.co/other-link-types/meeting-polls.md"
  },
  {
   "id": "cap-07",
   "group": "Scheduling pages",
   "capability": "Run a group invite (many invitees book same slot)",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "'+ New Link' > Group invite"
   },
   "check": "Multiple invitees can book the same time slot until it fills",
   "source": "https://help.zcal.co/other-link-types/group-invites.md"
  },
  {
   "id": "cap-08",
   "group": "Scheduling pages",
   "capability": "Reschedule or cancel a booked event",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "booking confirmation page / email links"
   },
   "check": "Webhook fires event.rescheduled or event.cancelled and calendar event reflects new state",
   "source": "https://help.zcal.co/integrations/webhooks.md"
  },
  {
   "id": "cap-09",
   "group": "Availability",
   "capability": "Set saved availability (weekly hours, date-specific hours)",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "https://zcal.co/availability"
   },
   "check": "Invite pages reflect updated available hours",
   "source": "https://help.zcal.co/availability/setting-account-saved-availability.md; https://help.zcal.co/getting-started.md"
  },
  {
   "id": "cap-10",
   "group": "Availability",
   "capability": "Set custom hours/date range for a specific invite",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "invite editor > Availability"
   },
   "check": "That invite's bookable slots differ from account saved availability",
   "source": "https://help.zcal.co/availability/edit-custom-hours-for-an-invite.md; https://help.zcal.co/availability/set-custom-rolling-date-range.md"
  },
  {
   "id": "cap-11",
   "group": "Availability",
   "capability": "Block out-of-office days",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "availability settings"
   },
   "check": "Blocked dates no longer appear as bookable on invite pages",
   "source": "https://help.zcal.co/availability/block-out-of-office-ooo-days.md"
  },
  {
   "id": "cap-12",
   "group": "Availability",
   "capability": "Set buffer times and minimum notice",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "invite editor"
   },
   "check": "Slots near existing events or within the notice window are hidden",
   "source": "https://help.zcal.co/invite-settings/buffer-times.md; https://help.zcal.co/invite-settings/minimum-notice.md"
  },
  {
   "id": "cap-13",
   "group": "Availability",
   "capability": "Limit booking frequency per period",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "invite editor"
   },
   "check": "Additional bookings beyond the limit are refused for the period",
   "source": "https://help.zcal.co/invite-settings/limit-booking-frequency.md"
  },
  {
   "id": "cap-14",
   "group": "Invite content",
   "capability": "Add custom questions to booking form (incl. file upload)",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "invite editor > Custom questions"
   },
   "check": "Invitee answers appear attached to the booked event",
   "source": "https://help.zcal.co/invite-settings/custom-questions.md; https://help.zcal.co/invite-settings/custom-questions/file-upload.md"
  },
  {
   "id": "cap-15",
   "group": "Invite content",
   "capability": "Add video conferencing link (Zoom/Google Meet/Teams) to invite",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "invite editor > Location"
   },
   "check": "Booked event's calendar entry contains an auto-generated meeting link",
   "source": "https://help.zcal.co/invite-settings/add-video-conferencing-link.md"
  },
  {
   "id": "cap-16",
   "group": "Invite content",
   "capability": "Add welcome video/story image to invite page",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "invite editor"
   },
   "check": "Video/image renders on the public invite page",
   "source": "https://help.zcal.co/profile/intro.md; https://zcal.co/ (Welcome videos)"
  },
  {
   "id": "cap-17",
   "group": "Notifications",
   "capability": "Configure email reminders and confirmations (custom content)",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "invite editor > Notifications"
   },
   "check": "Invitee receives reminder/confirmation email matching configured content/timing",
   "source": "https://help.zcal.co/invite-settings/email-reminders.md; https://help.zcal.co/invite-settings/custom-confirmation-emails.md"
  },
  {
   "id": "cap-18",
   "group": "Notifications",
   "capability": "Send SMS reminders",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "invite editor > Notifications"
   },
   "check": "Invitee receives an SMS reminder before the meeting; monthly SMS credits decrement",
   "source": "https://help.zcal.co/invite-settings/sms-reminders.md; https://help.zcal.co/pricing/business-plan.md"
  },
  {
   "id": "cap-19",
   "group": "Notifications",
   "capability": "Send follow-up emails after a meeting",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "invite editor > Notifications"
   },
   "check": "Invitee receives follow-up email after the meeting end time",
   "source": "https://help.zcal.co/invite-settings/follow-up-emails.md"
  },
  {
   "id": "cap-20",
   "group": "Notifications",
   "capability": "Redirect invitee to a custom URL after booking",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "invite editor > Confirmation"
   },
   "check": "Browser navigates to configured URL after a successful booking",
   "source": "https://help.zcal.co/invite-settings/redirect-on-booking.md"
  },
  {
   "id": "cap-21",
   "group": "Payments",
   "capability": "Collect payment via Stripe before booking",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "invite editor > Stripe integration"
   },
   "check": "Stripe checkout completes before the booking is confirmed; charge appears in connected Stripe account",
   "source": "https://help.zcal.co/integrations/stripe.md"
  },
  {
   "id": "cap-22",
   "group": "Payments",
   "capability": "Apply coupons / sell session packages via Stripe",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Stripe integration settings"
   },
   "check": "Coupon reduces price at checkout; package purchase grants multiple bookable sessions",
   "source": "https://help.zcal.co/integrations/stripe/coupons.md; https://help.zcal.co/integrations/stripe/packages.md"
  },
  {
   "id": "cap-23",
   "group": "Sharing",
   "capability": "Embed invite page on an external website",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "invite editor > Share > Embed"
   },
   "check": "Embed code renders the booking widget inline on a third-party page",
   "source": "https://help.zcal.co/share/embed.md"
  },
  {
   "id": "cap-24",
   "group": "Sharing",
   "capability": "Clone/duplicate an invite link",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "invite list > Clone"
   },
   "check": "New invite link appears with identical settings and a new URL",
   "source": "https://help.zcal.co/invite-settings/clone-duplicate-link.md"
  },
  {
   "id": "cap-25",
   "group": "Sharing",
   "capability": "Create a personalized (one-time use) link for a specific invitee",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "invite editor > Personalized link"
   },
   "check": "Link becomes invalid/unbookable after a single use and does not list on profile page",
   "source": "https://help.zcal.co/invite-settings/personalized-one-time-use-links.md"
  },
  {
   "id": "cap-26",
   "group": "Sharing",
   "capability": "Manage public profile page (order/visibility of invites, intro, photo)",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "https://zcal.co/profile"
   },
   "check": "Profile page at zcal.co/<username> shows configured invites in configured order",
   "source": "https://help.zcal.co/profile/profile-page.md; https://help.zcal.co/profile/customize-invite-order-and-visibility.md"
  },
  {
   "id": "cap-27",
   "group": "Automation",
   "capability": "Receive booking events via webhooks (created/rescheduled/cancelled)",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "https://zcal.co/account/integrations"
   },
   "check": "Configured endpoint receives signed HTTP POST with event.created/rescheduled/cancelled payload",
   "source": "https://help.zcal.co/integrations/webhooks.md"
  },
  {
   "id": "cap-29",
   "group": "Teams",
   "capability": "Invite and manage team members with roles (Owner/Admin/User)",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "team settings > Members"
   },
   "check": "Invited member's permissions match assigned role (e.g. User cannot edit team invites)",
   "source": "https://help.zcal.co/teams/invite-team-members.md; https://help.zcal.co/teams/team-member-roles.md"
  },
  {
   "id": "cap-30",
   "group": "Analytics",
   "capability": "Track invite page visits/conversions via Google Analytics or Meta Pixel",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "invite editor > Tracking"
   },
   "check": "Page view/conversion events appear in connected GA or Meta Pixel dashboard",
   "source": "https://help.zcal.co/integrations/google-analytics.md; https://help.zcal.co/integrations/meta-pixel.md; https://help.zcal.co/pricing/pro-plan.md"
  },
  {
   "id": "cap-31",
   "group": "Branding",
   "capability": "Remove zcal branding from pages/emails/calendar events",
   "weight": "peripheral",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "account settings > Branding"
   },
   "check": "Public invite page and confirmation emails no longer show 'Powered by zcal'",
   "source": "https://help.zcal.co/invite-settings/remove-zcal-branding.md; https://help.zcal.co/pricing/business-plan.md"
  },
  {
   "id": "cap-32",
   "group": "Branding",
   "capability": "Use a custom domain and custom favicon for scheduling pages",
   "weight": "peripheral",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "account settings > Custom Domain"
   },
   "check": "Invite/profile pages resolve and render correctly under the verified custom subdomain",
   "source": "https://help.zcal.co/customization/custom-domain.md; https://help.zcal.co/customization/custom-favicon.md"
  },
  {
   "id": "cap-33",
   "group": "Branding",
   "capability": "Send notifications from a custom email address",
   "weight": "peripheral",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "account settings > Notifications"
   },
   "check": "Booking emails arrive From the configured custom address instead of notifications@zcal.co",
   "source": "https://help.zcal.co/customization/custom-notification-email-addresses.md"
  },
  {
   "id": "cap-34",
   "group": "Account admin",
   "capability": "Choose write calendar (where events are added) and read calendars",
   "weight": "peripheral",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "https://zcal.co/account/calendars"
   },
   "check": "New bookings are created on the selected write calendar only",
   "source": "https://help.zcal.co/invite-settings/custom-write-calendar.md; https://help.zcal.co/getting-started.md"
  },
  {
   "id": "cap-35",
   "group": "Account admin",
   "capability": "Set display timezone for invite pages",
   "weight": "peripheral",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "invite editor"
   },
   "check": "Invite page shows times in the configured timezone (or auto-detects invitee's)",
   "source": "https://help.zcal.co/invite-settings/displayed-timezone.md"
  }
 ],
 "attempts": [
  {
   "t": "01:00",
   "cap": "discovery",
   "capability": "llms.txt",
   "task": "Fetch llms.txt on zcal.co and help.zcal.co",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "https://help.zcal.co/llms.txt 200 text/markdown (GitBook index, 60+ pages). https://zcal.co/llms.txt 200 text/html 38680 B = SPA soft-404.",
   "notes": ""
  },
  {
   "t": "01:00",
   "cap": "discovery",
   "capability": "markdown docs",
   "task": "Accept: text/markdown and .md URL on help.zcal.co",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "GET help.zcal.co/getting-started with Accept: text/markdown -> content-type text/markdown, vary includes Accept; .md URLs also served (getting-started.md).",
   "notes": ""
  },
  {
   "t": "01:00",
   "cap": "discovery",
   "capability": "mcp",
   "task": "Probe zcal.co/mcp with server/discover (2026-07-28)",
   "route": "mcp",
   "documented": true,
   "result": "failed",
   "verified": true,
   "evidence": "POST https://zcal.co/mcp -> HTTP 404 text/html. GET /mcp -> SPA HTML. No MCP server found; none in docs.",
   "notes": ""
  },
  {
   "t": "01:00",
   "cap": "discovery",
   "capability": "cards/well-known",
   "task": "ai-catalog, agent-card, agent.json, oauth-protected-resource, oauth-authorization-server, ucp, auth.md, SKILL.md, openapi.json",
   "route": "api",
   "documented": true,
   "result": "failed",
   "verified": true,
   "evidence": "All return 200 text/html 38680 B (SPA soft-404); no JSON. api.zcal.co, x402./mpp./agents.zcal.co do not resolve (curl 000).",
   "notes": ""
  },
  {
   "t": "01:00",
   "cap": "discovery",
   "capability": "aipref",
   "task": "robots.txt and headers",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "robots.txt: 'User-Agent: * / Disallow: /*?via=* / Disallow: /cdn-cgi/' + Sitemap; no Content-Usage or Content-signal line; no Content-Usage header on /.",
   "notes": ""
  },
  {
   "t": "01:00",
   "cap": "pay",
   "capability": "pay step probe",
   "task": "Look for 402 rails, registries, billing API",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "No 402 on any path; zcal not in mpp.dev/api/services nor CDP x402 Bazaar; help pricing/payments-and-billing.md: billing via zcal.co/account > Manage Billing > Stripe portal; pricing page mentions free trial of Pro and Business.",
   "notes": ""
  },
  {
   "t": "02:10",
   "cap": "signup",
   "capability": "Sign up",
   "task": "Sign up with email at zcal.co/signup/local",
   "route": "browser",
   "documented": true,
   "result": "blocked",
   "verified": true,
   "evidence": "No headless sign-up route documented (help getting-started.md: Google/Microsoft login or email address, web only). Browser form at /signup/local shows a visible Cloudflare Turnstile 'Verify you are human' widget (CHECK_TURNSTILE_ON:!0 in main chunk); submitting gave toast 'We could not verify your browser. Please refresh the page and try again.' Screenshot browser/shots/003.png.",
   "notes": "Turnstile judges the browser; not retried. Asking a human to sign up in their own browser.",
   "quality": {
    "error_legibility": "clear",
    "recoverable": "no"
   }
  },
  {
   "t": "02:37",
   "cap": "signup",
   "capability": "Sign up",
   "task": "Human handoff (own browser) for the Turnstile on sign-up",
   "route": "browser",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "(Cloudflare Turnstile).",
   "notes": "not retried."
  },
  {
   "t": "02:37",
   "cap": "credentials",
   "capability": "API credentials",
   "task": "Find an API key / OAuth / MCP route in docs",
   "route": "none",
   "documented": true,
   "result": "blocked",
   "verified": true,
   "evidence": "help.zcal.co/llms.txt lists 60+ pages: no API, no API key, no OAuth app, no CLI, no SDK, no MCP. Only outbound webhooks (integrations/webhooks.md) and Zapier, both configured in the web app after sign-up.",
   "notes": "",
   "quality": {}
  },
  {
   "t": "02:37",
   "cap": "cap-01",
   "capability": "Create an invite link (one-on-one)",
   "task": "Attempt create an invite link (one-on-one)",
   "route": "none",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "No API/MCP/CLI exists for this; docs (https://help.zcal.co/getting-started.md) describe a web UI route only.",
   "notes": ""
  },
  {
   "t": "02:37",
   "cap": "cap-02",
   "capability": "Invitee books a time slot on an invite",
   "task": "Attempt invitee books a time slot on an invite",
   "route": "none",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "No API/MCP/CLI exists for this; docs (https://help.zcal.co/master.md) describe a web UI route only.",
   "notes": ""
  },
  {
   "t": "02:37",
   "cap": "cap-03",
   "capability": "Design/customize invite page (theme, fonts, colors, layout, media)",
   "task": "Attempt design/customize invite page (theme, fonts, colors, layout, media)",
   "route": "none",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "No API/MCP/CLI exists for this; docs (https://zcal.co/) describe a web UI route only.",
   "notes": ""
  },
  {
   "t": "02:37",
   "cap": "cap-04",
   "capability": "Connect and sync calendars (Google/Outlook/Apple) to block busy times",
   "task": "Attempt connect and sync calendars (google/outlook/apple) to block busy times",
   "route": "none",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "No API/MCP/CLI exists for this; docs (https://help.zcal.co/calendar/overview.md) describe a web UI route only.",
   "notes": ""
  },
  {
   "t": "02:37",
   "cap": "cap-05",
   "capability": "Create a team and collective/round-robin scheduling",
   "task": "Attempt create a team and collective/round-robin scheduling",
   "route": "none",
   "documented": true,
   "result": "plan_gated",
   "verified": false,
   "evidence": "help.zcal.co/pricing/pro-plan.md lists Team creation, Round robin, Collective scheduling under Pro; also unreachable here: no account (sign-up blocked by Cloudflare Turnstile).",
   "notes": ""
  },
  {
   "t": "02:37",
   "cap": "cap-06",
   "capability": "Run a meeting poll (vote on candidate times, finalize winner)",
   "task": "Attempt run a meeting poll (vote on candidate times, finalize winner)",
   "route": "none",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "No API/MCP/CLI exists for this; docs (https://help.zcal.co/other-link-types/meeting-polls.md) describe a web UI route only.",
   "notes": ""
  },
  {
   "t": "02:37",
   "cap": "cap-07",
   "capability": "Run a group invite (many invitees book same slot)",
   "task": "Attempt run a group invite (many invitees book same slot)",
   "route": "none",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "No API/MCP/CLI exists for this; docs (https://help.zcal.co/other-link-types/group-invites.md) describe a web UI route only.",
   "notes": ""
  },
  {
   "t": "02:37",
   "cap": "cap-08",
   "capability": "Reschedule or cancel a booked event",
   "task": "Attempt reschedule or cancel a booked event",
   "route": "none",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "No API/MCP/CLI exists for this; docs (https://help.zcal.co/integrations/webhooks.md) describe a web UI route only.",
   "notes": ""
  }
 ],
 "stale": false,
 "icon": "/logos/zcal.png",
 "monitored": false,
 "verdict": "Stuck at L0 · Read-only: our agent found nothing to call, only a web app to sign up for. It got to signup and stopped there, where a visible Cloudflare Turnstile challenge told our agent's browser it could not verify it was human. With no account, there was no key page, no first call and no invite to send. zcal's help docs serve llms.txt and Markdown cleanly, but that's as far as an agent gets: no API, CLI or MCP server exists to do the scheduling work itself. Paying and cancelling both live behind that same locked door, in the web app's Stripe-backed billing page, so neither was reached.",
 "page": "https://agentdrives.com/tools/zcal?via=api"
}