{
 "slug": "tidycal",
 "name": "TidyCal",
 "url": "https://tidycal.com",
 "domain": "tidycal.com",
 "category": "scheduling",
 "category_name": "Scheduling",
 "tested_at": "2026-10-12",
 "run": "20261012T100028Z",
 "draft": false,
 "reviewed": true,
 "owner_verified": null,
 "origin": "editorial",
 "history": [
  {
   "run": "20261002T073145Z",
   "date": "2026-10-02",
   "level": 1,
   "engine": {
    "runner": "omp",
    "model": "claude-opus-5-5",
    "driver": 2,
    "signed": true,
    "inbox": [
     "agentdrives.com"
    ],
    "robots": "start"
   }
  },
  {
   "run": "20261006T092847Z",
   "date": "2026-10-06",
   "level": 3,
   "engine": {
    "runner": "omp",
    "model": "claude-opus-5-5",
    "driver": 2,
    "signed": true,
    "inbox": [
     "agentdrives.com"
    ],
    "robots": "start"
   },
   "why": "noise"
  },
  {
   "run": "20261012T100028Z",
   "date": "2026-10-12",
   "level": 3,
   "engine": {
    "runner": "omp",
    "model": "claude-opus-5-5",
    "driver": 3,
    "signed": true,
    "inbox": [
     "agentdrives.com"
    ],
    "robots": "obey"
   }
  }
 ],
 "level": 3,
 "level_name": "Does the work",
 "level_selfhost": null,
 "entry": "self-start",
 "door": {
  "passed": 2,
  "tries": 3,
  "self_start": true
 },
 "badges": [
  "agent-can-leave"
 ],
 "stages": [
  {
   "key": "in",
   "label": "Access",
   "state": "yes",
   "text": "Gets in on its own, in a browser (the API key is paid)",
   "at": "credentials",
   "how": "in-browser"
  },
  {
   "key": "work",
   "label": "Use",
   "state": "part",
   "text": "Work done: 60% of the core"
  },
  {
   "key": "pay",
   "label": "Pay",
   "state": "part",
   "text": "Reaches the checkout: stopped at the card form",
   "value": "ready",
   "route": "card_checkout"
  },
  {
   "key": "leave",
   "label": "Leave",
   "state": "yes",
   "text": "Leaves on its own: nothing to cancel, deletes its account",
   "left": "deleted"
  }
 ],
 "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": "yes",
   "text": "Gets in on its own, in a browser (the API key is paid)",
   "at": "credentials",
   "how": "in-browser",
   "stage": "in"
  },
  {
   "key": "use",
   "label": "Use",
   "state": "part",
   "text": "Work done: 60% of the core",
   "stage": "work"
  },
  {
   "key": "pay",
   "label": "Pay",
   "state": "part",
   "text": "Reaches the checkout: stopped at the card form",
   "value": "ready",
   "route": "card_checkout",
   "stage": "pay"
  },
  {
   "key": "leave",
   "label": "Leave",
   "state": "yes",
   "text": "Leaves on its own: nothing to cancel, deletes its account",
   "left": "deleted",
   "stage": "leave"
  }
 ],
 "access": [
  {
   "key": "browser_signup",
   "label": "Sign-up in a browser",
   "routes": [],
   "minutes": null,
   "core": "6/10"
  }
 ],
 "minutes": null,
 "next": {
  "to": 4,
  "text": "Next: do 80% of the core work (now 60%)"
 },
 "stop": "credentials",
 "core": "6/10",
 "scores": {
  "coverage": 58,
  "reliability": 100,
  "resilience": null,
  "setup": 90,
  "surface_coverage": null,
  "docs_accuracy": null,
  "docs_completeness": null
 },
 "parts": {
  "holds_up": null,
  "docs_match": null,
  "setup": 90,
  "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": "first-try",
 "resilience": null,
 "stress": [],
 "surface_audit": null,
 "coverage_core": 60,
 "after_wall": null,
 "coverage_source": "computed",
 "driver": {
  "version": 3,
  "model": "claude-opus-5-5",
  "profile": "full",
  "assisted": false,
  "handoff": false,
  "prompt_sha": "076cd4c65a1a",
  "kb_version": "3+overlay-1353601952",
  "identity": "e8a92f24a9a8"
 },
 "methodology": 15,
 "rules_date": "2026-10-15",
 "engine": {
  "runner": "omp",
  "model": "claude-opus-5-5",
  "driver": 3,
  "signed": true,
  "inbox": [
   "agentdrives.com"
  ],
  "robots": "obey"
 },
 "same_level_drives": 2,
 "drives": 3,
 "works_assisted": null,
 "freshness": "fresh",
 "nothing_to_pay": false,
 "core_gated": false,
 "profiles": {},
 "agent_check": null,
 "agent_pass": {
  "rung": "signup",
  "vendor": "Google reCAPTCHA (invisible)",
  "signed": true
 },
 "who_gets_in": {
  "server": {
   "state": "in"
  },
  "signed": {
   "state": "page",
   "kind": "signup",
   "at": "2026-10-13"
  },
  "browser": {
   "state": "in",
   "measured": false
  },
  "our_key": "pending",
  "robots": null,
  "tip": false
 },
 "ladder": {
  "docs": {
   "status": "headless",
   "note": "API reference at /developer/docs/ (Redoc, OpenAPI 3.0.0 embedded and downloadable, 16 operations), /llms.txt, /mcp-docs; all fetched headless."
  },
  "signup": {
   "status": "browser",
   "note": "Only route is the web form /register with invisible reCAPTCHA; no sign-up API or agent registration. Done in the browser with the agent's inbox; the check let our agent's browser through."
  },
  "verify": {
   "status": "n/a",
   "note": "No email verification: sign-up went straight to onboarding and the dashboard; no verification mail was sent."
  },
  "credentials": {
   "status": "blocked",
   "note": "API tokens and the MCP server are paid-only. Integrations > API on Free: 'Unlock Integrations by upgrading'. MCP OAuth: DCR registered a client headless, but /oauth/authorize on Free answered 'For API access please upgrade to a lifetime plan!'.",
   "via": ""
  },
  "first_call": {
   "status": "blocked",
   "note": "GET /api/me without a token: 401 {\"message\":\"Unauthenticated.\"}; no token is obtainable on the free plan."
  },
  "first_action": {
   "status": "browser",
   "note": "Created a booking type in the web app (Dashboard > Booking types > New booking type); it went live on the public page at once."
  },
  "pay": {
   "status": "browser",
   "grade": "P2",
   "rails": [
    "Stripe Checkout (hosted card checkout) for Pro",
    "AppSumo for lifetime plans"
   ],
   "rail_ids": [
    "stripe-checkout"
   ],
   "first_party": false,
   "rail_scope": "none",
   "trial_path": "free tier",
   "note": "No agent rail: no 402 on any TidyCal host, not in mpp.dev, Stripe Projects or the x402 Bazaar, no /.well-known/ucp, no billing API. We paid nothing. Pro is a live Stripe Checkout session (EUR 11.16/month, 'Billed monthly') reached from the pricing page while logged in; lifetime plans are sold on appsumo.com. Not paid: no card for this drive."
  },
  "cancel": {
   "status": "n/a",
   "note": "Nothing to cancel: our agent used the free plan.",
   "docs_note": "Nothing was started this drive (no card for the free-plan drive), so cancel was not tested, not a pass, not a fail. Help article 1057: cancel from the Stripe Customer Portal (Settings → Your plan → Manage subscription); Pro stays active to the end of the billing period.",
   "docs_grade": "",
   "nothing": "free_plan"
  },
  "delete": {
   "status": "browser",
   "note": "Settings > Account > Delete account emails a 'Data erasure request' link; opening it deleted the account ('Your account has been successfully deleted'). Login afterwards: 'These credentials do not match our records.'; the booking page /an inbox returns 404. No API route.",
   "left": "deleted",
   "account": true
  }
 },
 "routes": [],
 "checkout": null,
 "docs": null,
 "claims": null,
 "pay_options": {
  "checked": "2026-10-12",
  "source": "probe",
  "options": [],
  "agentic": [],
  "paid": null,
  "exercised": null,
  "detected_grade": null,
  "trial": {
   "no_card": true,
   "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": false,
  "mcp": "official",
  "llms_txt": true,
  "webhooks": false,
  "sandbox": false
 },
 "surface_notes": {
  "api": "REST, 16 operations, paid plans only",
  "openapi": "3.0.0 embedded in Redoc page, no securitySchemes, no /openapi.json",
  "mcp": "official, read-only, Pro only, OAuth with DCR"
 },
 "can_do": [
  "Create, edit and delete a booking type in the web app, live at once on the public booking page",
  "Set buffer time, minimum notice and how far ahead bookings can be made",
  "Book, reschedule and cancel an appointment as an attendee on the public page",
  "Create a coupon code",
  "Get the review link and list contacts",
  "Delete the account through the web app and an emailed link"
 ],
 "cannot_do": [
  {
   "what": "Use the REST API or MCP server",
   "why": "Paid plans only; on Free no token can be made and OAuth authorize refuses"
  },
  {
   "what": "Sign up headless",
   "why": "Only a web form with reCAPTCHA; no sign-up API"
  },
  {
   "what": "Take paid bookings, subscriptions, packages or sell products",
   "why": "Needs a Stripe or PayPal merchant account connected"
  },
  {
   "what": "Sync a calendar",
   "why": "Needs a Google, Microsoft or Apple calendar account"
  },
  {
   "what": "Run a date poll",
   "why": "Not found: no menu entry and /date-polls is 404"
  },
  {
   "what": "Buy Pro without a person's card",
   "why": "Only a hosted Stripe Checkout; no agent payment rail or billing API"
  }
 ],
 "blockers": [
  "API and MCP access require a paid plan",
  "Sign-up only through a reCAPTCHA web form"
 ],
 "tips_for_owner": [
  "Open read-only API access on Free",
  "Make MCP authorize match its docs",
  "Add a documented agent sign-up route",
  "Fix the pricing Subscribe link",
  "Accept an agent payment rail for Pro",
  "Support CIMD next to DCR",
  "Add securitySchemes and serve the OpenAPI file",
  "Add an account delete API call"
 ],
 "tips_for_agents": [
  "On Free, everything is in the web app: drive it in a browser; the API and MCP need Pro or a lifetime plan.",
  "Booking type forms need title, URL slug and description in one go; a missing description gives 'The description field is required.'",
  "The public booking page has a second email field (the footer sign-up); target the one inside the booking dialog.",
  "Confirmation mails carry reschedule and cancel links with a booker_token; use them to change a booking as the attendee.",
  "Account delete needs the emailed confirmation link."
 ],
 "selfhost": null,
 "summary": "On TidyCal's free plan an agent can do the core scheduling in a browser: create a booking type, publish it, and book, reschedule and cancel an appointment. The REST API and the read-only MCP server need a paid plan, so nothing works headless after the docs. Sign-up is a reCAPTCHA web form that let our agent's browser through, and Pro is sold only through a hosted Stripe card checkout.",
 "wall": "API and MCP need a paid plan",
 "plan_scope": "free plan",
 "robots_stop": null,
 "robots": null,
 "plain": {
  "summary": "TidyCal is an online appointment-scheduling tool. On its free plan, an automated agent could sign up, build a booking page, and let someone book, reschedule and cancel a meeting entirely on its own. It got stuck trying to use TidyCal's API or AI-assistant connection, which TidyCal only turns on for paying customers.",
  "can_do": [
   "Set up a booking page and a type of meeting people can book, and publish it instantly",
   "Let someone see open times, book a slot, get a confirmation email, reschedule or cancel",
   "Set a buffer between meetings and limits on how soon or how far ahead people can book",
   "Make a discount coupon and see who has booked",
   "Delete the whole account by following an emailed confirmation link"
  ],
  "cannot_do": [
   {
    "what": "Connect through TidyCal's API or AI-assistant tool",
    "why": "Both require upgrading to a paid plan"
   },
   {
    "what": "Create an account without a web browser",
    "why": "Sign-up is only a web form"
   },
   {
    "what": "Take paid bookings or sell packages/products",
    "why": "Needs a Stripe or PayPal account connected, which the test did not have"
   },
   {
    "what": "Sync a Google/Microsoft/Apple calendar or import from Calendly",
    "why": "Needs an outside calendar/Calendly account the test did not have"
   },
   {
    "what": "Pay for the paid plan by itself",
    "why": "Only a human credit-card checkout exists; no automated payment option"
   }
  ]
 },
 "plan_gated": [
  {
   "capability": "API access (all REST endpoints, personal tokens)",
   "plan": "Pro or lifetime",
   "evidence": "Docs: '(API access requires a paid plan)'; Integrations > API: 'Unlock Integrations by upgrading'"
  },
  {
   "capability": "MCP server (read-only)",
   "plan": "Pro",
   "evidence": "/oauth/authorize on Free: 'For API access please upgrade to a lifetime plan!'"
  },
  {
   "capability": "Auto-create meeting links",
   "plan": "Pro",
   "evidence": "Integrations > Video conferences: 'Unlock Auto-Create Meeting URLs by upgrading.'"
  },
  {
   "capability": "Group bookings",
   "plan": "Pro",
   "evidence": "'Allow group bookings.Pro Unlock group bookings by upgrading'"
  },
  {
   "capability": "Multiple locations",
   "plan": "Pro",
   "evidence": "'Unlock multiple locations by upgrading'"
  },
  {
   "capability": "Manual approval",
   "plan": "Pro",
   "evidence": "'Unlock manual booking approvals by upgrading'"
  },
  {
   "capability": "Booking limits",
   "plan": "Pro",
   "evidence": "'Unlock booking limits by upgrading'"
  },
  {
   "capability": "Confirmation redirect",
   "plan": "paid",
   "evidence": "Pricing: Confirmation Redirect x on Free"
  },
  {
   "capability": "Cancellation controls",
   "plan": "Pro",
   "evidence": "'Unlock cancellation controls by upgrading'"
  },
  {
   "capability": "Custom emails",
   "plan": "Pro",
   "evidence": "Settings > Your plan: Custom Emails listed under Upgrade to Pro"
  },
  {
   "capability": "SMS reminders",
   "plan": "Pro",
   "evidence": "'Unlock SMS Reminders by upgrading.'"
  },
  {
   "capability": "CC addresses",
   "plan": "Pro",
   "evidence": "Settings > Your plan: CC Email Addresses listed under Upgrade to Pro"
  },
  {
   "capability": "Teams",
   "plan": "paid",
   "evidence": "'Unlock Teams by upgrading'"
  },
  {
   "capability": "CSV export",
   "plan": "paid",
   "evidence": "Pricing: CSV export x on Free"
  },
  {
   "capability": "Booking type stats",
   "plan": "paid",
   "evidence": "Pricing: Booking Type Stats x on Free"
  },
  {
   "capability": "Google Analytics / GTM",
   "plan": "paid",
   "evidence": "'Unlock Google Analytics Integration by upgrading.'"
  },
  {
   "capability": "Custom domain / no branding",
   "plan": "Pro",
   "evidence": "Settings > Your plan: Custom domain, No TidyCal branding under Upgrade to Pro"
  }
 ],
 "reply": null,
 "capabilities": [
  {
   "id": "cap-01",
   "group": "Booking page",
   "capability": "Create a booking type (service/event to be booked)",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "POST /api/booking-types",
    "mcp": null,
    "cli": null,
    "ui": "Booking Types"
   },
   "check": "GET /api/booking-types returns the new booking type",
   "source": "https://tidycal.com/developer/docs/; https://help.tidycal.com/article/686-booking-type"
  },
  {
   "id": "cap-02",
   "group": "Booking page",
   "capability": "Publish a shareable personal booking page",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "tidycal.com/{vanity_path}"
   },
   "check": "Visiting https://tidycal.com/{vanity_path} shows live booking page listing booking types",
   "source": "https://tidycal.com/"
  },
  {
   "id": "cap-03",
   "group": "Scheduling",
   "capability": "View available timeslots for a booking type",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "GET /api/booking-types/{id}/timeslots",
    "mcp": "list availability tool",
    "cli": null,
    "ui": "booking page"
   },
   "check": "Response lists open slots matching host availability and existing bookings",
   "source": "https://tidycal.com/developer/docs/"
  },
  {
   "id": "cap-04",
   "group": "Scheduling",
   "capability": "Book an appointment as an attendee",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "POST /api/booking-types/{id}/bookings",
    "mcp": null,
    "cli": null,
    "ui": "booking page"
   },
   "check": "GET /api/bookings/{id} shows the new booking with starts_at/ends_at and contact",
   "source": "https://tidycal.com/developer/docs/; https://help.tidycal.com/article/147-tidycal-automations"
  },
  {
   "id": "cap-05",
   "group": "Scheduling",
   "capability": "Cancel a booking",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "PATCH /api/bookings/{booking}",
    "mcp": null,
    "cli": null,
    "ui": "booking detail page"
   },
   "check": "GET /api/bookings/{id} shows cancelled_at populated",
   "source": "https://tidycal.com/developer/docs/"
  },
  {
   "id": "cap-06",
   "group": "Scheduling",
   "capability": "Reschedule a booking",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "booking confirmation email / booking page"
   },
   "check": "Booking's starts_at/ends_at changes and old slot reopens, subject to reschedule restrictions",
   "source": "https://help.tidycal.com/article/753-booking-types-and-availability (Reschedule Restrictions)"
  },
  {
   "id": "cap-07",
   "group": "Scheduling",
   "capability": "Sync calendars to block availability (Google/Office 365/Apple)",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": "list-busy-times tool",
    "cli": null,
    "ui": "Integrations > Calendars"
   },
   "check": "Busy times from connected calendar block out slots in timeslot listing",
   "source": "https://help.tidycal.com/article/146-adding-calendars-to-your-tidycal-account; https://tidycal.com/mcp-docs"
  },
  {
   "id": "cap-08",
   "group": "Payments",
   "capability": "Accept payment for a paid booking (Stripe/PayPal)",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "booking page checkout"
   },
   "check": "GET /api/bookings/{id} includes a payment object with payment_id, amount, currency",
   "source": "https://help.tidycal.com/article/715-paid-bookings; https://tidycal.com/pricing"
  },
  {
   "id": "cap-09",
   "group": "Payments",
   "capability": "Set up recurring/subscription bookings with auto-renewal",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "booking type settings > Subscriptions"
   },
   "check": "Contact's subscription renews and a new booking/charge appears at the next interval",
   "source": "https://help.tidycal.com/article/1005-subscriptions---recurring-payments-with-booking-credits; https://tidycal.com/pricing"
  },
  {
   "id": "cap-10",
   "group": "Payments",
   "capability": "Sell session packages/bundles (pre-paid multi-session passes)",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "booking type settings > Packages"
   },
   "check": "Contact's package shows remaining session credits decrementing as bookings are used",
   "source": "https://help.tidycal.com/article/999-recurring-bookings; https://tidycal.com/pricing"
  },
  {
   "id": "cap-11",
   "group": "Automation",
   "capability": "Auto-create meeting links (Zoom/Google Meet/Teams)",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "booking type > Location"
   },
   "check": "GET /api/bookings/{id} includes meeting_url/meeting_id for the video provider",
   "source": "https://tidycal.com/pricing (Auto-Create Meeting URLs)"
  },
  {
   "id": "cap-12",
   "group": "Booking page",
   "capability": "Offer group bookings (multiple attendees per slot)",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "booking type settings > Group bookings"
   },
   "check": "Slot shows multiple attendees booked against the same starts_at",
   "source": "https://tidycal.com/pricing (Group Bookings)"
  },
  {
   "id": "cap-13",
   "group": "Booking page",
   "capability": "Run a date poll to find a time across invitees",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Date Polls"
   },
   "check": "Poll page shows invitee votes per proposed date/time",
   "source": "https://help.tidycal.com/article/1002-how-to-use-date-polls-in-tidycal; https://tidycal.com/pricing"
  },
  {
   "id": "cap-14",
   "group": "Booking page",
   "capability": "Offer multiple locations per booking type (address/phone/video)",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": "location fields on booking type tool",
    "cli": null,
    "ui": "booking type > Location"
   },
   "check": "Booking page shows a location picker and chosen location is saved on the booking",
   "source": "https://tidycal.com/pricing (Multiple Locations); https://tidycal.com/mcp-docs"
  },
  {
   "id": "cap-15",
   "group": "Booking page",
   "capability": "Add custom intake form questions",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "booking type > Questions"
   },
   "check": "GET /api/bookings/{id}.questions includes the custom question and attendee's answer",
   "source": "https://help.tidycal.com/article/769-how-do-i-set-up-custom-intake-form-questions"
  },
  {
   "id": "cap-16",
   "group": "Booking page",
   "capability": "Require manual approval before a booking is confirmed",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "booking type settings > Approval"
   },
   "check": "New booking sits in a pending state until host approves it from the dashboard",
   "source": "https://help.tidycal.com/article/933-how-to-enable-and-use-booking-approval-workflow; https://tidycal.com/pricing"
  },
  {
   "id": "cap-17",
   "group": "Booking page",
   "capability": "Set daily/weekly/monthly booking limits",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "booking type > Limits"
   },
   "check": "Timeslot listing stops offering slots once the configured cap is reached for the period",
   "source": "https://help.tidycal.com/article/937-how-to-set-booking-limits-daily-weekly-monthly-caps; https://tidycal.com/pricing"
  },
  {
   "id": "cap-18",
   "group": "Booking page",
   "capability": "Set buffer time between bookings",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "booking type > Availability"
   },
   "check": "Adjacent slots within the buffer window no longer appear as bookable",
   "source": "https://help.tidycal.com/article/759-can-i-prevent-clients-from-booking-me-back-to-back-creating-buffers"
  },
  {
   "id": "cap-19",
   "group": "Booking page",
   "capability": "Restrict how far in advance / how late bookings can be made",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "booking type > Availability"
   },
   "check": "Timeslot listing excludes dates outside the configured min/max notice window",
   "source": "https://help.tidycal.com/article/766-how-far-in-advance-can-clients-book-me"
  },
  {
   "id": "cap-20",
   "group": "Booking page",
   "capability": "Create coupon/discount codes for paid bookings",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "booking type > Discounts"
   },
   "check": "Applying code at checkout reduces the charged amount on the resulting payment record",
   "source": "https://help.tidycal.com/article/1003-coupons-discount-codes"
  },
  {
   "id": "cap-21",
   "group": "Booking page",
   "capability": "Sell digital products (PDFs, courses, templates) alongside bookings",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "booking type > Digital storefront"
   },
   "check": "Booker's checkout includes a digital product add-on and receives a download link after payment",
   "source": "https://help.tidycal.com/article/1059-digital-storefront---sell-digital-products-with-tidycal; https://tidycal.com/pricing"
  },
  {
   "id": "cap-22",
   "group": "Booking page",
   "capability": "Create a booking on behalf of a guest",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "dashboard > Bookings > New"
   },
   "check": "New booking appears attributed to the named guest without them submitting the form",
   "source": "https://help.tidycal.com/article/1062-create-a-booking-on-behalf-of-a-guest"
  },
  {
   "id": "cap-23",
   "group": "Booking page",
   "capability": "Redirect bookers to a custom URL after confirmation",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "booking type > Confirmation"
   },
   "check": "Completing a booking navigates the browser to the configured redirect URL",
   "source": "https://help.tidycal.com/article/770-how-to-redirect-clients-to-a-custom-url-after-booking"
  },
  {
   "id": "cap-24",
   "group": "Booking page",
   "capability": "Set cancellation/no-show fees and controls",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "booking type > Cancellation"
   },
   "check": "Cancelling within the restricted window charges the configured fee, visible in payment records",
   "source": "https://help.tidycal.com/article/1063-cancellation-and-no-show-fees"
  },
  {
   "id": "cap-25",
   "group": "Notifications",
   "capability": "Customize and schedule automated confirmation/reminder emails",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "booking type > Notifications"
   },
   "check": "Attendee receives an email matching the customized template/timing before or after the booking",
   "source": "https://help.tidycal.com/article/1054-automated-emails-before-and-after-bookings; https://tidycal.com/pricing"
  },
  {
   "id": "cap-26",
   "group": "Notifications",
   "capability": "Send SMS reminders to attendees",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "booking type > Notifications > SMS"
   },
   "check": "Attendee with a US/Canada number receives an SMS reminder before the booking time",
   "source": "https://help.tidycal.com/article/932-how-to-set-up-sms-reminders-text-message-notifications; https://tidycal.com/pricing"
  },
  {
   "id": "cap-27",
   "group": "Notifications",
   "capability": "CC additional email addresses on booking notifications",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "booking type > Notifications"
   },
   "check": "CC'd address receives the same confirmation/cancellation emails as the host",
   "source": "https://help.tidycal.com/article/935-how-to-add-cc-email-addresses-to-booking-notifications"
  },
  {
   "id": "cap-28",
   "group": "Notifications",
   "capability": "Collect ratings and reviews after a booking",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "post-booking email / booking type > Reviews"
   },
   "check": "Submitted rating/review appears attached to the booking type for public display",
   "source": "https://help.tidycal.com/article/927-collect-customer-ratings-and-reviews-after-bookings"
  },
  {
   "id": "cap-29",
   "group": "Team",
   "capability": "Manage a team and assign booking types (round robin / collective)",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": "GET /api/teams, GET /api/teams/{id}/users, POST /api/teams/{id}/users",
    "mcp": "list-teams tool",
    "cli": null,
    "ui": "Teams"
   },
   "check": "GET /api/teams/{id}/bookings shows bookings distributed across member calendars per the assignment rule",
   "source": "https://tidycal.com/developer/docs/; https://help.tidycal.com/category/755-team-agency-management; https://tidycal.com/pricing"
  },
  {
   "id": "cap-30",
   "group": "Data",
   "capability": "Export booking/contact data to CSV",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "dashboard > Bookings > Export"
   },
   "check": "Downloaded CSV file lists bookings/contacts matching the dashboard view",
   "source": "https://tidycal.com/pricing (CSV export)"
  },
  {
   "id": "cap-31",
   "group": "Data",
   "capability": "Manage contacts (list and create)",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": "GET /api/contacts, POST /api/contacts",
    "mcp": null,
    "cli": null,
    "ui": "dashboard > Contacts"
   },
   "check": "GET /api/contacts includes the newly created contact's name/email",
   "source": "https://tidycal.com/developer/docs/"
  },
  {
   "id": "cap-32",
   "group": "Data",
   "capability": "View booking-type analytics/stats",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "booking type > Stats"
   },
   "check": "Stats page shows view/booking counts matching actual booking activity for that type",
   "source": "https://tidycal.com/pricing (Booking Type Stats)"
  },
  {
   "id": "cap-33",
   "group": "Data",
   "capability": "Connect Google Analytics / Google Tag Manager to booking pages",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "booking type > Analytics"
   },
   "check": "Configured GA/GTM ID fires tracking events when the booking page is visited",
   "source": "https://tidycal.com/pricing (Google Analytics Integration, Google Tag Manager)"
  },
  {
   "id": "cap-34",
   "group": "Automation",
   "capability": "Import existing event types from Calendly",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Settings > Import from Calendly"
   },
   "check": "Imported Calendly event types appear as new TidyCal booking types with matching settings",
   "source": "https://tidycal.com/pricing (Calendly importer FAQ)"
  },
  {
   "id": "cap-37",
   "group": "Automation",
   "capability": "Sync booking attendees into a SendFox email list",
   "weight": "peripheral",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Integrations > Automations > Email marketing"
   },
   "check": "New attendee's email appears added to the connected SendFox list after booking",
   "source": "https://help.tidycal.com/article/147-tidycal-automations"
  },
  {
   "id": "cap-38",
   "group": "Branding",
   "capability": "Build a custom TidyCal website/landing page",
   "weight": "peripheral",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Website builder"
   },
   "check": "Published landing page is reachable at the account's vanity URL with custom sections",
   "source": "https://help.tidycal.com/article/1001-how-to-create-your-tidycal-webpage-landing-page-builder"
  },
  {
   "id": "cap-39",
   "group": "Branding",
   "capability": "Set a custom domain for the booking page and remove TidyCal branding",
   "weight": "peripheral",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Settings > Domain / Branding"
   },
   "check": "Booking page loads under the custom domain with no TidyCal logo/footer shown",
   "source": "https://tidycal.com/pricing (Custom domain, TidyCal Branding)"
  },
  {
   "id": "cap-40",
   "group": "Branding",
   "capability": "List booking page in TidyCal's public directory",
   "weight": "peripheral",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Settings > Directory"
   },
   "check": "Booking page appears in https://tidycal.com/directory listing",
   "source": "https://tidycal.com/pricing (Directory Access); https://tidycal.com/directory"
  }
 ],
 "attempts": [
  {
   "t": "01:13",
   "cap": "discovery",
   "capability": "docs",
   "task": "Find API docs and spec",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "https://tidycal.com/developer/docs/ (Redoc, TidyCal API 0.1, openapi 3.0.0 embedded, download openapi.json); 16 operations: /me, /bookings, /bookings/{booking}, PATCH /bookings/{booking}/cancel, /booking-types GET/POST, timeslots, POST bookings, /contacts GET/POST, /teams...; servers //tidycal.com/api. Auth: personal access token or OAuth client; docs say: (API access requires a paid plan)",
   "notes": "No securitySchemes in the spec. llms.txt at /llms.txt (H1 TidyCal, Developers section links API docs and MCP docs).",
   "quality": {
    "docs_match": "match",
    "docs_url": "https://tidycal.com/developer/docs/"
   }
  },
  {
   "t": "01:13",
   "cap": "discovery",
   "capability": "mcp",
   "task": "MCP server/discover 2026-07-28",
   "route": "mcp",
   "documented": true,
   "result": "blocked",
   "verified": true,
   "evidence": "POST https://tidycal.com/mcp server/discover -> HTTP 401 {\"message\":\"Unauthenticated.\"}, WWW-Authenticate: Bearer realm=\"MCP\", resource_metadata=\"https://tidycal.com/.well-known/oauth-protected-resource\". PRM: authorization_servers [https://tidycal.com], scopes mcp:scheduling:read. AS metadata: registration_endpoint /oauth/register (DCR), S256 PKCE, no client_id_metadata_document_supported, no device flow, no agent_auth.",
   "notes": "mcp-docs: read-only; Pro required (On a free plan the connection authenticates but every call returns TidyCal Pro is required to use the MCP server.)"
  },
  {
   "t": "01:13",
   "cap": "pay",
   "capability": "pay public probes",
   "task": "402 challenges, registries, checkout, trial",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "pay_probe.json: no 402 challenges (api./x402./mpp./agents. subdomains do not resolve), not in mpp.dev, Stripe Projects or x402 Bazaar, /.well-known/ucp 404, /openapi.json 404. pay_tx.json: refused, no 402 asking for USDC. Pricing page: Free $0 forever; Individual Lifetime $29 one-time via AppSumo; Pro $12/mo. Signup: Get started free No credit card required. Docs mention no billing API.",
   "notes": "No agent payment rail; billing is a card checkout (to confirm where once logged in)."
  },
  {
   "t": "01:51",
   "cap": "signup",
   "capability": "sign up headless",
   "task": "Sign up via documented route without a browser",
   "route": "none",
   "documented": true,
   "result": "blocked",
   "verified": true,
   "evidence": "Only sign-up route is the web form https://tidycal.com/register (class recaptcha-form, data-recaptcha-action=register): the reCAPTCHA token is made by JS in a browser. No sign-up API, no agent registration (no auth.md/agent_auth), no device flow.",
   "notes": "Did not POST the form without its reCAPTCHA token (that would skip the check); tried the browser next."
  },
  {
   "t": "02:07",
   "cap": "signup",
   "capability": "sign up in browser",
   "task": "Create account at /register in the browser",
   "route": "browser",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "pw: filled name AgentDrives Test, the agent's inbox, password; Create account -> redirected to https://tidycal.com/onboarding/v3/profile (1 / 3 Add a profile photo). reCAPTCHA (invisible, v3-style, no widget) let our agent's browser through.",
   "notes": "agentdrives.com address accepted."
  },
  {
   "t": "03:42",
   "cap": "credentials",
   "key": "create",
   "capability": "API key",
   "task": "Create a personal access token",
   "route": "browser",
   "documented": true,
   "result": "plan_gated",
   "verified": true,
   "evidence": "https://tidycal.com/integrations/advanced on free plan: API - Use our API endpoints for custom applications and integrations. Unlock Integrations by upgrading. Docs: (API access requires a paid plan). Pricing: API Access x on Free. No API/CLI route to create a token exists in the OpenAPI (16 ops, none for tokens).",
   "notes": "Token creation is web-UI only even on paid plans.",
   "quality": {
    "docs_url": "https://tidycal.com/developer/docs/"
   }
  },
  {
   "t": "03:43",
   "cap": "credentials",
   "key": "create",
   "capability": "MCP OAuth (DCR + PKCE)",
   "task": "Register an MCP client and authorize it",
   "route": "mcp",
   "documented": true,
   "result": "plan_gated",
   "verified": true,
   "evidence": "POST /oauth/register -> 200 client_id 1687, scope mcp:scheduling:read, auth none (DCR works headless). GET /oauth/authorize (S256, resource=https://tidycal.com/mcp) signed in on free plan -> page text: For API access please upgrade to a lifetime plan!",
   "notes": "Drift: mcp-docs say On a free plan the connection authenticates but every call returns TidyCal Pro is required; in fact authorize stops before any code is issued.",
   "quality": {
    "docs_url": "https://tidycal.com/mcp-docs",
    "error_legibility": "clear",
    "recoverable": "no"
   }
  },
  {
   "t": "03:43",
   "cap": "first_call",
   "capability": "first API call",
   "task": "GET /api/me",
   "route": "api",
   "documented": true,
   "result": "plan_gated",
   "verified": true,
   "evidence": "GET https://tidycal.com/api/me without token -> 401 application/json {\"message\":\"Unauthenticated.\"}; no token obtainable on the free plan (Unlock Integrations by upgrading).",
   "notes": "Error is not problem+json, no hint how to authenticate.",
   "quality": {
    "error_legibility": "vague",
    "docs_url": "https://tidycal.com/developer/docs/"
   }
  },
  {
   "t": "06:25",
   "cap": "cap-01",
   "step": "create",
   "capability": "Create a booking type",
   "task": "Create 1:1 booking type AgentDrives Test Session",
   "route": "browser",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "Dashboard > Booking types > New booking type > 1:1: title, slug agentdrives-test, description; Save -> Booking type saved successfully! First Save without description: The description field is required. (clear)",
   "notes": "API POST /api/booking-types exists but API is paid-only; browser route used. pw state resets per call, so the whole form must go in one action.",
   "quality": {
    "docs_match": "match",
    "docs_url": "https://help.tidycal.com/article/686-booking-type",
    "error_legibility": "clear",
    "recoverable": "yes"
   }
  },
  {
   "t": "06:25",
   "cap": "cap-01",
   "step": "read",
   "capability": "Create a booking type",
   "task": "Read back the new booking type",
   "route": "browser",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "Booking types list shows AgentDrives Test Session Enabled 15 minutes; public https://tidycal.com/an inbox/agentdrives-test 200 with the title.",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match",
    "docs_url": "https://help.tidycal.com/article/686-booking-type"
   }
  },
  {
   "t": "06:25",
   "cap": "cap-02",
   "step": "use",
   "capability": "Publish a shareable booking page",
   "task": "Open the public booking page",
   "route": "browser",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "GET https://tidycal.com/an inbox 200 lists AgentDrives Test Session and 15 Minute Meeting; page live right after sign-up.",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match",
    "docs_url": "https://tidycal.com/"
   }
  },
  {
   "t": "07:08",
   "cap": "cap-01",
   "step": "update",
   "capability": "Create a booking type",
   "task": "Rename to v2 and change duration to 45 min",
   "route": "browser",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "Edit /dashboard/booking-types/2118037/edit: title AgentDrives Test Session v2, 45 min, Save -> Booking type saved successfully!; list read back: AgentDrives Test Session v2 Enabled 45 minutes",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match",
    "docs_url": "https://help.tidycal.com/article/686-booking-type"
   }
  },
  {
   "t": "08:01",
   "cap": "cap-18",
   "capability": "Buffer time between bookings",
   "task": "Add a 10-minute gap between bookings",
   "route": "browser",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "Booking type > Restrictions: Add a [10] minute gap between bookings; Save; reloaded edit page reads back 10.",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match"
   }
  },
  {
   "t": "08:01",
   "cap": "cap-19",
   "capability": "Advance/late booking limits",
   "task": "Allow bookings 30 days ahead, require 4 hours notice",
   "route": "browser",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "Restrictions: Allow bookings [30] days ahead, Require at least [4] hours notice; Save; reload reads back 30 and 4.",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match"
   }
  },
  {
   "t": "08:01",
   "cap": "cap-16",
   "capability": "Require manual approval",
   "task": "Turn it on for the test booking type",
   "route": "browser",
   "documented": true,
   "result": "plan_gated",
   "verified": true,
   "evidence": "Booking type editor on free plan: Manually approve bookings.Pro - Unlock manual booking approvals by upgrading"
  },
  {
   "t": "08:01",
   "cap": "cap-17",
   "capability": "Booking limits",
   "task": "Turn it on for the test booking type",
   "route": "browser",
   "documented": true,
   "result": "plan_gated",
   "verified": true,
   "evidence": "Booking type editor on free plan: Set maximum bookings.Pro - Unlock booking limits by upgrading"
  },
  {
   "t": "08:01",
   "cap": "cap-24",
   "capability": "Cancellation/no-show controls",
   "task": "Turn it on for the test booking type",
   "route": "browser",
   "documented": true,
   "result": "plan_gated",
   "verified": true,
   "evidence": "Booking type editor on free plan: Allow cancellations.Pro - Unlock cancellation controls by upgrading"
  },
  {
   "t": "08:02",
   "cap": "cap-14",
   "capability": "Multiple locations",
   "task": "Turn it on for the test booking type",
   "route": "browser",
   "documented": true,
   "result": "plan_gated",
   "verified": true,
   "evidence": "Booking type editor on free plan: Location: Unlock multiple locations by upgrading"
  },
  {
   "t": "09:21",
   "cap": "cap-03",
   "step": "read",
   "capability": "View available timeslots",
   "task": "See open slots for the test booking type",
   "route": "browser",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "Public page https://tidycal.com/an inbox/agentdrives-test listed Monday 12th 2:15 PM ... 4:15 PM UTC; first slot respects the 4-hour notice set in (page opened ~10:08 UTC).",
   "notes": "API GET /booking-types/{id}/timeslots is paid-only.",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match",
    "docs_url": "https://tidycal.com/developer/docs/"
   }
  },
  {
   "t": "09:21",
   "cap": "cap-04",
   "step": "create",
   "capability": "Book an appointment as an attendee",
   "task": "Book Mon 12 Oct 3:00 PM UTC as the agent's inbox",
   "route": "browser",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "Public page: slot 3:00 PM, name + email, Book event (invisible reCAPTCHA passed) -> confirmation 3:00 PM - 3:45 PM UTC with Reschedule/Cancel. Dashboard > Bookings shows October 12, 2026 3:00 PM AgentDrives Test Session v2. Mail Your booking is confirmed from service@tidycal.com arrived at an inbox 10:09:43.",
   "notes": "First try left the email blank because the page has a second email field (Make your own booking page footer form); no inline error shown, the modal just stayed open.",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match",
    "docs_url": "https://tidycal.com/developer/docs/",
    "error_legibility": "silent",
    "recoverable": "yes"
   }
  },
  {
   "t": "09:52",
   "cap": "cap-06",
   "step": "update",
   "capability": "Reschedule a booking",
   "task": "Move the booking from 3:00 PM to 4:15 PM",
   "route": "browser",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "Reschedule link from the confirmation mail -> picked 4:15 PM -> Reschedule booking -> confirmation 4:15 PM - 5:00 PM UTC. Dashboard > Bookings shows 4:15 PM, Scheduled; mail Booking rescheduled ... Previous: 3:00 PM Updated: 4:15 PM.",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match"
   }
  },
  {
   "t": "11:02",
   "cap": "cap-05",
   "step": "delete",
   "capability": "Cancel a booking",
   "task": "Cancel the rescheduled booking",
   "route": "browser",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "Confirmation page (link from mail) > Cancel > Cancel booking dialog (optional reason) > Cancel -> Booking cancelled!. Dashboard > Bookings > Canceled (?show=cancelled) lists October 12, 2026 4:15 PM AgentDrives Test Session v2 Canceled.",
   "notes": "Docs path is PATCH /bookings/{booking}/cancel (paid API); capability map lists PATCH /api/bookings/{booking}.",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match",
    "docs_url": "https://tidycal.com/developer/docs/"
   }
  },
  {
   "t": "16:46",
   "cap": "cap-01",
   "step": "delete",
   "capability": "Create a booking type",
   "task": "Delete the test booking type",
   "route": "browser",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "Booking types card menu > delete (confirm: Permanently delete ... Existing bookings will stay) -> list shows only the 3 default types; public https://tidycal.com/an inbox/agentdrives-test now 302 (was 200).",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match",
    "docs_url": "https://help.tidycal.com/article/686-booking-type"
   }
  },
  {
   "t": "16:46",
   "cap": "cap-07",
   "capability": "Sync calendars",
   "task": "Connect a calendar to block busy times",
   "route": "browser",
   "documented": true,
   "result": "blocked",
   "verified": true,
   "evidence": "Integrations > Calendars offers Add Google account / Add Microsoft 365 account / Add Apple account (Apple ID + app-specific password). Every option needs an outside calendar account; our agent has none.",
   "notes": "Not tested: needs a third-party calendar account (Google, Microsoft or Apple) that our agent does not have.",
   "quality": {
    "docs_url": "https://help.tidycal.com/"
   }
  },
  {
   "t": "16:46",
   "cap": "cap-08",
   "capability": "Accept payment for a paid booking",
   "task": "Make a $1 per-booking type",
   "route": "browser",
   "documented": true,
   "result": "blocked",
   "verified": true,
   "evidence": "Booking type > Pricing & Subscriptions > Per booking: Charge USD 1.00; Payment platform: Required: Connect your Stripe account. Integrations > Payments: Stripe is not connected / PayPal email. Needs a Stripe or PayPal merchant account we do not have.",
   "quality": {
    "error_legibility": "clear"
   }
  },
  {
   "t": "16:46",
   "cap": "cap-09",
   "capability": "Recurring/subscription bookings",
   "task": "Offer a subscription booking type",
   "route": "browser",
   "documented": true,
   "result": "blocked",
   "verified": true,
   "evidence": "Dashboard > Subscriptions shows quick-start offers (1 session / mo $75 ...); Pricing tab Subscription option needs the same Stripe/PayPal connection as paid bookings (Required: Connect your Stripe account).",
   "notes": "Free plan includes it (pricing: Recurring & package bookings), but charging needs a payment account we do not have.",
   "quality": {}
  },
  {
   "t": "16:47",
   "cap": "cap-10",
   "capability": "Session packages",
   "task": "Sell a package of sessions",
   "route": "browser",
   "documented": true,
   "result": "blocked",
   "verified": true,
   "evidence": "New booking type > Package preset (Bundle of sessions sold together) and Packages & Recurring tab exist; selling a package is a paid booking and needs Stripe/PayPal connected (Required: Connect your Stripe account).",
   "quality": {}
  },
  {
   "t": "16:47",
   "cap": "cap-11",
   "capability": "Auto-create meeting links",
   "task": "Turn on auto Google Meet/Zoom links",
   "route": "browser",
   "documented": true,
   "result": "plan_gated",
   "verified": true,
   "evidence": "Integrations > Video conferences: Unlock Auto-Create Meeting URLs by upgrading."
  },
  {
   "t": "16:47",
   "cap": "cap-12",
   "capability": "Group bookings",
   "task": "Allow several attendees per slot",
   "route": "browser",
   "documented": true,
   "result": "plan_gated",
   "verified": true,
   "evidence": "Booking type > Groups & Guests: Allow group bookings.Pro - Unlock group bookings by upgrading."
  },
  {
   "t": "16:47",
   "cap": "cap-13",
   "capability": "Date polls",
   "task": "Open date polls",
   "route": "browser",
   "documented": true,
   "result": "failed",
   "verified": true,
   "evidence": "No Date Polls entry in the dashboard menu (Bookings, Booking types, Availability, Teams, Subscriptions, Coupons, Contacts, Emails, Reviews); https://tidycal.com/date-polls -> 404 Page not found.",
   "notes": "May have moved or been removed; could not find it in the web app."
  },
  {
   "t": "16:48",
   "cap": "cap-15",
   "capability": "Intake questions",
   "task": "Find intake questions",
   "route": "browser",
   "documented": true,
   "result": "partial",
   "verified": false,
   "evidence": "Booking type > Advanced > Questions: toggle Enable questions to attendees. (no Pro badge on the free plan); not saved with a question in this drive.",
   "notes": "Not finished for time."
  },
  {
   "t": "16:48",
   "cap": "cap-20",
   "capability": "Coupon codes",
   "task": "Create coupon AGENTDRIVES10, 10% off",
   "route": "browser",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "Coupons > New coupon: code AGENTDRIVES10, Percent 10, Save; list reads back AGENTDRIVES10 10% off All booking types 0 uses. First try with the percent empty: Save did nothing, no message.",
   "notes": "Delete via the row menu did not complete in our run (Delete? prompt); the coupon goes with the account.",
   "quality": {
    "verify_route": "yes",
    "error_legibility": "silent",
    "recoverable": "yes"
   }
  },
  {
   "t": "16:48",
   "cap": "cap-21",
   "capability": "Digital products",
   "task": "Sell a digital product",
   "route": "browser",
   "documented": true,
   "result": "blocked",
   "verified": true,
   "evidence": "Pricing tab Add-ons: create a published product that uses the same payment provider as this booking type; needs Stripe/PayPal connected, which we cannot do."
  },
  {
   "t": "16:48",
   "cap": "cap-22",
   "capability": "Book on behalf of a guest",
   "task": "Send a booking invite from Bookings",
   "route": "browser",
   "documented": true,
   "result": "partial",
   "verified": false,
   "evidence": "Dashboard > Bookings has a form: Pick a booking type and time, then we'll email your guest a link to confirm the booking ... Send booking invite; it said You don't have any eligible booking types yet. with 3 enabled free types.",
   "notes": "Not finished: no eligible booking type offered."
  },
  {
   "t": "16:48",
   "cap": "cap-23",
   "capability": "Redirect after confirmation",
   "task": "Check redirect setting",
   "route": "browser",
   "documented": true,
   "result": "plan_gated",
   "verified": true,
   "evidence": "Pricing page: Confirmation Redirect - Send bookers to a custom URL after booking. x on Free."
  },
  {
   "t": "16:48",
   "cap": "cap-25",
   "capability": "Custom reminder emails",
   "task": "Check notifications",
   "route": "browser",
   "documented": true,
   "result": "plan_gated",
   "verified": true,
   "evidence": "Capability map plan paid; Dashboard > Emails exists; booking confirmation and reschedule mails arrived at an inbox with the default templates (Your booking is confirmed; Booking rescheduled ...).",
   "notes": "Customising was not opened."
  },
  {
   "t": "16:49",
   "cap": "cap-26",
   "capability": "SMS reminders",
   "task": "Turn on SMS",
   "route": "browser",
   "documented": true,
   "result": "plan_gated",
   "verified": true,
   "evidence": "Integrations > SMS: Automated SMS reminders (U.S. & Canada) ... Unlock SMS Reminders by upgrading."
  },
  {
   "t": "16:49",
   "cap": "cap-27",
   "capability": "CC on notifications",
   "task": "Check CC setting",
   "route": "browser",
   "documented": true,
   "result": "plan_gated",
   "verified": false,
   "evidence": "Capability map lists it as paid (help.tidycal.com/article/935-how-to-add-cc-email-addresses-to-booking-notifications); not opened in the editor."
  },
  {
   "t": "16:49",
   "cap": "cap-28",
   "capability": "Ratings and reviews",
   "task": "Get the review link",
   "route": "browser",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "Dashboard > Reviews: Your review link https://tidycal.com/an inbox/review plus per-booking-type links; Visibility tab: Show reviews on booking page.",
   "notes": "No review submitted (would need a real past booking)."
  },
  {
   "t": "16:49",
   "cap": "cap-29",
   "capability": "Teams",
   "task": "Create a team",
   "route": "browser",
   "documented": true,
   "result": "plan_gated",
   "verified": true,
   "evidence": "Dashboard > Teams: Unlock Teams by upgrading. API /teams is paid too."
  },
  {
   "t": "16:49",
   "cap": "cap-30",
   "capability": "CSV export",
   "task": "Export bookings",
   "route": "browser",
   "documented": true,
   "result": "plan_gated",
   "verified": true,
   "evidence": "Pricing: CSV export - Export booker data for use in other tools. x on Free."
  },
  {
   "t": "16:49",
   "cap": "cap-31",
   "capability": "Contacts",
   "task": "List contacts",
   "route": "browser",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "Dashboard > Contacts (1): AgentDrives Test the agent's inbox Total bookings: 1 (the booker from ), with Edit contact. API GET/POST /contacts is paid-only.",
   "notes": "No create button seen on the free plan; contacts come from bookings."
  },
  {
   "t": "16:49",
   "cap": "cap-32",
   "capability": "Booking type stats",
   "task": "View stats",
   "route": "browser",
   "documented": true,
   "result": "plan_gated",
   "verified": true,
   "evidence": "Pricing: Booking Type Stats - View analytics for each booking type. x on Free."
  },
  {
   "t": "16:50",
   "cap": "cap-33",
   "capability": "GA/GTM",
   "task": "Connect Google Analytics",
   "route": "browser",
   "documented": true,
   "result": "plan_gated",
   "verified": true,
   "evidence": "Integrations > Analytics: Unlock Google Analytics Integration by upgrading. / Unlock Google Tag Manager by upgrading."
  },
  {
   "t": "16:50",
   "cap": "cap-34",
   "capability": "Import from Calendly",
   "task": "Open the Calendly importer",
   "route": "browser",
   "documented": true,
   "result": "blocked",
   "verified": true,
   "evidence": "Integrations has Import from Calendly; needs a Calendly account to connect, which we do not have. /integrations/calendly redirected with The code field is required. (OAuth callback route)."
  },
  {
   "t": "16:50",
   "cap": "cap-37",
   "capability": "SendFox sync",
   "task": "Check docs and UI",
   "route": "browser",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "Integrations > Automations: Email marketing - Connect SendFox account to automatically add booking attendees to your email lists. (needs a SendFox account; not connected)."
  },
  {
   "t": "16:50",
   "cap": "cap-38",
   "capability": "Website builder",
   "task": "Check it exists",
   "route": "none",
   "documented": true,
   "result": "skipped",
   "verified": false,
   "evidence": "Not found in the dashboard menu or llms.txt during this drive; not opened."
  },
  {
   "t": "16:51",
   "cap": "cap-39",
   "capability": "Custom domain / branding",
   "task": "Check settings",
   "route": "browser",
   "documented": true,
   "result": "plan_gated",
   "verified": true,
   "evidence": "Settings tabs: Profile, Preferences, Bookings, Account, Trusted devices, Custom domain, Your plan, Themes; capability map plan paid; booking page footer shows Powered by TidyCal on free."
  },
  {
   "t": "16:51",
   "cap": "cap-40",
   "capability": "Public directory listing",
   "task": "Check the directory option",
   "route": "browser",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "Booking type > Visibility: Display in the public TidyCal Directory. toggle on free; https://tidycal.com/directory is public (llms.txt). Not switched on for our test type."
  },
  {
   "t": "16:51",
   "cap": "verify",
   "capability": "email verification",
   "task": "Verify the email address",
   "route": "browser",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "No verification step: sign-up went straight to onboarding and the dashboard; no verification mail arrived at an inbox (inbox empty after 30 s and again later). Booking features worked unverified.",
   "notes": ""
  },
  {
   "t": "16:51",
   "cap": "first_action",
   "capability": "first real action",
   "task": "Create a booking type",
   "route": "browser",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "Booking type AgentDrives Test Session created in the web app, live at tidycal.com/an inbox/agentdrives-test. No API route on the free plan."
  },
  {
   "t": "18:19",
   "cap": "pay",
   "capability": "pay step",
   "task": "Find how Pro is bought (without paying)",
   "route": "browser",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "Settings > Your plan: Your plan: Free, Subscribe to Pro -> /pricing; pricing Subscribe button (logged in) -> https://checkout.stripe.com/c/pay/cs_live_... Subscribe to TidyCal Pro EUR 11.16 per month (USD/EUR switch), Billed monthly. Lifetime plans are sold on appsumo.com. No 402, no billing API (pay_probe.json, pay_tx.json: refused, nothing to pay).",
   "notes": "Not paid: no card for this drive. The pricing page also has a Subscribe link to https://tidycal.com/subscribe, which opens a TidyCal user booking page (Maurice), not the checkout."
  },
  {
   "t": "18:19",
   "cap": "cancel",
   "capability": "cancel step",
   "task": "Cancel a started plan",
   "route": "none",
   "documented": true,
   "result": "skipped",
   "verified": false,
   "evidence": "Not tested: no plan or trial was started. help.tidycal.com/article/1057: Cancel from the Stripe Customer Portal (Settings → Your plan → Manage subscription); Pro stays active to the end of the billing period."
  },
  {
   "t": "18:19",
   "cap": "credentials",
   "key": "revoke",
   "capability": "API key",
   "task": "Revoke the token",
   "route": "none",
   "documented": true,
   "result": "blocked",
   "verified": true,
   "evidence": "No token was created (API access is paid-only: Unlock Integrations by upgrading); OAuth client 1687 from DCR never got a code (authorize: For API access please upgrade to a lifetime plan!)."
  },
  {
   "t": "19:36",
   "cap": "delete",
   "capability": "delete account",
   "task": "Delete the account and its data",
   "route": "browser",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "Settings > Account > Delete account -> toast: An email will be sent to this account s email address with a link for removal. Mail Data erasure request for TidyCal account (service@tidycal.com, 10:19) with Confirm my account deletion link /account/gdpr/••••; opening it -> /login Your account has been successfully deleted. Login again -> These credentials do not match our records.; https://tidycal.com/an inbox -> 404.",
   "notes": "Web UI plus an emailed link; no API route. Clicking Delete account twice sent two erasure mails.",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match"
   }
  }
 ],
 "stale": false,
 "icon": "/logos/tidycal.png",
 "monitored": false,
 "verdict": "Does the work (L3): our agent got in on its own past an invisible reCAPTCHA on the sign-up form, no verification mail needed. It read the headless API docs and llms.txt, then stopped at credentials: API tokens and the MCP server need a paid plan, so GET /me came back unauthenticated. Inside the browser it still created a booking type and published it live on the public page. No agent payment rail exists; upgrading means a hosted Stripe card checkout, so our agent paid nothing and stayed on the free plan. Deleting the account worked cleanly through an emailed erasure link, with login and the booking page both gone after.",
 "page": "https://agentdrives.com/tools/tidycal?via=api"
}