{
 "slug": "formbricks",
 "name": "Formbricks",
 "url": "https://formbricks.com",
 "domain": "formbricks.com",
 "category": "forms",
 "category_name": "Forms",
 "tested_at": "2026-10-02",
 "run": "20261002T205705Z",
 "draft": false,
 "reviewed": true,
 "owner_verified": null,
 "origin": "editorial",
 "history": [
  {
   "run": "20261002T060615Z",
   "date": "2026-10-02",
   "level": 3,
   "engine": {
    "runner": "omp",
    "model": null,
    "driver": null,
    "signed": true,
    "inbox": null,
    "robots": "start"
   }
  },
  {
   "run": "20261002T205705Z",
   "date": "2026-10-02",
   "level": 4,
   "engine": {
    "runner": "omp",
    "model": "claude-opus-5-5",
    "driver": 2,
    "signed": true,
    "inbox": [
     "agentdrives.com"
    ],
    "robots": "start"
   },
   "why": "product"
  }
 ],
 "level": 4,
 "level_name": "Runs on its own",
 "level_selfhost": null,
 "entry": "self-start",
 "door": {
  "passed": 2,
  "tries": 2,
  "self_start": true
 },
 "badges": [
  "agent-can-leave"
 ],
 "stages": [
  {
   "key": "in",
   "label": "Access",
   "state": "yes",
   "text": "Gets in on its own: sign-up in a browser"
  },
  {
   "key": "work",
   "label": "Use",
   "state": "yes",
   "text": "Work done: 100% 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: cancels on its own, 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: sign-up in a browser",
   "stage": "in"
  },
  {
   "key": "use",
   "label": "Use",
   "state": "yes",
   "text": "Work done: 100% 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: cancels on its own, deletes its account",
   "left": "deleted",
   "stage": "leave"
  }
 ],
 "access": [
  {
   "key": "browser_signup",
   "label": "Sign-up in a browser",
   "routes": [],
   "minutes": 6.2,
   "core": "8/8"
  }
 ],
 "minutes": 6.2,
 "next": {
  "to": 5,
  "text": "Next: pay without a person"
 },
 "stop": null,
 "core": "8/8",
 "scores": {
  "coverage": 87,
  "reliability": 86,
  "resilience": null,
  "setup": 100,
  "surface_coverage": null,
  "docs_accuracy": null,
  "docs_completeness": null
 },
 "parts": {
  "holds_up": null,
  "docs_match": null,
  "setup": 100,
  "security": null,
  "standards": []
 },
 "reliability_method": "first-try",
 "resilience": null,
 "stress": [],
 "surface_audit": null,
 "coverage_core": 100,
 "after_wall": null,
 "coverage_source": "computed",
 "driver": {
  "version": 2,
  "model": "claude-opus-5-5",
  "profile": "full",
  "assisted": false,
  "handoff": null,
  "prompt_sha": null,
  "kb_version": null,
  "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": 2,
 "works_assisted": null,
 "freshness": "fresh",
 "nothing_to_pay": false,
 "core_gated": false,
 "profiles": {},
 "agent_check": null,
 "agent_pass": null,
 "who_gets_in": {
  "server": {
   "state": "in"
  },
  "signed": {
   "state": "page",
   "kind": "signup",
   "at": "2026-10-12"
  },
  "browser": {
   "state": "in",
   "measured": false
  },
  "our_key": "pending",
  "robots": null,
  "tip": false
 },
 "ladder": {
  "docs": {
   "status": "headless",
   "note": "llms.txt + docs/llms.txt; every API page available as .md with an embedded OpenAPI fragment; MCP setup docs"
  },
  "signup": {
   "status": "browser",
   "note": "No documented sign-up API. Email sign-up form at app.formbricks.com/auth/signup worked in our agent's browser; no CAPTCHA or bot check seen"
  },
  "verify": {
   "status": "headless",
   "note": "Verification mail arrived in seconds; the GET link worked headless (302 to /auth/login?verified=1)"
  },
  "credentials": {
   "status": "browser",
   "note": "API keys are created only in the UI (Organization Settings > API Keys), workspace-scoped read/write/manage, shown once. MCP uses OAuth with dynamic client registration: discovery and registration headless, consent is one click in the browser",
   "via": ""
  },
  "first_call": {
   "status": "headless",
   "note": "GET /api/v1/management/me with x-api-key -> 200"
  },
  "first_action": {
   "status": "headless",
   "note": "POST /api/v1/management/surveys created a link survey, read back by GET"
  },
  "pay": {
   "status": "browser",
   "grade": "P2",
   "rails": [
    "Stripe (hosted)"
   ],
   "first_party": false,
   "rail_scope": "none",
   "trial_path": "no-card trial",
   "note": "No 402/x402/MPP/L402, no /.well-known/ucp, not in the x402 Bazaar or mpp.dev, no billing API. Sign-up starts a 14-day Pro trial automatically, no card needed. Upgrading is in-app ('Pay now & unlock', $89/mo) plus a Stripe customer portal at billing.formbricks.com ('Add payment method'). Graded from what we saw: a hosted flow an agent could complete alone. We had no card, so neither checkout completion nor 3DS was tested"
  },
  "cancel": {
   "status": "browser",
   "grade": "X3",
   "note": "Billing > 'Return to Hobby plan' ended the trial at once (verified: plan Hobby). Without a card the trial would also end on its own (Oct 16). No billing API"
  },
  "delete": {
   "status": "browser",
   "note": "Account > Profile > Delete account (type email + password) deletes the account and the sole-owned org; the old API key then returns 401 and login fails. No documented headless route",
   "left": "deleted",
   "account": true
  }
 },
 "routes": [],
 "checkout": null,
 "docs": null,
 "claims": null,
 "pay_options": {
  "checked": "2026-10-02",
  "source": "drive",
  "options": [
   {
    "id": "stripe-checkout",
    "name": "Stripe Checkout",
    "kind": "checkout",
    "first_party": false,
    "lead": false,
    "networks": [],
    "testnet": false
   }
  ],
  "agentic": [],
  "paid": null,
  "exercised": null,
  "detected_grade": null,
  "trial": {
   "no_card": true,
   "card_required": null,
   "free_plan": null
  },
  "owner_fixes": [
   {
    "title": "Accept x402 or MPP on your API",
    "how": "Answer an unpaid call with 402 and a payment challenge, so an agent pays per call or buys credits without an account or a card."
   },
   {
    "title": "List your plans on Stripe Projects",
    "how": "Agents buy a plan with `stripe projects add`, paid with a token under a spend cap the owner sets (projects.dev)."
   }
  ]
 },
 "surfaces": {
  "api": true,
  "openapi": true,
  "cli": false,
  "sdk": true,
  "mcp": "official",
  "llms_txt": true,
  "webhooks": true,
  "sandbox": false
 },
 "surface_notes": {
  "api": "REST: Management API v1 (x-api-key), v2 beta, unauthenticated Client API",
  "openapi": "OpenAPI fragments inside each docs .md page. The linked api-v2-reference/openapi.yml redirects to an HTML page instead of the spec",
  "mcp": "official remote MCP at app.formbricks.com/api/mcp, OAuth 2.1 + DCR, 30 tools (surveys, workflows, feedback records)",
  "sdk": "JS/website SDK, iOS/Android/React Native SDKs (not exercised)",
  "webhooks": "signed (webhook-id/-timestamp/-signature), whsec_ secret"
 },
 "can_do": [
  "Create, edit (blocks, hidden fields, recall, conditional logic), publish and delete link and app surveys through the REST API or MCP",
  "Share a survey as a public link and collect responses through the unauthenticated Client API",
  "List, read, update (mark finished) and delete responses",
  "Create action classes and app surveys, and read the widget's workspace state",
  "Identify users with attributes and read contacts and attributes back",
  "Create signed webhooks that fire on response events",
  "PIN-protect a survey, cap submissions (auto-close) and set publish/close dates",
  "Add a second language with translated text via MCP",
  "Connect through the official MCP server with standard OAuth (dynamic client registration)"
 ],
 "cannot_do": [
  {
   "what": "Sign up or create an API key headless",
   "why": "Only the web UI offers them (no CAPTCHA, though); the API key is shown once in a modal"
  },
  {
   "what": "Tag responses, create segments, invite members or remove branding headless",
   "why": "No documented API; UI only (all worked in the browser)"
  },
  {
   "what": "Email follow-ups, workflows, Unify Feedback, spam protection, teams, 2FA, SSO",
   "why": "Paid plans beyond the no-card trial (403 with clear messages)"
  },
  {
   "what": "Pay or cancel through an API",
   "why": "No billing API or agent payment rail; Stripe-hosted portal and in-app buttons only"
  },
  {
   "what": "Delete the account headless",
   "why": "Only the Profile page in the UI"
  }
 ],
 "blockers": [],
 "tips_for_owner": [
  "Let agents create API keys headlessly",
  "Document the survey document schema for API",
  "Fix followUps date validation on JSON input",
  "Serve the v2 OpenAPI file as YAML",
  "Document workspaceId on management create-response",
  "Add tags and segments to the API"
 ],
 "tips_for_agents": [
  "Use the Management API v1 with header x-api-key; the key is workspace-scoped, so /api/v2/me returns 401 unless the key also has Organization Access",
  "Webhooks live at /api/v1/webhooks, not /api/v1/management/webhooks (that path returns a 404 HTML page)",
  "Management POST /responses needs workspaceId in the body even though the docs list only surveyId",
  "Hidden field id 'source' is reserved; error messages name the offending field, so read details",
  "MCP uses a different translation dialect: {'en-US': '...'} instead of {'default': '...'}; validate_survey takes {operation, data}",
  "Survey status 'scheduled' is not settable: set publishOn/closeOn with status draft",
  "The client API enforces PIN protection and submission limits (403 with clear messages)",
  "Workspace state is cached for 5 minutes"
 ],
 "selfhost": {
  "install": {
   "status": "skipped",
   "minutes": 0,
   "note": "no docker in the drive sandbox; Formbricks Community Edition self-hosts via docker compose / one-click script (docs/self-hosting)"
  }
 },
 "summary": "An agent can run Formbricks nearly end to end. After a browser sign-up with no CAPTCHA and a one-time API key from the UI, the REST API and the official OAuth MCP server cover the whole survey lifecycle: create, edit with logic, publish, collect, read, update and delete responses, plus webhooks and targeting. All 8 core capabilities were done and verified. What stays in the browser: sign-up, key creation, tags, segments, billing and account deletion. Follow-ups, workflows and Unify Feedback need paid plans beyond the no-card trial.",
 "wall": "",
 "plan_scope": "no-card trial (14-day Pro trial started automatically at sign-up; downgraded to Hobby at the end)",
 "robots_stop": null,
 "robots": null,
 "plain": {
  "summary": "Formbricks is a survey and experience-management tool. An agent could sign up, get an API key, and then build, publish, collect and manage surveys entirely through the API or the official AI-assistant connector, with no card needed for a 14-day trial. The only friction: account creation, the API key and account deletion are website-only, though the sign-up form had no CAPTCHA.",
  "can_do": [
   "Create, edit, publish and delete surveys automatically, including logic branches and personalised text",
   "Collect and manage survey responses automatically, including marking them done or deleting them",
   "Trigger surveys from app/website events and target users by their attributes",
   "Get notified automatically through webhooks when someone responds",
   "Add a translated language to a survey and connect AI assistants like Claude directly to the account"
  ],
  "cannot_do": [
   {
    "what": "Sign up, create the API key, or delete the account without a browser",
    "why": "Formbricks only offers these steps through its website, not an API"
   },
   {
    "what": "Tag responses, build audience segments, invite teammates, or remove branding automatically",
    "why": "These only exist in the website, no API for them yet"
   },
   {
    "what": "Use email follow-ups, workflows, or advanced feedback dashboards",
    "why": "They need a paid plan beyond the free trial"
   },
   {
    "what": "Subscribe or cancel a paid plan automatically",
    "why": "Billing only works through the website and a hosted payment page"
   }
  ]
 },
 "plan_gated": [
  {
   "capability": "Workflows",
   "plan": "Scale",
   "evidence": "MCP list_workflows -> 403 'Workflows are not enabled for this organization' on the Pro trial"
  },
  {
   "capability": "Email follow-ups",
   "plan": "Pro (paid; locked during trial)",
   "evidence": "PUT followUps -> 403 'Survey follow ups are not allowed for this organization'; billing page: follow-ups stay locked during the trial"
  },
  {
   "capability": "Spam protection (reCAPTCHA)",
   "plan": "Enterprise",
   "evidence": "PUT recaptcha.enabled -> 403 'Spam protection is not enabled for this organization'"
  },
  {
   "capability": "/30/31 Unify Feedback, dashboards, AI enrichment",
   "plan": "Enterprise",
   "evidence": "MCP list_feedback_datasets -> 403 'Unify Feedback ... requires an Enterprise plan or license'"
  },
  {
   "capability": "Teams & access roles",
   "plan": "Scale",
   "evidence": "Teams page: 'Unlock Teams with a higher plan'; billing lists Teams & access roles under Scale"
  },
  {
   "capability": "2FA",
   "plan": "Scale",
   "evidence": "Billing page lists Two-factor authentication under Scale"
  },
  {
   "capability": "SSO",
   "plan": "Enterprise",
   "evidence": "Enterprise (Talk to us)"
  }
 ],
 "reply": null,
 "capabilities": [
  {
   "id": "cap-01",
   "group": "Surveys",
   "capability": "Create a survey (link, website/app, or email)",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "POST /management-api/v1/surveys",
    "mcp": "likely yes (Surveys MCP server)",
    "cli": null,
    "ui": "App > Surveys > New"
   },
   "check": "GET /management-api/v1/surveys/{id} returns the created survey object",
   "source": "https://formbricks.com/docs/api-reference/management-api--survey/create-survey; https://formbricks.com/docs/surveys/link-surveys/quickstart"
  },
  {
   "id": "cap-02",
   "group": "Surveys",
   "capability": "Edit a survey's questions, logic, and settings",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "PUT /management-api/v1/surveys/{id}",
    "mcp": null,
    "cli": null,
    "ui": "Survey editor"
   },
   "check": "GET /management-api/v1/surveys/{id} shows updated blocks/questions",
   "source": "https://formbricks.com/docs/api-reference/management-api--survey/update-survey"
  },
  {
   "id": "cap-03",
   "group": "Surveys",
   "capability": "Publish/close a survey",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "PUT /management-api/v1/surveys/{id} (status field)",
    "mcp": null,
    "cli": null,
    "ui": "Survey summary > Publish/Pause"
   },
   "check": "GET /management-api/v1/surveys/{id} shows status=inProgress or completed",
   "source": "https://formbricks.com/docs/surveys/general-features/survey-scheduling"
  },
  {
   "id": "cap-04",
   "group": "Surveys",
   "capability": "Delete a survey",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "DELETE /management-api/v1/surveys/{id}",
    "mcp": null,
    "cli": null,
    "ui": "Survey settings > Delete"
   },
   "check": "GET /management-api/v1/surveys/{id} returns 404 after delete",
   "source": "https://formbricks.com/docs/api-reference/management-api--survey/delete-survey"
  },
  {
   "id": "cap-05",
   "group": "Distribution",
   "capability": "Embed/target a survey on a website or in-app via widget",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Survey > Website/App Surveys"
   },
   "check": "GET /client-api/{workspaceId}/environments/{id} (workspace state) includes the survey for the widget to render",
   "source": "https://formbricks.com/docs/surveys/website-app-surveys/quickstart"
  },
  {
   "id": "cap-06",
   "group": "Distribution",
   "capability": "Share a survey as a public link",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Survey > Link Surveys"
   },
   "check": "Visiting https://app.formbricks.com/s/{surveyId} renders the live survey",
   "source": "https://formbricks.com/docs/surveys/link-surveys/quickstart"
  },
  {
   "id": "cap-07",
   "group": "Responses",
   "capability": "Submit a survey response (respondent side)",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "POST /client-api/{workspaceId}/responses",
    "mcp": null,
    "cli": null,
    "ui": "Survey render page"
   },
   "check": "GET /management-api/v1/responses/{id} shows the submitted answer data",
   "source": "https://formbricks.com/docs/api-reference/client-api--response/create-response"
  },
  {
   "id": "cap-08",
   "group": "Responses",
   "capability": "View and analyze survey results (summary + response table)",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "GET /management-api/v1/responses?surveyId=",
    "mcp": null,
    "cli": null,
    "ui": "Survey > Summary / Responses tab"
   },
   "check": "GET /management-api/v1/responses returns an array matching the UI-displayed count",
   "source": "https://formbricks.com/docs/surveys/analysis/reading-results"
  },
  {
   "id": "cap-09",
   "group": "Responses",
   "capability": "Update or mark a response as finished",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "PUT /management-api/v1/responses/{id}",
    "mcp": null,
    "cli": null,
    "ui": null
   },
   "check": "GET /management-api/v1/responses/{id} shows finished=true",
   "source": "https://formbricks.com/docs/api-reference/management-api--response/update-response"
  },
  {
   "id": "cap-10",
   "group": "Responses",
   "capability": "Delete a response",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "DELETE /management-api/v1/responses/{id}",
    "mcp": null,
    "cli": null,
    "ui": "Responses table row menu"
   },
   "check": "GET /management-api/v1/responses/{id} returns 404",
   "source": "https://formbricks.com/docs/api-reference/management-api--response/delete-response"
  },
  {
   "id": "cap-11",
   "group": "Targeting",
   "capability": "Define an app/website action (event) that triggers a survey",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "POST /management-api/v1/action-classes",
    "mcp": null,
    "cli": null,
    "ui": "Workspace > Actions"
   },
   "check": "GET /management-api/v1/action-classes/{id} shows the new action class",
   "source": "https://formbricks.com/docs/api-reference/management-api--action-class/create-action-class; https://formbricks.com/docs/surveys/website-app-surveys/actions"
  },
  {
   "id": "cap-12",
   "group": "Targeting",
   "capability": "Identify a user and set/attribute-target by user attributes",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "POST /client-api/{workspaceId}/user",
    "mcp": null,
    "cli": null,
    "ui": "Contacts > Attributes"
   },
   "check": "GET /management-api/v1/contact-attributes shows the attribute set on the user",
   "source": "https://formbricks.com/docs/api-reference/client-api--user/create-or-identify-user; https://formbricks.com/docs/surveys/website-app-surveys/attribute-based-targeting"
  },
  {
   "id": "cap-13",
   "group": "Targeting",
   "capability": "Create attribute-based audience segments",
   "weight": "secondary",
   "plan": "paid (Pro, segments)",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Audience > Segments"
   },
   "check": "Segment shown in survey targeting dropdown with the defined filter rule applied",
   "source": "https://formbricks.com/docs/surveys/website-app-surveys/attribute-based-targeting; https://formbricks.com/pricing"
  },
  {
   "id": "cap-14",
   "group": "Targeting",
   "capability": "Control recontact/cooldown so a survey isn't shown repeatedly",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Survey Settings > Recontact Options"
   },
   "check": "Response-stored device does not see the same survey again within the cooldown window",
   "source": "https://formbricks.com/docs/surveys/website-app-surveys/recontact; https://formbricks.com/docs/surveys/website-app-surveys/cooldown-period"
  },
  {
   "id": "cap-15",
   "group": "Contacts",
   "capability": "Manage contacts (view, attributes, delete)",
   "weight": "secondary",
   "plan": "paid (Pro, contact management)",
   "surfaces": {
    "api": "GET /management-api/v1/contacts, GET /management-api/v1/contacts/{id}",
    "mcp": null,
    "cli": null,
    "ui": "Contacts"
   },
   "check": "GET /management-api/v1/contacts/{id} reflects the stored attributes",
   "source": "https://formbricks.com/docs/api-reference/management-api--contacts/get-all-contacts; https://formbricks.com/docs/platform/features/contacts"
  },
  {
   "id": "cap-16",
   "group": "Automation",
   "capability": "Build a workflow (trigger -> filter -> action) on response events",
   "weight": "secondary",
   "plan": "paid (Scale)",
   "surfaces": {
    "api": null,
    "mcp": "likely yes (Workflows MCP server)",
    "cli": null,
    "ui": "Workflows"
   },
   "check": "Workflows > Runs log shows a run fired after the trigger condition occurred",
   "source": "https://formbricks.com/docs/workflows/overview; https://formbricks.com/docs/workflows/build"
  },
  {
   "id": "cap-17",
   "group": "Automation",
   "capability": "Send automated email follow-ups based on responses",
   "weight": "secondary",
   "plan": "free (self-hosted)/paid (Pro, cloud)",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Survey > Follow-ups"
   },
   "check": "Respondent inbox receives the configured follow-up email after submitting a matching response",
   "source": "https://formbricks.com/docs/surveys/general-features/email-followups"
  },
  {
   "id": "cap-18",
   "group": "Automation",
   "capability": "Create and receive custom webhooks on response events",
   "weight": "secondary",
   "plan": "paid (Pro)",
   "surfaces": {
    "api": "POST /management-api/v1/webhooks",
    "mcp": null,
    "cli": null,
    "ui": "Workspace > Integrations > Webhooks"
   },
   "check": "GET /management-api/v1/webhooks/{id} exists, and the configured URL receives a POST on the triggering event",
   "source": "https://formbricks.com/docs/api-reference/management-api--webhook/create-webhook; https://formbricks.com/docs/platform/features/integrations/webhooks"
  },
  {
   "id": "cap-19",
   "group": "Automation",
   "capability": "Connect third-party integrations (Slack, Zapier, Notion, n8n, Make, Google Sheets, Airtable, HubSpot, Activepieces)",
   "weight": "secondary",
   "plan": "free (self-hosted)/paid (Pro, cloud 'all integrations')",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Workspace > Integrations"
   },
   "check": "New response triggers a record appearing in the connected external tool",
   "source": "https://formbricks.com/docs/platform/features/integrations/overview; https://formbricks.com/pricing"
  },
  {
   "id": "cap-20",
   "group": "Survey customization",
   "capability": "Customize survey styling/theme (colors, fonts, branding)",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Workspace > Look & Feel / Survey > Style"
   },
   "check": "Rendered survey page reflects the configured theme colors/fonts",
   "source": "https://formbricks.com/docs/platform/features/styling-theme; https://formbricks.com/docs/surveys/general-features/overwrite-styling"
  },
  {
   "id": "cap-21",
   "group": "Survey customization",
   "capability": "Personalize survey content with recall data / hidden fields / embedded data",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Survey editor > Advanced"
   },
   "check": "Rendered survey question text substitutes the passed recall/hidden-field value",
   "source": "https://formbricks.com/docs/surveys/general-features/recall; https://formbricks.com/docs/surveys/embedded-data/overview"
  },
  {
   "id": "cap-22",
   "group": "Survey customization",
   "capability": "Translate a survey into multiple languages (manually or via AI)",
   "weight": "secondary",
   "plan": "paid (Pro, AI translations)",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Survey editor > Languages"
   },
   "check": "Survey language switcher shows the added language with translated question text",
   "source": "https://formbricks.com/docs/surveys/general-features/multi-language-surveys"
  },
  {
   "id": "cap-23",
   "group": "Survey customization",
   "capability": "Apply conditional display logic between questions/blocks",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Survey editor > Logic"
   },
   "check": "Submitted response path skips/shows questions per the configured logic rule",
   "source": "https://formbricks.com/docs/surveys/general-features/conditional-logic"
  },
  {
   "id": "cap-24",
   "group": "Survey controls",
   "capability": "Limit survey submissions / set response quotas",
   "weight": "secondary",
   "plan": "paid (Scale, quota management)",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Survey settings > Quotas / Limit Submissions"
   },
   "check": "Survey auto-closes to new responses once the configured limit/quota is reached",
   "source": "https://formbricks.com/docs/surveys/general-features/limit-submissions; https://formbricks.com/docs/surveys/general-features/quota-management"
  },
  {
   "id": "cap-25",
   "group": "Survey controls",
   "capability": "Schedule a survey to open and close on specific dates",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Survey settings > Schedule"
   },
   "check": "Survey status flips to running/closed at the configured timestamps",
   "source": "https://formbricks.com/docs/surveys/general-features/survey-scheduling"
  },
  {
   "id": "cap-26",
   "group": "Survey controls",
   "capability": "Protect a survey with a PIN, single-use link, or email verification",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Survey settings > Link Surveys"
   },
   "check": "Attempting the survey URL without the correct PIN/one-time token/verified email is blocked",
   "source": "https://formbricks.com/docs/surveys/link-surveys/pin-protected-surveys; https://formbricks.com/docs/surveys/link-surveys/single-use-links; https://formbricks.com/docs/surveys/link-surveys/verify-email-before-survey"
  },
  {
   "id": "cap-27",
   "group": "Survey controls",
   "capability": "Enable spam protection (reCAPTCHA) on a survey",
   "weight": "peripheral",
   "plan": "paid (Enterprise)",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Survey settings > Spam Protection"
   },
   "check": "Submission without a valid reCAPTCHA token is rejected",
   "source": "https://formbricks.com/docs/surveys/general-features/spam-protection"
  },
  {
   "id": "cap-28",
   "group": "Organization",
   "capability": "Tag and filter survey responses",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Responses tab > Tags"
   },
   "check": "Filtering responses by a tag returns only the tagged rows",
   "source": "https://formbricks.com/docs/surveys/general-features/tags"
  },
  {
   "id": "cap-29",
   "group": "Unify Feedback",
   "capability": "Bring feedback from external sources into a unified Feedback Dataset",
   "weight": "secondary",
   "plan": "paid (Enterprise, self-hosted)/cloud tier",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Unify Feedback > Sources"
   },
   "check": "Dataset record count increases after a source sync, visible in Feedback Records list",
   "source": "https://formbricks.com/docs/unify-feedback/overview; https://formbricks.com/docs/unify-feedback/feedback-sources"
  },
  {
   "id": "cap-30",
   "group": "Unify Feedback",
   "capability": "Build dashboards/charts from feedback records",
   "weight": "secondary",
   "plan": "paid (Enterprise, self-hosted)/cloud tier",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Unify Feedback > Dashboards"
   },
   "check": "New chart appears on the shared dashboard reflecting the underlying Feedback Record data",
   "source": "https://formbricks.com/docs/unify-feedback/dashboards-charts"
  },
  {
   "id": "cap-31",
   "group": "Unify Feedback",
   "capability": "AI-enrich open-text feedback (sentiment, emotion, topics)",
   "weight": "secondary",
   "plan": "paid (Enterprise, self-hosted)/cloud tier",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Unify Feedback > Feedback Records"
   },
   "check": "A Feedback Record shows a populated sentiment/emotion/topic field after enrichment runs",
   "source": "https://formbricks.com/docs/unify-feedback/enrichment; https://formbricks.com/docs/unify-feedback/topics-subtopics"
  },
  {
   "id": "cap-32",
   "group": "AI",
   "capability": "Use AI assistants (Claude, Codex) to read and manage surveys via MCP",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": "Formbricks Surveys & Workflows MCP server (OAuth)",
    "cli": null,
    "ui": null
   },
   "check": "mcp tools/list on the connected server returns survey/workflow tool definitions and an invoked tool call returns live survey data",
   "source": "https://formbricks.com/docs/platform/mcp/overview; https://formbricks.com/docs/platform/mcp/setup"
  },
  {
   "id": "cap-33",
   "group": "Admin",
   "capability": "Invite and manage organization/team members and roles",
   "weight": "peripheral",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Organization Settings > Members"
   },
   "check": "Invited member appears in the members list with the assigned role",
   "source": "https://formbricks.com/docs/platform/features/user-management; https://formbricks.com/docs/platform/features/user-management/invite-members"
  },
  {
   "id": "cap-34",
   "group": "Admin",
   "capability": "Configure teams and per-workspace access roles (RBAC)",
   "weight": "peripheral",
   "plan": "paid (Scale/Enterprise)",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Organization Settings > Teams"
   },
   "check": "A user outside the assigned team is denied access to the restricted workspace",
   "source": "https://formbricks.com/docs/platform/features/user-management/teams-and-roles; https://formbricks.com/docs/self-hosting/advanced/enterprise-features/team-access"
  },
  {
   "id": "cap-35",
   "group": "Admin",
   "capability": "Enable two-factor authentication on an account",
   "weight": "peripheral",
   "plan": "paid (Enterprise)",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Account Settings > Security"
   },
   "check": "Login requires a TOTP/backup code after 2FA is enabled",
   "source": "https://formbricks.com/docs/platform/features/user-management/two-factor-auth"
  },
  {
   "id": "cap-36",
   "group": "Admin",
   "capability": "Configure SSO (SAML/OIDC) for the organization",
   "weight": "peripheral",
   "plan": "paid (Enterprise)",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Organization Settings > Security"
   },
   "check": "Login via the configured IdP redirects and authenticates without a Formbricks password",
   "source": "https://formbricks.com/docs/self-hosting/configuration/auth-sso/saml-sso; https://formbricks.com/docs/self-hosting/configuration/auth-sso/open-id-connect"
  },
  {
   "id": "cap-37",
   "group": "Admin",
   "capability": "Self-host the Formbricks platform on own infrastructure",
   "weight": "peripheral",
   "plan": "free (Community Edition, self-hosted)",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": "one-click install script",
    "ui": null
   },
   "check": "GET /health on the self-hosted instance returns a healthy DB/app status",
   "source": "https://formbricks.com/docs/self-hosting/overview; https://formbricks.com/docs/api-reference/health/health-check"
  },
  {
   "id": "cap-38",
   "group": "Admin",
   "capability": "Remove 'Powered by Formbricks' branding from surveys and emails",
   "weight": "peripheral",
   "plan": "paid (Pro)",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Workspace Settings > Branding"
   },
   "check": "Rendered survey/email no longer shows the Formbricks footer badge",
   "source": "https://formbricks.com/pricing; https://formbricks.com/docs/self-hosting/advanced/enterprise-features/hide-powered-by-formbricks"
  }
 ],
 "attempts": [
  {
   "t": "00:30",
   "cap": "docs",
   "capability": "Find docs",
   "task": "Read llms.txt, docs llms.txt, API reference, MCP setup",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "formbricks.com/llms.txt and /docs/llms.txt (200, text/plain) list REST v1/v2 reference, MCP setup, generate-key pages as .md",
   "notes": "",
   "quality": {
    "docs_match": "match"
   }
  },
  {
   "t": "01:00",
   "cap": "signup",
   "capability": "Sign up",
   "task": "Create account with email+password",
   "route": "api",
   "documented": true,
   "result": "failed",
   "verified": false,
   "evidence": "No documented signup API; app.formbricks.com/auth/signup is a Next.js UI form only",
   "notes": "Headless route not documented; went to browser",
   "quality": {
    "error_legibility": "n/a"
   }
  },
  {
   "t": "03:00",
   "cap": "signup",
   "capability": "Sign up",
   "task": "Create account with email+password in browser",
   "route": "browser",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "pw: /auth/signup -> Continue with Email -> name/email/password -> redirected /auth/verification-requested; no CAPTCHA signals",
   "notes": "No bot check seen"
  },
  {
   "t": "03:20",
   "cap": "verify",
   "capability": "Verify email",
   "task": "Open verification link from inbox headless",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "Mail arrived <10s. login then succeeded",
   "notes": ""
  },
  {
   "t": "04:20",
   "cap": "login",
   "capability": "Log in",
   "task": "Log in with email/password",
   "route": "browser",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "pw login -> /organizations/{org}/workspaces/new/plan: 'You're on Pro for the next 14 days' (auto no-card trial)",
   "notes": ""
  },
  {
   "t": "05:40",
   "cap": "credentials",
   "capability": "Get API key",
   "task": "Create workspace-scoped manage API key in Organization Settings > API Keys",
   "route": "browser",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "Key fbk_•••• shown once; stored in secrets.env. Permission dropdown is a custom popover (needed coordinate click)",
   "notes": "No documented headless key creation (UI only per docs/generate-key)"
  },
  {
   "t": "06:11",
   "cap": "first_call",
   "capability": "First API call",
   "task": "GET /api/v1/management/me",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "200 {id: workspace cmurg4i0z..., type: production, workspace{name:'My workspace'}}",
   "notes": "GET /api/v2/me returns 401 with a workspace-only key: docs say /me v2 needs Organization Access",
   "quality": {
    "docs_match": "match",
    "error_legibility": "vague"
   }
  },
  {
   "t": "06:20",
   "cap": "cap-01",
   "capability": "Create a survey",
   "task": "Create a link survey with 2 questions + hidden field via POST /api/v1/management/surveys",
   "route": "api",
   "documented": true,
   "result": "failed",
   "verified": false,
   "evidence": "400 {code:bad_request, details:{'hiddenFields.fieldIds.0':'Hidden field id is not allowed'}} for hidden field id 'source' (reserved)",
   "notes": "Error named the field; renamed to 'campaign' and retried",
   "quality": {
    "error_legibility": "clear",
    "recoverable": "yes",
    "docs_match": "match"
   }
  },
  {
   "t": "06:30",
   "cap": "cap-01",
   "capability": "Create a survey",
   "task": "Retry create with hidden field 'campaign'",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "200 data.id=cmurgacq02zc301z5avvn43vj status=draft; GET /api/v1/management/surveys/cmurgacq02zc301z5avvn43vj returns 2 blocks [q1open,q2multi]",
   "notes": "Response returns both legacy questions and new blocks",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match"
   }
  },
  {
   "t": "06:30",
   "cap": "first_action",
   "capability": "First real action",
   "task": "Create survey via API",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "survey cmurgacq02zc301z5avvn43vj created and read back",
   "notes": ""
  },
  {
   "t": "06:50",
   "cap": "cap-02",
   "capability": "Edit a survey",
   "task": "PUT name + add 3rd block via blocks array",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "PUT 200; GET shows name 'AgentDrives test survey (edited)' and 3 blocks incl. blk3ocean",
   "notes": "Docs request schema for PUT is just {name}; full blocks structure only inferable from response example",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match"
   }
  },
  {
   "t": "06:55",
   "cap": "cap-21",
   "capability": "Recall / hidden fields",
   "task": "Hidden field 'campaign' + recall token '#recall:campaign/fallback:friend#' in Q3 headline",
   "route": "api",
   "documented": true,
   "result": "partial",
   "verified": true,
   "evidence": "GET shows hiddenFields {enabled:true,fieldIds:[campaign]} and recall text stored; rendered substitution not checked",
   "notes": "Recall syntax not documented in API reference (taken from app's format)",
   "quality": {
    "docs_match": "undocumented"
   }
  },
  {
   "t": "07:10",
   "cap": "cap-23",
   "capability": "Conditional logic",
   "task": "Add block logic: if q2multi==Sun jump to ending end1",
   "route": "api",
   "documented": true,
   "result": "partial",
   "verified": true,
   "evidence": "PUT 200; GET shows blocks[1].logic with condition/action stored as sent",
   "notes": "Logic JSON schema is not in API docs; accepted as stored; render-path behaviour not exercised",
   "quality": {
    "docs_match": "undocumented"
   }
  },
  {
   "t": "07:10",
   "cap": "cap-03",
   "capability": "Publish a survey",
   "task": "PUT status=inProgress",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "GET survey status=inProgress",
   "notes": "",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match"
   }
  },
  {
   "t": "07:20",
   "cap": "cap-06",
   "capability": "Share as public link",
   "task": "Fetch https://app.formbricks.com/s/{id}",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "GET /s/cmurgacq02zc301z5avvn43vj 200, HTML contains survey name and first question",
   "notes": "Link is just /s/{surveyId}; no API call needed",
   "quality": {
    "verify_route": "yes"
   }
  },
  {
   "t": "07:30",
   "cap": "cap-07",
   "capability": "Submit a response",
   "task": "POST /api/v1/client/{workspaceId}/responses (no auth)",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "200 data.id=cmurgb5o4cbb301ts6odamusx; GET /api/v1/management/responses/cmurgb5o4cbb301ts6odamusx shows data q1open/q2multi",
   "notes": "",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match"
   }
  },
  {
   "t": "07:40",
   "cap": "cap-09",
   "capability": "Update/finish response",
   "task": "PUT /api/v1/management/responses/{id} finished=true + extra answer",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "GET shows finished=true, data merged with q3why",
   "notes": "",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match"
   }
  },
  {
   "t": "07:50",
   "cap": "cap-08",
   "capability": "View results",
   "task": "GET /api/v1/management/responses?surveyId=",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "200, 1 response listed (matches what we created minus the deleted one)",
   "notes": "limit/skip pagination params accepted",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match"
   }
  },
  {
   "t": "07:55",
   "cap": "cap-10",
   "capability": "Delete a response",
   "task": "POST mgmt response then DELETE /api/v1/management/responses/{id}",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "First mgmt POST: 400 'workspaceId must be provided' (docs list only surveyId as required); with workspaceId 200; DELETE 200; GET -> 404 not_found",
   "notes": "Docs drift: workspaceId required on mgmt create response",
   "quality": {
    "verify_route": "yes",
    "docs_match": "drift",
    "error_legibility": "clear",
    "recoverable": "yes"
   }
  },
  {
   "t": "10:20",
   "cap": "cap-23",
   "capability": "Conditional logic",
   "task": "Verify logic path by answering the survey as a respondent",
   "route": "browser",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "Logic set via API PUT (blocks[1].logic). Respondent: Ocean -> Q3 shown; Sun -> straight to 'Thanks!' ending (screens 024/025)",
   "notes": "Configured through documented PUT; schema of logic objects not documented, inferred from GET response shape",
   "quality": {
    "verify_route": "yes",
    "docs_match": "undocumented"
   }
  },
  {
   "t": "10:00",
   "cap": "cap-21",
   "capability": "Recall / hidden fields",
   "task": "Render check: /s/{id}?campaign=AgentDrives",
   "route": "browser",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "Q3 headline rendered 'Why the ocean, AgentDrives?' (recall of hidden field): screenshot 024",
   "notes": "Configured via documented PUT; recall token syntax not in API docs",
   "quality": {
    "verify_route": "yes",
    "docs_match": "undocumented"
   }
  },
  {
   "t": "09:20",
   "cap": "cap-11",
   "capability": "Define action class",
   "task": "POST /api/v1/management/action-classes (code action)",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "200 id=cmurgbzur2zwa01z58wk5407o; GET /action-classes/cmurgbzur2zwa01z58wk5407o returns it",
   "notes": "",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match"
   }
  },
  {
   "t": "09:35",
   "cap": "cap-05",
   "capability": "Website/app survey via widget",
   "task": "Create type=app survey triggered by the action class; read workspace state",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "First try 400 (trigger needs full actionClass object: name/description/type/key, clear field errors); retry 200 id=cmurgc7ef301801z54s7iqaw5; GET /api/v1/client/{ws}/environment lists the survey with trigger agentdrives_clicked_buy",
   "notes": "Widget not loaded in a real page (no site of ours); state read back is the documented check",
   "quality": {
    "verify_route": "yes",
    "error_legibility": "clear",
    "recoverable": "yes",
    "docs_match": "match"
   }
  },
  {
   "t": "09:40",
   "cap": "cap-14",
   "capability": "Recontact/cooldown",
   "task": "Set recontactDays=7 + displayOnce on the app survey",
   "route": "api",
   "documented": true,
   "result": "partial",
   "verified": true,
   "evidence": "GET survey and workspace state show recontactDays 7, displayOption displayOnce",
   "notes": "Actual suppression on a device not exercised (no widget host)",
   "quality": {
    "verify_route": "yes"
   }
  },
  {
   "t": "09:50",
   "cap": "cap-12",
   "capability": "Identify user + attributes",
   "task": "POST /api/v1/client/{ws}/user {userId, attributes{plan,email}}",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "200 contactId=cmurgcbbfy5hg01wopvbstv7q, message 'Created new attribute plan'; GET /api/v1/management/contact-attributes shows value 'trial'",
   "notes": "",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match"
   }
  },
  {
   "t": "10:00",
   "cap": "cap-15",
   "capability": "Manage contacts",
   "task": "List/get contacts and attributes via mgmt API",
   "route": "api",
   "documented": true,
   "result": "partial",
   "verified": true,
   "evidence": "GET /api/v1/management/contacts and /contacts/cmurgcbbfy5hg01wopvbstv7q 200 (on Pro trial). Contact object returns only id/timestamps; attributes via /contact-attributes",
   "notes": "No documented contact delete endpoint in v1/v2 reference",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match"
   }
  },
  {
   "t": "10:40",
   "cap": "cap-18",
   "capability": "Webhooks",
   "task": "POST /api/v1/webhooks (responseCreated, responseFinished) to a webhook.site bin we own, then submit a response",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "200 webhook id=cmurgd0we30ct01z5osqcvyhw with whsec_ secret; webhook.site received 2 signed POSTs (event responseCreated, responseFinished) within 1s",
   "notes": "First tried /api/v1/management/webhooks (404 HTML page) by analogy; docs path is /api/v1/webhooks. Standard-Webhooks signature headers",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match",
    "error_legibility": "vague"
   }
  },
  {
   "t": "11:00",
   "cap": "cap-26",
   "capability": "PIN protection",
   "task": "PUT pin=4821, then submit without PIN",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "GET shows pin 4821; /s/{id} serves PinScreen; client POST response -> 403 'Survey is protected by a PIN'",
   "notes": "",
   "quality": {
    "verify_route": "yes",
    "error_legibility": "clear"
   }
  },
  {
   "t": "11:20",
   "cap": "cap-24",
   "capability": "Limit submissions",
   "task": "PUT autoComplete=1, submit one response, then another",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "After 1 finished response GET status=completed; 2nd POST -> 403 'Survey is not accepting submissions'",
   "notes": "autoComplete limit on free/trial; quotas (Scale) not tried",
   "quality": {
    "verify_route": "yes",
    "error_legibility": "clear"
   }
  },
  {
   "t": "11:40",
   "cap": "cap-25",
   "capability": "Schedule open/close",
   "task": "PUT publishOn/closeOn",
   "route": "api",
   "documented": true,
   "result": "partial",
   "verified": true,
   "evidence": "status 'scheduled' rejected (400 lists allowed values draft|inProgress|paused|completed); with status draft GET shows publishOn 2026-10-03T22:00Z, closeOn 2026-10-10T22:00Z (times rounded to local midnight)",
   "notes": "Automatic flip not observable within the drive; reset afterwards",
   "quality": {
    "verify_route": "yes",
    "error_legibility": "clear",
    "recoverable": "yes"
   }
  },
  {
   "t": "12:00",
   "cap": "cap-20",
   "capability": "Styling",
   "task": "PUT styling {overwriteThemeStyling, brandColor #e11d48}",
   "route": "api",
   "documented": true,
   "result": "partial",
   "verified": true,
   "evidence": "GET shows styling; rendered page payload includes brandColor and input focus ring is red, but buttons stay default blue (screenshot 024)",
   "notes": "Styling field schema not documented in API reference",
   "quality": {
    "verify_route": "yes",
    "docs_match": "undocumented"
   }
  },
  {
   "t": "12:40",
   "cap": "cap-32",
   "capability": "AI assistants via MCP",
   "task": "OAuth (RFC 9728 discovery -> DCR -> PKCE consent) then tools/list + tool calls on https://app.formbricks.com/api/mcp",
   "route": "mcp",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "401 with WWW-Authenticate resource_metadata; /.well-known/oauth-protected-resource + oauth-authorization-server JSON; POST /api/auth/oauth2/register 201; consent 'Allow access' in browser (logged-in session); token 200 (expires_in 900, refresh token); tools/list = 30 tools; list_workspaces/list_surveys returned live data",
   "notes": "Consent screen is a one-click browser step (normal OAuth). Error replies are structured problem+json with invalid_params",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match",
    "error_legibility": "clear"
   }
  },
  {
   "t": "13:20",
   "cap": "cap-01",
   "capability": "Create a survey",
   "task": "MCP create_survey",
   "route": "mcp",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "First call 400 invalid_params: use locale 'en-US' not 'default' (v3 contract differs from v1 REST); retry created cmurghcc40ub901vrj2nrqrw2; REST GET returned it",
   "notes": "Two survey document dialects: v1 REST uses {default:..}, MCP v3 uses {'en-US':..}",
   "quality": {
    "verify_route": "yes",
    "error_legibility": "clear",
    "recoverable": "yes"
   }
  },
  {
   "t": "13:30",
   "cap": "cap-02",
   "capability": "Edit a survey",
   "task": "MCP patch_survey name + status",
   "route": "mcp",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "REST GET shows '(patched)' and status inProgress",
   "notes": "",
   "quality": {
    "verify_route": "yes"
   }
  },
  {
   "t": "13:35",
   "cap": "cap-04",
   "capability": "Delete a survey",
   "task": "MCP delete_survey",
   "route": "mcp",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "delete returned requestId; REST GET /api/v1/management/surveys/cmurghcc40ub901vrj2nrqrw2 -> 404 'Survey not found'",
   "notes": "",
   "quality": {
    "verify_route": "yes",
    "error_legibility": "clear"
   }
  },
  {
   "t": "13:10",
   "cap": "cap-16",
   "capability": "Workflows",
   "task": "MCP list_workflows",
   "route": "mcp",
   "documented": true,
   "result": "plan_gated",
   "verified": true,
   "evidence": "403 'Workflows are not enabled for this organization' on the 14-day Pro trial; capability map: Scale plan",
   "notes": "",
   "quality": {
    "error_legibility": "clear"
   }
  },
  {
   "t": "13:15",
   "cap": "cap-29",
   "capability": "Unify feedback datasets",
   "task": "MCP list_feedback_datasets",
   "route": "mcp",
   "documented": true,
   "result": "plan_gated",
   "verified": true,
   "evidence": "403 'Unify Feedback is not enabled for this organization. It requires an Enterprise plan or license'",
   "notes": "",
   "quality": {
    "error_legibility": "clear"
   }
  },
  {
   "t": "13:16",
   "cap": "cap-30",
   "capability": "Dashboards from feedback",
   "task": "(depends on Unify Feedback)",
   "route": "none",
   "documented": true,
   "result": "plan_gated",
   "verified": false,
   "evidence": "Unify Feedback 403 Enterprise-only (see)",
   "notes": ""
  },
  {
   "t": "13:17",
   "cap": "cap-31",
   "capability": "AI enrichment of feedback",
   "task": "(depends on Unify Feedback)",
   "route": "none",
   "documented": true,
   "result": "plan_gated",
   "verified": false,
   "evidence": "Unify Feedback 403 Enterprise-only (see)",
   "notes": ""
  },
  {
   "t": "14:30",
   "cap": "cap-22",
   "capability": "Multi-language survey",
   "task": "MCP patch_survey: add de-DE language + translated headline (manual translation)",
   "route": "mcp",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "REST GET shows languages en-US + de-DE and headline {de-DE:'Kontrolltest'}; /s/{id}?lang=de-DE renders 'Kontrolltest' with German UI strings (Erforderlich, Fertig)",
   "notes": "v1 REST cannot add a language that does not exist in the workspace; MCP v3 created it. AI translation not tried",
   "quality": {
    "verify_route": "yes"
   }
  },
  {
   "t": "15:00",
   "cap": "cap-17",
   "capability": "Email follow-ups",
   "task": "PUT survey followUps (send-email to our own inbox)",
   "route": "api",
   "documented": true,
   "result": "plan_gated",
   "verified": true,
   "evidence": "1st: 400 'followUps.0.createdAt: expected date, received Date' (confusing); with ISO dates: 403 'Survey follow ups are not allowed for this organization'. Billing page: 'Some features like follow-ups and custom links stay locked during the trial'",
   "notes": "Pro paid only (not in no-card trial)",
   "quality": {
    "error_legibility": "vague"
   }
  },
  {
   "t": "18:00",
   "cap": "cap-27",
   "capability": "Spam protection",
   "task": "PUT recaptcha.enabled=true",
   "route": "api",
   "documented": true,
   "result": "plan_gated",
   "verified": true,
   "evidence": "403 'Spam protection is not enabled for this organization'; GET still enabled:false",
   "notes": "Enterprise",
   "quality": {
    "error_legibility": "clear"
   }
  },
  {
   "t": "18:05",
   "cap": "cap-34",
   "capability": "Teams/RBAC",
   "task": "GET /api/v2/organizations/{org}/teams",
   "route": "api",
   "documented": true,
   "result": "plan_gated",
   "verified": false,
   "evidence": "401 Unauthorized with workspace-only key (needs Organization Access); billing page lists 'Teams & access roles' under Scale",
   "notes": "Not pursued further: Scale plan feature",
   "quality": {
    "error_legibility": "vague"
   }
  },
  {
   "t": "18:06",
   "cap": "cap-35",
   "capability": "2FA",
   "task": "Check plan",
   "route": "none",
   "documented": true,
   "result": "plan_gated",
   "verified": false,
   "evidence": "Billing page lists 'Two-factor authentication (2FA)' under Scale ($390/mo)",
   "notes": ""
  },
  {
   "t": "18:07",
   "cap": "cap-36",
   "capability": "SSO",
   "task": "Check plan",
   "route": "none",
   "documented": true,
   "result": "plan_gated",
   "verified": false,
   "evidence": "Enterprise only per capability map/docs; Billing page offers Enterprise via 'Talk to us'",
   "notes": ""
  },
  {
   "t": "18:08",
   "cap": "cap-37",
   "capability": "Self-host",
   "task": "Install self-hosted edition",
   "route": "none",
   "documented": true,
   "result": "skipped",
   "verified": false,
   "evidence": "Drive sandbox has no Docker; one-click install script / docker compose documented at /docs/self-hosting",
   "notes": ""
  },
  {
   "t": "17:30",
   "cap": "pay",
   "capability": "Pay / upgrade",
   "task": "Probe 402/x402/MPP/L402, well-known, registries, docs text; inspect in-app billing",
   "route": "browser",
   "documented": true,
   "result": "done",
   "verified": false,
   "evidence": "Unauthenticated API -> 401 JSON, no PAYMENT-REQUIRED/WWW-Authenticate Payment; /.well-known/ucp, /auth.md, /SKILL.md 404; x402./mpp./agents. subdomains do not resolve; not in x402 Bazaar or mpp.dev; llms-full.txt has no x402/MPP/ACP terms. In-app Billing: 'Unlock all Pro features' -> modal 'Pay now & unlock, $89/mo, billing starts today'; 'Manage card details & invoices' -> Stripe customer portal billing.formbricks.com ('No payment method. Add payment method'). Sign-up auto-started a 14-day Pro trial with no card.",
   "notes": "No billing API/CLI. Stopped before entering any card; hosted Stripe flow, 3DS outcome unknown"
  },
  {
   "t": "19:30",
   "cap": "cap-28",
   "capability": "Tag and filter responses",
   "task": "Add tag in Responses > response detail > Add Tag",
   "route": "browser",
   "documented": true,
   "result": "partial",
   "verified": true,
   "evidence": "Tag 'agentdrives' created and attached; GET /api/v1/management/responses/{id} shows tags[{name:'agentdrives'}]",
   "notes": "No documented tag API in v1/v2 reference; filtering by tag (UI Filter) not exercised",
   "quality": {
    "verify_route": "yes",
    "docs_match": "undocumented"
   }
  },
  {
   "t": "21:30",
   "cap": "cap-33",
   "capability": "Invite members",
   "task": "Organization Settings > Teams > Invite member, to our second inbox",
   "route": "browser",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "Members list shows the agent's inbox 'Pending'; invite mail 'You are invited to collaborate on Formbricks!' arrived in our inbox",
   "notes": "Only Owner role selectable ('Unlock Organization Roles with a higher plan'); v2 org users API not available on Cloud per docs",
   "quality": {
    "verify_route": "yes"
   }
  },
  {
   "t": "21:35",
   "cap": "cap-19",
   "capability": "Third-party integrations",
   "task": "Connect Slack/Zapier/Notion etc.",
   "route": "none",
   "documented": true,
   "result": "skipped",
   "verified": false,
   "evidence": "Each needs an account at the third-party vendor (OAuth to Slack/Google/Notion/Airtable/HubSpot); we have none. Webhooks covered the generic route",
   "notes": ""
  },
  {
   "t": "23:00",
   "cap": "cap-13",
   "capability": "Attribute-based segments",
   "task": "Contacts > Segments > Create segment 'AgentDrives trial users' with filter Plan = trial",
   "route": "browser",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "Segment listed in Segments table; re-identifying user via POST /api/v1/client/{ws}/user returns the new segment id cmurgouho… in state.segments",
   "notes": "No documented segment API (v2 only reads links for a segment); available on the Pro trial",
   "quality": {
    "verify_route": "yes"
   }
  },
  {
   "t": "23:40",
   "cap": "cap-38",
   "capability": "Remove Formbricks branding",
   "task": "Workspace > Appearance: toggle off 'Show Formbricks Branding in Link surveys'",
   "route": "browser",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "Rendered /s/{id} no longer shows 'Powered by Formbricks' (before: present, screenshot 024)",
   "notes": "Works on the no-card Pro trial",
   "quality": {
    "verify_route": "yes"
   }
  },
  {
   "t": "24:30",
   "cap": "cap-04",
   "capability": "Delete a survey",
   "task": "DELETE /api/v1/management/surveys/{id} for the 3 REST-created surveys",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "3x 200, then GET each -> 404",
   "notes": "",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match"
   }
  },
  {
   "t": "24:35",
   "cap": "cleanup",
   "capability": "Clean up created objects",
   "task": "DELETE webhook, action class; revoke MCP refresh token",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "DELETE /api/v1/webhooks/{id} 200 -> GET 404; DELETE action-class 200 -> GET 404; POST /api/auth/oauth2/revoke 200",
   "notes": ""
  },
  {
   "t": "26:00",
   "cap": "cancel",
   "capability": "Cancel trial / downgrade",
   "task": "Billing > 'Return to Hobby plan' > confirm",
   "route": "browser",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "Dialog 'Your free Pro trial will end now'; billing page then shows 'Your plan: Hobby', 0/250 responses",
   "notes": "No billing API; trial would also auto-cancel Oct 16 (no card on file). Stripe customer portal at billing.formbricks.com also reachable"
  },
  {
   "t": "27:00",
   "cap": "delete",
   "capability": "Delete account and data",
   "task": "Account > Your Profile > Delete account (type email + password)",
   "route": "browser",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "Redirected to an optional 'Account Deletion Survey'; afterwards GET /api/v1/management/me with the old key -> 401 'API Key invalid' and email/password login no longer gets in",
   "notes": "No documented headless account-deletion route; org deleted with account (sole owner)",
   "quality": {
    "verify_route": "yes"
   }
  }
 ],
 "stale": false,
 "icon": "/logos/formbricks.png",
 "monitored": false,
 "verdict": "Gets in on its own, creates its key and runs the whole survey lifecycle: L4 · Runs on its own. Our agent passed every checkpoint: email sign-up with no CAPTCHA, a headless verification link, an API key from Organization Settings, then calls through the REST API and the official OAuth MCP server. It created, edited, published and read back surveys and responses, with webhooks and targeting, all from the API or MCP; sign-up, the key page, tags, segments, billing and account deletion stayed in the browser. The trial needed no card; our agent returned the plan to Hobby in the billing screen, then deleted its account and org from the profile page.",
 "page": "https://agentdrives.com/tools/formbricks?via=api"
}