{
 "slug": "umami",
 "name": "Umami",
 "url": "https://umami.is",
 "domain": "umami.is",
 "category": "web-analytics",
 "category_name": "Web analytics",
 "tested_at": "2026-10-08",
 "run": "20261008T204445Z",
 "draft": false,
 "reviewed": true,
 "owner_verified": null,
 "origin": "editorial",
 "history": [
  {
   "run": "20261006T044816Z",
   "date": "2026-10-06",
   "level": 2,
   "engine": {
    "runner": "omp",
    "model": "claude-opus-5-5",
    "driver": 2,
    "signed": true,
    "inbox": null,
    "robots": "start"
   }
  },
  {
   "run": "20261008T204445Z",
   "date": "2026-10-08",
   "level": 3,
   "engine": {
    "runner": "omp",
    "model": "claude-opus-5-5",
    "driver": 2,
    "signed": true,
    "inbox": [
     "agentdrives.com"
    ],
    "robots": "obey"
   },
   "why": "product"
  }
 ],
 "level": 3,
 "level_name": "Does the work",
 "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, in a browser (the API key is paid)",
   "at": "credentials",
   "how": "in-browser"
  },
  {
   "key": "work",
   "label": "Use",
   "state": "part",
   "text": "Work done: 75% of the core"
  },
  {
   "key": "pay",
   "label": "Pay",
   "state": "unreached",
   "text": "Not tried yet: robots.txt keeps our agent off the payment page for now",
   "value": "not_tried",
   "route": "card_checkout",
   "why": "robots"
  },
  {
   "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": "part",
   "text": "Some docs agents can read: llms.txt and an MCP server",
   "have": [
    "llms_txt",
    "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: 75% of the core",
   "stage": "work"
  },
  {
   "key": "pay",
   "label": "Pay",
   "state": "unreached",
   "text": "Not tried yet: robots.txt keeps our agent off the payment page for now",
   "value": "not_tried",
   "route": "card_checkout",
   "why": "robots",
   "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/8"
  }
 ],
 "minutes": null,
 "next": {
  "to": 4,
  "text": "Next: do 80% of the core work (now 75%)"
 },
 "stop": "credentials",
 "core": "6/8",
 "scores": {
  "coverage": 66,
  "reliability": 79,
  "resilience": 50,
  "setup": 75,
  "surface_coverage": null,
  "docs_accuracy": null,
  "docs_completeness": null
 },
 "parts": {
  "holds_up": 64,
  "docs_match": null,
  "setup": 75,
  "security": "private",
  "standards": []
 },
 "reliability_method": "pass^k",
 "resilience": {
  "parts": {
   "error_legibility": 32,
   "recovery": 67
  },
  "summary": null
 },
 "stress": [
  {
   "capability": "Track custom events on a site",
   "probe": "send without website id",
   "outcome": "400 application/json {\"error\":\"Missing website ID\"}",
   "grade": "clear",
   "idempotent": null,
   "rate_limit": null
  },
  {
   "capability": "Track custom events on a site",
   "probe": "bad enum for type",
   "outcome": "400 {\"error\":{\"message\":\"Bad request\",\"code\":\"bad-request\",\"status\":400,\"properties\":{\"type\":{\"errors\":[\"Invalid option: expected one of \\\"event\\\"|\\\"identify\\\"|\\\"performance\\\"\"]}}}}",
   "grade": "clear",
   "idempotent": null,
   "rate_limit": null
  },
  {
   "capability": "Track custom events on a site",
   "probe": "valid event from automated agent",
   "outcome": "200 {\"beep\":\"boop\"}; nothing recorded",
   "grade": "silent",
   "idempotent": null,
   "rate_limit": null
  },
  {
   "capability": "Add a website to track",
   "probe": "create a second website (repeat create) on Hobby",
   "outcome": "401 {\"error\":{\"message\":\"Website limit reached.\",\"code\":\"unauthorized\",\"status\":401}}; dialog shows \"Website limit reached.\"",
   "grade": "clear",
   "idempotent": "n/a",
   "rate_limit": null
  },
  {
   "capability": "credentials",
   "probe": "wrong API key",
   "outcome": "401 application/json {\"error\":{\"message\":\"Invalid API key.\",\"code\":\"unauthorized\",\"status\":401}}",
   "grade": "clear",
   "idempotent": null,
   "rate_limit": null
  },
  {
   "capability": "credentials",
   "probe": "burst 15 sequential GET /v1/websites (bad key, only route reachable without Pro)",
   "outcome": "15x 401, no 429, no RateLimit/Retry-After headers",
   "grade": "vague",
   "idempotent": null,
   "rate_limit": "none-seen"
  },
  {
   "capability": "Build a conversion funnel across ordered page/event steps",
   "probe": "partial input: funnel step typed but not picked from the dropdown",
   "outcome": "no request sent, dialog stays open, no error shown; nothing half-written (GET funnels empty)",
   "grade": "silent",
   "idempotent": null,
   "rate_limit": null
  }
 ],
 "surface_audit": null,
 "coverage_core": 75,
 "after_wall": null,
 "coverage_source": "computed",
 "driver": {
  "version": 2,
  "model": "claude-opus-5-5",
  "profile": "full",
  "assisted": false,
  "handoff": false,
  "prompt_sha": "0f43284d4a47",
  "kb_version": "2+overlay-221e34fe11",
  "identity": "2091d36f31f1"
 },
 "methodology": 15,
 "rules_date": "2026-10-15",
 "engine": {
  "runner": "omp",
  "model": "claude-opus-5-5",
  "driver": 2,
  "signed": true,
  "inbox": [
   "agentdrives.com"
  ],
  "robots": "obey"
 },
 "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-15"
  },
  "browser": {
   "state": "in",
   "measured": false
  },
  "our_key": "pending",
  "robots": null,
  "tip": false
 },
 "ladder": {
  "docs": {
   "status": "headless",
   "note": "docs.umami.is/llms.txt (~290 pages, per-operation API reference as .md); .md URLs return text/markdown; no OpenAPI file found"
  },
  "signup": {
   "status": "browser",
   "note": "web form at cloud.umami.is/signup, no CAPTCHA; no API sign-up"
  },
  "verify": {
   "status": "browser",
   "note": "6-digit code by mail in ~30 s, typed on /setup; then region and plan choice"
  },
  "credentials": {
   "status": "blocked",
   "note": "plan-gated: Settings > API keys says 'API access requires a Pro plan'; Cloud keys are made in the UI only",
   "via": ""
  },
  "first_call": {
   "status": "blocked",
   "note": "documented POST gateway.umami.is/api/send (no key) answered 200 {\"beep\":\"boop\"} and recorded nothing: Umami drops hits whose User-Agent looks like a bot; the keyed API needs a Pro key"
  },
  "first_action": {
   "status": "browser",
   "note": "added a website in the dashboard"
  },
  "pay": {
   "status": "",
   "grade": "P2",
   "rails": [
    "Stripe Checkout"
   ],
   "rail_ids": [
    "stripe-checkout"
   ],
   "first_party": false,
   "rail_scope": "none",
   "trial_path": "free tier",
   "note": "No 402 or agent rail. Upgrade redirects to checkout.stripe.com, which robots.txt disallows for our agent, so whether the 14-day trial needs a card is unknown. No billing API."
  },
  "cancel": {
   "status": "n/a",
   "note": "Nothing to cancel: our agent used the free plan.",
   "docs_note": "not tested: no plan or trial was started. Docs: Billing > Manage plan opens the Stripe billing portal to cancel; account deletion cancels a subscription.",
   "docs_grade": "",
   "nothing": "free_plan"
  },
  "delete": {
   "status": "browser",
   "note": "login afterwards 401 'Invalid email or password'. A short link still redirected 2 min later.",
   "left": "deleted",
   "account": true
  }
 },
 "routes": [],
 "checkout": null,
 "docs": null,
 "claims": null,
 "pay_options": {
  "checked": "2026-10-08",
  "source": "probe",
  "options": [],
  "agentic": [],
  "paid": null,
  "exercised": null,
  "detected_grade": null,
  "trial": {
   "no_card": null,
   "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": false,
  "cli": false,
  "sdk": true,
  "mcp": "official",
  "llms_txt": true
 },
 "surface_notes": {
  "api": "REST at api.umami.is/v1 with Pro API key; 50 calls / 15 s per key (docs)",
  "openapi": "none published; @umami/api-client says it is generated from one",
  "mcp": "official remote server, read-only tools, Pro key",
  "sdk": "@umami/api-client 0.81.0, @umami/node 0.4.0"
 },
 "can_do": [
  "Sign up and verify email in a browser with no bot check",
  "Add, rename and delete a website",
  "Create, edit and delete goals and funnels",
  "Add dated notes to the traffic chart",
  "Create short links, tracking pixels, boards and public share links",
  "Export a website's data (emailed zip of CSVs) on the free plan",
  "Delete the account in the browser"
 ],
 "cannot_do": [
  {
   "what": "Get an API key or use the MCP server",
   "why": "Pro plan and up"
  },
  {
   "what": "Record events or pageviews from the agent itself",
   "why": "/api/send drops bot-like User-Agents with 200 {\"beep\":\"boop\"}"
  },
  {
   "what": "Start a paid plan or trial on its own",
   "why": "hosted Stripe Checkout only; checkout.stripe.com disallowed by robots.txt for agents"
  },
  {
   "what": "Session replays and heatmaps",
   "why": "Business plan"
  }
 ],
 "blockers": [
  "API keys and MCP need the Pro plan",
  "Agent-sent hits dropped as bot traffic, silently"
 ],
 "tips_for_owner": [
  "Offer a read-only API key on Hobby",
  "Make dropped bot hits visible to the sender",
  "Publish the OpenAPI file",
  "Serve server/discover and PRM on MCP",
  "Add a billing API or agent payment rail",
  "Add an account-delete API route",
  "Stop serving links after account deletion"
 ],
 "tips_for_agents": [
  "On Hobby, drive the dashboard in a browser; click the suggested option in path/event comboboxes before Save or nothing is sent",
  "A 200 {\"beep\":\"boop\"} from /api/send means the hit was dropped as bot traffic",
  "With a Pro key use https://api.umami.is/v1 (Bearer, /us or /eu prefix) or MCP at https://cloud.umami.is/mcp",
  "Hobby allows one website; a second gets 401 'Website limit reached.'"
 ],
 "selfhost": {
  "install": {
   "status": "skipped",
   "minutes": 0,
   "note": "no docker in the drive sandbox (docs/install: source, Docker Compose, Docker image, third-party Helm)"
  }
 },
 "summary": "An agent can sign up for Umami Cloud's free plan without a bot check and use the whole dashboard in a browser: websites, goals, funnels, notes, links, pixels, shares, export and account delete. The API and MCP server need a Pro key, and hits our self-identified agent sent to /api/send were dropped as bot traffic, so every report it read was empty.",
 "wall": "API keys and MCP need Pro plan",
 "plan_scope": "free plan",
 "robots_stop": null,
 "robots": null,
 "plain": {
  "summary": "Umami is a web analytics tool for websites. An agent could sign up for free and run the whole dashboard itself in a browser (adding sites, building goals and funnels, exporting data, deleting the account), but it never saw real data because the product's bot filter silently throws away any traffic the agent sends under its own name, and the real API/AI integration (MCP) needs a paid plan the agent could not get.",
  "can_do": [
   "Sign up and use the whole dashboard in a browser with no bot check",
   "Create and delete websites, goals, funnels, links, pixels, boards and share links",
   "Export the account's analytics data by email",
   "Delete the account completely, including login access"
  ],
  "cannot_do": [
   {
    "what": "Record its own test visits or events",
    "why": "the site quietly drops any traffic that looks automated"
   },
   {
    "what": "Use the documented API or the AI (MCP) integration",
    "why": "both need a paid Pro plan"
   },
   {
    "what": "Start or pay for a paid plan by itself",
    "why": "checkout happens on a page the agent is not allowed to open"
   },
   {
    "what": "See session replays or heatmaps",
    "why": "needs an even higher paid plan"
   }
  ]
 },
 "plan_gated": [
  {
   "capability": "Session replay",
   "plan": "Business",
   "evidence": "website settings: 'This feature requires a Business plan subscription.'"
  },
  {
   "capability": "Heatmaps",
   "plan": "Business",
   "evidence": "website settings: 'This feature requires a Business plan subscription.'"
  },
  {
   "capability": "Teams",
   "plan": "Pro",
   "evidence": "Settings > Teams: 'Teams requires a Pro plan'"
  },
  {
   "capability": "Cloud REST API",
   "plan": "Pro",
   "evidence": "Settings > API keys: 'API access requires a Pro plan'"
  },
  {
   "capability": "Streaming API",
   "plan": "Business",
   "evidence": "pricing table"
  },
  {
   "capability": "White-label",
   "plan": "Business",
   "evidence": "'White-label requires a Business plan'"
  },
  {
   "capability": "Import",
   "plan": "paid",
   "evidence": "Settings > Data: Import data, Upgrade"
  },
  {
   "capability": "SAML SSO",
   "plan": "Enterprise",
   "evidence": "pricing"
  },
  {
   "capability": "Audit log",
   "plan": "Enterprise",
   "evidence": "pricing"
  },
  {
   "capability": "Email reports",
   "plan": "Pro",
   "evidence": "'Email reports requires a Pro plan'"
  },
  {
   "capability": "MCP server (channel)",
   "plan": "Pro",
   "evidence": "docs/cloud/mcp: 'Cloud API keys, which are available on the Pro, Business, and Enterprise plans'"
  }
 ],
 "reply": null,
 "capabilities": [
  {
   "id": "cap-01",
   "group": "Acquisition",
   "capability": "View pageviews, visitors, and visits for a website",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "GET /websites/{id}/stats",
    "mcp": "get_website_stats",
    "cli": null,
    "ui": "Website overview"
   },
   "check": "GET /websites/{id}/stats returns nonzero pageviews/visitors counts for the date range",
   "source": "https://docs.umami.is/docs/mcp, https://docs.umami.is/docs"
  },
  {
   "id": "cap-03",
   "group": "Acquisition",
   "capability": "View top referrers, pages, countries, devices, browsers, UTM breakdowns",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "GET /websites/{id}/metrics",
    "mcp": "get_website_metrics",
    "cli": null,
    "ui": "Website overview metrics panels"
   },
   "check": "GET /websites/{id}/metrics?type=referrer returns a ranked list of referrer values",
   "source": "https://docs.umami.is/docs/mcp"
  },
  {
   "id": "cap-04",
   "group": "Acquisition",
   "capability": "See real-time visitor activity",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "GET /websites/{id}/active",
    "mcp": "get_realtime",
    "cli": null,
    "ui": "Realtime screen"
   },
   "check": "GET /websites/{id}/active returns a current visitor count after loading a tracked page",
   "source": "https://docs.umami.is/docs/mcp, https://docs.umami.is/docs"
  },
  {
   "id": "cap-05",
   "group": "Behavior",
   "capability": "Track custom events on a site",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "POST /send",
    "mcp": null,
    "cli": null,
    "ui": "Tracker script / data attributes"
   },
   "check": "GET /websites/{id}/events after firing umami.track(name) shows the event by name",
   "source": "https://docs.umami.is/docs/track-events"
  },
  {
   "id": "cap-06",
   "group": "Behavior",
   "capability": "Inspect individual visitor sessions and their activity timeline",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "GET /websites/{id}/sessions/{sessionId}",
    "mcp": "get_session",
    "cli": null,
    "ui": "Sessions screen, session profile"
   },
   "check": "GET /websites/{id}/sessions/{sessionId} returns the session's event/pageview timeline",
   "source": "https://docs.umami.is/docs/mcp"
  },
  {
   "id": "cap-07",
   "group": "Behavior",
   "capability": "Watch a session replay of real visitor interactions",
   "weight": "core",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Replays screen, session profile Replays tab"
   },
   "check": "opening a recorded session in the replay player shows mouse/scroll/navigation playback",
   "source": "https://docs.umami.is/docs/replays, https://umami.is/pricing"
  },
  {
   "id": "cap-08",
   "group": "Behavior",
   "capability": "View click/scroll heatmaps for a page",
   "weight": "core",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Heatmap tab"
   },
   "check": "selecting a page under the Heatmap tab renders click-dot or scroll-band overlay data",
   "source": "https://docs.umami.is/docs/heatmaps, https://umami.is/pricing"
  },
  {
   "id": "cap-09",
   "group": "Conversion",
   "capability": "Build a conversion funnel across ordered page/event steps",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "POST /websites/{id}/funnel",
    "mcp": "run_funnel / list_funnels",
    "cli": null,
    "ui": "Funnel insight"
   },
   "check": "GET funnel result shows per-step visitor counts and drop-off rate matching configured steps",
   "source": "https://docs.umami.is/docs/funnel, https://docs.umami.is/docs/mcp"
  },
  {
   "id": "cap-10",
   "group": "Conversion",
   "capability": "Define a goal (viewed page or triggered event) and track its conversion rate",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "GET /websites/{id}/goals",
    "mcp": "get_goals",
    "cli": null,
    "ui": "Goals insight"
   },
   "check": "GET /websites/{id}/goals returns the configured goal with a nonzero conversion count after the action occurs",
   "source": "https://docs.umami.is/docs/goals, https://docs.umami.is/docs/mcp"
  },
  {
   "id": "cap-26",
   "group": "Core object",
   "capability": "Add a website to track",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "POST /websites",
    "mcp": null,
    "cli": null,
    "ui": "Websites - Add website"
   },
   "check": "GET /websites includes the newly created site by name/domain",
   "source": "https://docs.umami.is/docs/add-a-website"
  },
  {
   "id": "cap-02",
   "group": "Acquisition",
   "capability": "View pageview/visit traffic over time",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "GET /websites/{id}/pageviews",
    "mcp": "get_website_traffic",
    "cli": null,
    "ui": "Website overview chart"
   },
   "check": "GET /websites/{id}/pageviews returns a time series bucketed by the requested unit",
   "source": "https://docs.umami.is/docs/mcp"
  },
  {
   "id": "cap-11",
   "group": "Acquisition",
   "capability": "Create a trackable short link and view its click metrics",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "POST /links, GET /links/{id}",
    "mcp": null,
    "cli": null,
    "ui": "Links screen"
   },
   "check": "GET /links/{id} click count increases after visiting the generated /l/{code} redirect URL",
   "source": "https://docs.umami.is/docs/links"
  },
  {
   "id": "cap-12",
   "group": "Acquisition",
   "capability": "Create a tracking pixel and view its view metrics",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "POST /pixels, GET /pixels/{id}",
    "mcp": null,
    "cli": null,
    "ui": "Pixels screen"
   },
   "check": "GET /pixels/{id} shows a recorded view after the pixel image tag loads",
   "source": "https://docs.umami.is/docs/pixels"
  },
  {
   "id": "cap-13",
   "group": "Behavior",
   "capability": "Analyze visitor journeys (common navigation paths)",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "POST /websites/{id}/journey",
    "mcp": "run_journey",
    "cli": null,
    "ui": "Journey insight"
   },
   "check": "GET journey result returns ranked path sequences for the site",
   "source": "https://docs.umami.is/docs, https://docs.umami.is/docs/mcp"
  },
  {
   "id": "cap-14",
   "group": "Behavior",
   "capability": "Save and apply reusable filter segments/cohorts",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": "list_segments",
    "cli": null,
    "ui": "Segments screen, Overview 'Save as segment'"
   },
   "check": "a saved segment appears in the Segments list and reapplies the same filters when applied",
   "source": "https://docs.umami.is/docs/segments, https://docs.umami.is/docs/mcp"
  },
  {
   "id": "cap-15",
   "group": "Behavior",
   "capability": "View cohort retention table",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "POST /websites/{id}/retention",
    "mcp": "run_retention",
    "cli": null,
    "ui": "Retention insight"
   },
   "check": "GET retention result returns a cohort grid with day-over-day return percentages",
   "source": "https://docs.umami.is/docs/retention, https://docs.umami.is/docs/mcp"
  },
  {
   "id": "cap-16",
   "group": "Conversion",
   "capability": "Run first-click/last-click marketing attribution for a conversion",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "POST /websites/{id}/attribution",
    "mcp": "run_attribution",
    "cli": null,
    "ui": "Attribution insight"
   },
   "check": "GET attribution result credits a referrer/UTM source consistent with the chosen model",
   "source": "https://docs.umami.is/docs/attribution, https://docs.umami.is/docs/mcp"
  },
  {
   "id": "cap-17",
   "group": "Conversion",
   "capability": "Track revenue per event and view revenue totals/breakdowns",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "GET /websites/{id}/revenue",
    "mcp": "get_revenue",
    "cli": null,
    "ui": "Revenue insight"
   },
   "check": "GET /websites/{id}/revenue reflects the revenue/currency values sent with tracked events",
   "source": "https://docs.umami.is/docs/revenue, https://docs.umami.is/docs/mcp"
  },
  {
   "id": "cap-18",
   "group": "Monitoring",
   "capability": "View Core Web Vitals performance percentiles and trend",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": "get_performance",
    "cli": null,
    "ui": "Performance report"
   },
   "check": "GET performance data returns LCP/CLS/INP percentile values by device/page",
   "source": "https://docs.umami.is/docs/mcp"
  },
  {
   "id": "cap-19",
   "group": "Monitoring",
   "capability": "Add dated annotations to the activity timeline",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": "get_annotations",
    "cli": null,
    "ui": "Website timeline"
   },
   "check": "GET annotations returns the added note on its assigned date",
   "source": "https://docs.umami.is/docs/mcp"
  },
  {
   "id": "cap-20",
   "group": "Sharing",
   "capability": "Build a custom board combining widgets from one or more websites/pixels/links",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Boards screen, Design a board"
   },
   "check": "opening a saved board shows the configured components rendered in their designed layout",
   "source": "https://docs.umami.is/docs/using-boards"
  },
  {
   "id": "cap-21",
   "group": "Sharing",
   "capability": "Share a board or website statistics via a public link",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Add a board - Share a board"
   },
   "check": "the generated public share URL renders the board/stats without login",
   "source": "https://docs.umami.is/docs/using-boards"
  },
  {
   "id": "cap-22",
   "group": "Collaboration",
   "capability": "Create a team and manage member roles (Owner/Manager/Member/View Only)",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Teams screen"
   },
   "check": "GET team membership shows an invited user with the assigned role",
   "source": "https://docs.umami.is/docs/using-teams, https://umami.is/pricing"
  },
  {
   "id": "cap-23",
   "group": "Integration",
   "capability": "Query analytics via the self-hosted or cloud REST API",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": "GET /api/*",
    "mcp": null,
    "cli": null,
    "ui": null
   },
   "check": "an authenticated GET to /api/websites returns the caller's website list as JSON",
   "source": "https://docs.umami.is/docs/api, https://umami.is/pricing"
  },
  {
   "id": "cap-25",
   "group": "Integration",
   "capability": "Consume analytics events via a streaming API",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": "Streaming API",
    "mcp": null,
    "cli": null,
    "ui": null
   },
   "check": "subscribing to the streaming endpoint emits events as they are tracked",
   "source": "https://umami.is/pricing"
  },
  {
   "id": "cap-27",
   "group": "Core object",
   "capability": "Install the tracking script to collect data on a site",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Website tracking code snippet"
   },
   "check": "loading a page with the embedded script tag produces a pageview visible in the dashboard",
   "source": "https://docs.umami.is/docs"
  },
  {
   "id": "cap-28",
   "group": "Peripheral",
   "capability": "Self-host the full platform on own infrastructure",
   "weight": "peripheral",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": null
   },
   "check": "a self-hosted deployment serves the Umami dashboard at the configured URL",
   "source": "https://docs.umami.is/docs/install"
  },
  {
   "id": "cap-29",
   "group": "Peripheral",
   "capability": "Enable white-labeled branding on the dashboard",
   "weight": "peripheral",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Settings - Branding"
   },
   "check": "the dashboard shows the configured custom branding instead of the Umami logo",
   "source": "https://umami.is/pricing"
  },
  {
   "id": "cap-30",
   "group": "Peripheral",
   "capability": "Export tracked data out of the account",
   "weight": "peripheral",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Pricing FAQ - Can I export my data?"
   },
   "check": "a requested data export produces a downloadable file containing the account's analytics data",
   "source": "https://umami.is/pricing"
  },
  {
   "id": "cap-31",
   "group": "Peripheral",
   "capability": "Import data into the account",
   "weight": "peripheral",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": null
   },
   "check": "an imported dataset appears reflected in subsequent website stats",
   "source": "https://umami.is/pricing"
  },
  {
   "id": "cap-32",
   "group": "Peripheral",
   "capability": "Enable single sign-on (SAML SSO) for team login",
   "weight": "peripheral",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Enterprise settings"
   },
   "check": "a configured SSO provider allows a team member to log in without a local password",
   "source": "https://umami.is/pricing"
  },
  {
   "id": "cap-33",
   "group": "Peripheral",
   "capability": "View an audit log of account activity",
   "weight": "peripheral",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Enterprise settings"
   },
   "check": "the audit log lists a recent recorded action with actor and timestamp",
   "source": "https://umami.is/pricing"
  },
  {
   "id": "cap-34",
   "group": "Peripheral",
   "capability": "Receive scheduled email reports",
   "weight": "peripheral",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Settings - Reports"
   },
   "check": "a configured recipient receives a periodic analytics summary email",
   "source": "https://umami.is/pricing"
  }
 ],
 "attempts": [
  {
   "t": "01:53",
   "cap": "discovery",
   "route": "api",
   "documented": true,
   "verified": true,
   "capability": "docs",
   "task": "Find docs and llms.txt",
   "result": "done",
   "evidence": "https://docs.umami.is/llms.txt 200 text/plain, ~290 links incl. per-operation API reference .md pages; umami.is/llms.txt 404; .md URLs return text/markdown (docs/cloud/api-key.md)",
   "quality": {
    "docs_match": "match"
   }
  },
  {
   "t": "01:53",
   "cap": "discovery",
   "route": "api",
   "documented": true,
   "verified": true,
   "capability": "markdown negotiation",
   "task": "Accept: text/markdown on docs page",
   "result": "done",
   "evidence": "GET docs.umami.is/docs/cloud/api-key with Accept: text/markdown -> text/html, vary: accept-encoding only; .md URL -> text/markdown",
   "notes": "markdown: md-url only"
  },
  {
   "t": "01:53",
   "cap": "discovery",
   "route": "api",
   "documented": true,
   "verified": true,
   "capability": "robots/aipref",
   "task": "robots.txt and Content-Usage",
   "result": "done",
   "evidence": "umami.is/robots.txt: User-Agent: * Allow: / Disallow: /api/ Disallow: /lp/; no Content-Usage or Content-signal lines; docs.umami.is and cloud.umami.is robots.txt 404 (no rules)"
  },
  {
   "t": "01:53",
   "cap": "discovery",
   "route": "api",
   "documented": true,
   "verified": true,
   "capability": "mcp discover",
   "task": "POST server/discover to https://cloud.umami.is/mcp",
   "result": "partial",
   "evidence": "401 application/json {\"error\":\"invalid_token\",\"error_description\":\"A Cloud API key is required.\"}; WWW-Authenticate: Bearer realm=\"Umami Cloud MCP\", error=\"invalid_token\" (no resource_metadata); CORS allows MCP-Session-Id header (legacy style)",
   "notes": "auth-required before discover; MCP needs Cloud API key = Pro plan+ (docs/cloud/mcp)"
  },
  {
   "t": "01:53",
   "cap": "discovery",
   "route": "api",
   "documented": true,
   "verified": true,
   "capability": "well-known",
   "task": "Cards, PRM, AS metadata, ucp, auth.md, SKILL.md",
   "result": "done",
   "evidence": "404 text/html for umami.is/.well-known/{ai-catalog.json,agent-card.json,agent.json,ucp,mcp/server-card.json}, umami.is/auth.md, /SKILL.md, cloud.umami.is/mcp/server-card, cloud.umami.is/.well-known/oauth-protected-resource and oauth-authorization-server; api.umami.is/.well-known/oauth-protected-resource 405 json"
  },
  {
   "t": "01:59",
   "cap": "discovery",
   "route": "api",
   "documented": true,
   "verified": false,
   "capability": "openapi",
   "task": "Find OpenAPI file",
   "result": "failed",
   "evidence": "404 for docs.umami.is/openapi.json, umami.is/openapi.json; api.umami.is/v1/openapi.json 400 \"No API key specified\". npm @umami/api-client 0.81.0 says \"generated from the Umami OpenAPI contract\" but no public spec URL in llms.txt"
  },
  {
   "t": "01:59",
   "cap": "discovery",
   "documented": true,
   "verified": true,
   "capability": "sdk/mcp packages",
   "task": "npm view official packages",
   "route": "cli",
   "result": "done",
   "evidence": "@umami/mcp 0.2.0 (stdio MCP), @umami/api-client 0.81.0, @umami/node 0.4.0 on npm"
  },
  {
   "t": "01:59",
   "cap": "pay",
   "capability": "pay public probes",
   "task": "402 probes, registries, pricing",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "pay_probe.json: no 402 challenges (umami.is, api.umami.is, x402. 404), no MPP/Stripe Projects/Bazaar listings; pay_tx.json: refused, no 402 asking USDC. docs cloud/subscription: \"Umami uses Stripe as its payment processor... sent to the Stripe checkout portal. All subscriptions come with a 14-day free trial.\" Pricing: Hobby $0 (1 website, no API/MCP/teams), Pro $20 (API, MCP), Business $200 (replays, heatmaps, streaming API). agents./mpp. subdomains 404."
  },
  {
   "t": "04:21",
   "cap": "signup",
   "capability": "sign up",
   "task": "Create Umami Cloud account",
   "route": "browser",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "cloud.umami.is/signup web form (name, email, password; also Google/GitHub). No CAPTCHA signals. Submitted in pw -> /setup. No documented API sign-up (docs/cloud/sign-up: web only).",
   "quality": {
    "docs_match": "match",
    "docs_url": "https://docs.umami.is/docs/cloud/sign-up"
   }
  },
  {
   "t": "04:21",
   "cap": "verify",
   "capability": "verify email",
   "task": "Enter 6-digit code",
   "route": "browser",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "Mail \"Please verify your email address\" from support@umami.is arrived within ~30 s with 6-digit code; read headless via inbox, typed into /setup in browser -> advanced to Select region",
   "quality": {
    "docs_match": "match",
    "docs_url": "https://docs.umami.is/docs/cloud/sign-up"
   }
  },
  {
   "t": "04:21",
   "cap": "pay",
   "capability": "trial checkout",
   "task": "See whether the Pro 14-day trial needs a card",
   "route": "browser",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "Clicking \"Upgrade to Pro\" (14-day free trial) on /setup redirects to https://checkout.stripe.com/c/pay/cs_live_…; checkout.stripe.com robots.txt disallows it for our agent, page not opened. Whether the trial asks for a card: unknown.",
   "notes": "Hosted Stripe Checkout; no billing API in docs; no 402 rails"
  },
  {
   "t": "04:21",
   "cap": "login",
   "capability": "session",
   "task": "Get a logged-in session",
   "route": "browser",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "After choosing EU region and \"Continue with Hobby\", landed on cloud.umami.is/analytics/eu/websites as the agent's inbox"
  },
  {
   "t": "08:00",
   "cap": "credentials",
   "capability": "API key",
   "task": "Create a Cloud API key",
   "route": "browser",
   "documented": true,
   "result": "plan_gated",
   "verified": true,
   "key": "create",
   "evidence": "cloud.umami.is/settings/api-keys on Hobby: \"API access requires a Pro plan ... Upgrade\". docs/cloud/api-key: key created in Settings > API keys (UI only on Cloud); API-reference create-my-api-key: \"Available on self-hosted installations.\" docs/cloud/mcp: \"Cloud API keys, which are available on the Pro, Business, and Enterprise plans.\"",
   "quality": {
    "docs_url": "https://docs.umami.is/docs/cloud/api-key"
   }
  },
  {
   "t": "08:00",
   "cap": "first_call",
   "capability": "first API call",
   "task": "POST /api/send (documented, no key) to record a pageview",
   "route": "api",
   "documented": true,
   "result": "partial",
   "verified": false,
   "evidence": "POST https://gateway.umami.is/api/send {\"type\":\"event\",\"payload\":{hostname,url:\"/\",website:c1df…}} -> 200 {\"beep\":\"boop\"}. Same from the browser (Chrome UA + AgentDrivesAgent/1.0) -> 200 {\"beep\":\"boop\"}. Stats afterwards: pageviews 0. The call is answered but our agent traffic is discarded as a bot.",
   "quality": {
    "docs_match": "drift",
    "docs_url": "https://docs.umami.is/docs/api/sending-stats",
    "error_legibility": "silent",
    "recoverable": "no"
   }
  },
  {
   "t": "08:00",
   "cap": "first_call",
   "capability": "first API call (keyed)",
   "task": "GET https://api.umami.is/v1/websites",
   "route": "api",
   "documented": true,
   "result": "plan_gated",
   "verified": true,
   "evidence": "No key on Hobby. Without key: 400 {\"error\":{\"message\":\"No API key specified.\",\"code\":\"bad-request\",\"status\":400}}; bad key: 401 {\"error\":{\"message\":\"Invalid API key.\",\"code\":\"unauthorized\",\"status\":401}}"
  },
  {
   "t": "08:00",
   "cap": "first_action",
   "capability": "add website",
   "task": "Add a website in the dashboard",
   "route": "browser",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "Websites > Add website, name \"AgentDrives Test\", domain agentdrives.com -> listed, id [redacted] (web app GET /api/users/{id}/websites shows it)",
   "quality": {
    "docs_match": "match",
    "docs_url": "https://docs.umami.is/docs/add-a-website"
   }
  },
  {
   "t": "08:28",
   "cap": "cap-05",
   "capability": "Track custom events",
   "task": "Send a custom event \"signup-click\" with event data via documented /api/send, then see it under Events",
   "route": "browser",
   "documented": true,
   "result": "failed",
   "verified": true,
   "step": "create",
   "evidence": "Events page afterwards: web app GET /api/websites/{id}/events/stats -> {\"events\":0,...}; metrics?type=event -> []. Umami discards requests whose User-Agent looks like a bot; our agent labels itself honestly, so its own events are never recorded. No setting on Cloud website settings to allow it.",
   "quality": {
    "docs_match": "drift",
    "docs_url": "https://docs.umami.is/docs/api/sending-stats",
    "error_legibility": "silent",
    "recoverable": "no",
    "verify_route": "yes"
   },
   "notes": "docs only say \"send a proper User-Agent HTTP header or your request won't be registered\"; the 200 {\"beep\":\"boop\"} reply does not say it was dropped"
  },
  {
   "t": "08:28",
   "cap": "cap-01",
   "capability": "View pageviews, visitors, visits",
   "task": "Open website Overview and read stats for last 24h",
   "route": "browser",
   "documented": true,
   "result": "done",
   "verified": true,
   "step": "read",
   "evidence": "cloud.umami.is/analytics/eu/websites/[redacted] Overview rendered; web app GET /api/websites/{id}/stats -> {\"pageviews\":0,\"visitors\":0,\"visits\":0,\"bounces\":0,\"totaltime\":0,\"comparison\":{...}}. Zero because no traffic could be recorded.",
   "quality": {
    "docs_match": "match",
    "docs_url": "https://docs.umami.is/docs/api-reference/get-website-stats",
    "verify_route": "yes"
   },
   "notes": "nonzero counts not shown: our own traffic is filtered as bot"
  },
  {
   "t": "08:28",
   "cap": "cap-03",
   "capability": "Top referrers/pages/countries/browsers",
   "task": "Read Overview metric panels",
   "route": "browser",
   "documented": true,
   "result": "done",
   "verified": true,
   "step": "read",
   "evidence": "Overview panels load; web app GET /api/websites/{id}/metrics?type=referrer|path|browser|country -> [] each (no recorded traffic)",
   "quality": {
    "docs_match": "match",
    "docs_url": "https://docs.umami.is/docs/api-reference/get-website-metrics",
    "verify_route": "yes"
   }
  },
  {
   "t": "08:28",
   "cap": "cap-04",
   "capability": "Realtime",
   "task": "Open Realtime screen",
   "route": "browser",
   "documented": true,
   "result": "done",
   "verified": true,
   "step": "read",
   "evidence": "Realtime page polls GET /api/realtime/{id} -> {\"totals\":{\"views\":0,\"visitors\":0,\"events\":0,\"countries\":0},...}; /active -> {\"visitors\":0}. Our agent's browser visit is not counted (bot filter).",
   "quality": {
    "docs_match": "match",
    "docs_url": "https://docs.umami.is/docs/api-reference/get-realtime",
    "verify_route": "yes"
   }
  },
  {
   "t": "08:28",
   "cap": "cap-06",
   "capability": "Inspect sessions",
   "task": "Open Sessions list and one session profile",
   "route": "browser",
   "documented": true,
   "result": "partial",
   "verified": true,
   "step": "read",
   "evidence": "Sessions page loads; GET /api/websites/{id}/sessions -> {\"data\":[],\"count\":0}. No session exists to open: our traffic is not recorded, so a session profile/timeline could not be inspected.",
   "quality": {
    "docs_match": "match",
    "docs_url": "https://docs.umami.is/docs/sessions",
    "verify_route": "yes"
   }
  },
  {
   "t": "12:19",
   "cap": "cap-10",
   "capability": "Define a goal",
   "task": "Create goal \"Pricing viewed\" (Viewed page /pricing)",
   "route": "browser",
   "documented": true,
   "step": "create",
   "result": "done",
   "verified": true,
   "evidence": "Goals > + Goal; web app POST /api/websites/{id}/goals {\"name\":\"Pricing viewed\",\"parameters\":{\"type\":\"path\",\"value\":\"/pricing\"}} -> 200 id 19ed7d34-…; card shows Conversion rate 0/0 0%",
   "quality": {
    "docs_match": "match",
    "docs_url": "https://docs.umami.is/docs/goals",
    "verify_route": "yes"
   },
   "notes": "Path value field is a combobox whose dropdown covers the Save button until dismissed"
  },
  {
   "t": "12:19",
   "cap": "cap-10",
   "capability": "Define a goal",
   "task": "Read goal back after reload",
   "route": "browser",
   "documented": true,
   "step": "read",
   "result": "done",
   "verified": true,
   "evidence": "Reload: GET /api/websites/{id}/goals lists \"Pricing viewed\"; GET …/goals/19ed7d34…/stats -> {\"num\":0,\"total\":0}",
   "quality": {
    "docs_match": "match",
    "docs_url": "https://docs.umami.is/docs/goals",
    "verify_route": "yes"
   }
  },
  {
   "t": "12:19",
   "cap": "cap-10",
   "capability": "Define a goal",
   "task": "Rename goal via ellipsis > Edit",
   "route": "browser",
   "documented": true,
   "step": "update",
   "result": "done",
   "verified": true,
   "evidence": "POST /api/websites/{id}/goals/19ed7d34… {\"name\":\"Pricing viewed v2\",…} -> 200 name \"Pricing viewed v2\"",
   "quality": {
    "docs_match": "match",
    "docs_url": "https://docs.umami.is/docs/goals",
    "verify_route": "yes"
   }
  },
  {
   "t": "12:19",
   "cap": "cap-10",
   "capability": "Define a goal",
   "task": "Use: conversion count after a /pricing view",
   "route": "browser",
   "documented": true,
   "step": "use",
   "result": "failed",
   "verified": true,
   "evidence": "Conversion stays 0/0: our /api/send pageview for /pricing is discarded as bot ({\"beep\":\"boop\"}), so no conversion could be produced",
   "quality": {
    "docs_match": "match",
    "docs_url": "https://docs.umami.is/docs/goals",
    "verify_route": "yes",
    "error_legibility": "silent"
   }
  },
  {
   "t": "16:11",
   "cap": "cap-10",
   "capability": "Define a goal",
   "task": "Delete goal via ellipsis > Delete > Confirm, read back",
   "route": "browser",
   "documented": true,
   "step": "delete",
   "result": "done",
   "verified": true,
   "evidence": "DELETE /api/websites/{id}/goals/19ed7d34… -> {\"ok\":true}; after reload GET …/goals -> {\"data\":[],\"count\":0}",
   "quality": {
    "docs_match": "match",
    "docs_url": "https://docs.umami.is/docs/goals",
    "verify_route": "yes"
   },
   "notes": "Menu items render a moment after the ellipsis opens; an earlier read of the menu of our own caught only \"Edit\""
  },
  {
   "t": "16:11",
   "cap": "cap-09",
   "capability": "Build a funnel",
   "task": "Create funnel \"Home to pricing\" (/home -> /pricing, window 60)",
   "route": "browser",
   "documented": true,
   "step": "create",
   "result": "done",
   "verified": true,
   "evidence": "POST /api/websites/{id}/funnels {\"name\":\"Home to pricing\",\"parameters\":{\"window\":60,\"steps\":[{path /home},{path /pricing}]}} -> 200 id c32a7667-…",
   "quality": {
    "docs_match": "match",
    "docs_url": "https://docs.umami.is/docs/funnel",
    "verify_route": "yes",
    "recoverable": "yes"
   },
   "notes": "Step value combobox discards typed text unless the dropdown option is clicked; first two tries posted nothing and showed no error"
  },
  {
   "t": "16:11",
   "cap": "cap-09",
   "capability": "Build a funnel",
   "task": "Read funnel back with per-step stats",
   "route": "browser",
   "documented": true,
   "step": "read",
   "result": "done",
   "verified": true,
   "evidence": "Reload: GET …/funnels lists it; GET …/funnels/c32a7667…/stats -> [{\"value\":\"/home\",\"visitors\":0,\"dropped\":0,\"dropoff\":null},{\"value\":\"/pricing\",\"visitors\":0,...}]",
   "quality": {
    "docs_match": "match",
    "docs_url": "https://docs.umami.is/docs/funnel",
    "verify_route": "yes"
   }
  },
  {
   "t": "16:12",
   "cap": "cap-09",
   "capability": "Build a funnel",
   "task": "Rename and change window to 30",
   "route": "browser",
   "documented": true,
   "step": "update",
   "result": "done",
   "verified": true,
   "evidence": "POST …/funnels/c32a7667… {\"name\":\"Home to pricing v2\",\"parameters\":{\"window\":\"30\",…}} -> 200; list shows \"Home to pricing v2\"",
   "quality": {
    "docs_match": "match",
    "docs_url": "https://docs.umami.is/docs/funnel",
    "verify_route": "yes"
   },
   "notes": "UI sends window as string \"30\" on edit vs number 60 on create"
  },
  {
   "t": "16:12",
   "cap": "cap-09",
   "capability": "Build a funnel",
   "task": "Use: per-step counts after visiting /home then /pricing",
   "route": "browser",
   "documented": true,
   "step": "use",
   "result": "failed",
   "verified": true,
   "evidence": "Step counts stay 0: our pageviews are discarded as bot ({\"beep\":\"boop\"} on /api/send)",
   "quality": {
    "docs_match": "match",
    "docs_url": "https://docs.umami.is/docs/funnel",
    "verify_route": "yes",
    "error_legibility": "silent"
   }
  },
  {
   "t": "16:12",
   "cap": "cap-09",
   "capability": "Build a funnel",
   "task": "Delete funnel and read back",
   "route": "browser",
   "documented": true,
   "step": "delete",
   "result": "done",
   "verified": true,
   "evidence": "DELETE …/funnels/c32a7667… -> {\"ok\":true}; GET …/funnels -> {\"data\":[],\"count\":0}",
   "quality": {
    "docs_match": "match",
    "docs_url": "https://docs.umami.is/docs/funnel",
    "verify_route": "yes"
   }
  },
  {
   "t": "20:37",
   "cap": "cap-02",
   "capability": "Traffic over time",
   "task": "Overview chart time series",
   "route": "browser",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "Overview chart loads; GET /api/websites/{id}/pageviews?unit=hour -> {\"pageviews\":[],\"sessions\":[]} (empty: no recorded traffic)",
   "quality": {
    "docs_match": "match",
    "docs_url": "https://docs.umami.is/docs/api-reference/get-website-pageviews",
    "verify_route": "yes"
   }
  },
  {
   "t": "20:37",
   "cap": "cap-11",
   "capability": "Short link + click metrics",
   "task": "Create link to https://agentdrives.com/, open it, read clicks",
   "route": "browser",
   "documented": true,
   "result": "partial",
   "verified": true,
   "evidence": "Add link -> POST /api/links 200 id a111509d…, slug o9r86YJwQ; GET https://cloud.umami.is/q/o9r86YJwQ -> 302 location https://agentdrives.com/; link page stats afterwards {\"pageviews\":0,\"visitors\":0}: our click not counted (bot filter)",
   "quality": {
    "docs_match": "match",
    "docs_url": "https://docs.umami.is/docs/links",
    "verify_route": "yes"
   }
  },
  {
   "t": "20:37",
   "cap": "cap-12",
   "capability": "Tracking pixel + views",
   "task": "Create pixel, load it, read views",
   "route": "browser",
   "documented": true,
   "result": "partial",
   "verified": true,
   "evidence": "Add pixel -> POST /api/pixels 200 id 09d17ef0…, slug 0UJzHAvGY; GET https://cloud.umami.is/p/0UJzHAvGY returned image bytes; pixel stats afterwards pageviews 0 (bot filter)",
   "quality": {
    "docs_match": "match",
    "docs_url": "https://docs.umami.is/docs/pixels",
    "verify_route": "yes"
   }
  },
  {
   "t": "20:37",
   "cap": "cap-13",
   "capability": "Journeys",
   "task": "Open Journeys insight (3 steps)",
   "route": "browser",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "GET /api/websites/{id}/journeys?steps=3 -> []; page \"No data available.\"",
   "quality": {
    "docs_match": "match",
    "docs_url": "https://docs.umami.is/docs/journey",
    "verify_route": "yes"
   },
   "notes": "runs, empty: no recorded traffic"
  },
  {
   "t": "20:37",
   "cap": "cap-14",
   "capability": "Segments",
   "task": "Save segment \"Pricing visitors\" (path = /pricing)",
   "route": "browser",
   "documented": true,
   "result": "partial",
   "verified": true,
   "evidence": "POST /api/websites/{id}/segments -> 200 id 13bff88b…, but saved filter is {\"name\":\"path\",\"operator\":\"eq\",\"value\":\"\"}: the value picker only offers recorded values (none exist), typed /pricing was dropped, and the API accepted an empty value without error",
   "quality": {
    "docs_match": "match",
    "docs_url": "https://docs.umami.is/docs/segments",
    "verify_route": "yes",
    "error_legibility": "silent"
   }
  },
  {
   "t": "20:37",
   "cap": "cap-15",
   "capability": "Retention",
   "task": "Open Retention insight",
   "route": "browser",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "GET /api/websites/{id}/retention -> []; \"No data available.\"",
   "quality": {
    "docs_match": "match",
    "docs_url": "https://docs.umami.is/docs/retention",
    "verify_route": "yes"
   }
  },
  {
   "t": "20:37",
   "cap": "cap-16",
   "capability": "Attribution",
   "task": "Open Attribution insight (first click, viewed page)",
   "route": "browser",
   "documented": true,
   "result": "partial",
   "verified": false,
   "evidence": "Attribution page renders Model First click / Type Viewed page / Conversion step, \"No data available.\"; no conversion step can be chosen without recorded pages, so no attribution query ran",
   "quality": {
    "docs_match": "match",
    "docs_url": "https://docs.umami.is/docs/attribution",
    "verify_route": "yes"
   }
  },
  {
   "t": "20:37",
   "cap": "cap-17",
   "capability": "Revenue",
   "task": "Open Revenue insight (USD)",
   "route": "browser",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "GET …/revenue/stats?currency=USD -> {\"sum\":0,\"count\":0,…}; revenue/chart, metrics, sessions all 200 empty",
   "quality": {
    "docs_match": "match",
    "docs_url": "https://docs.umami.is/docs/revenue",
    "verify_route": "yes"
   },
   "notes": "revenue events could not be sent (bot filter)"
  },
  {
   "t": "20:37",
   "cap": "cap-18",
   "capability": "Core Web Vitals",
   "task": "Open Performance report",
   "route": "browser",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "GET …/performance/stats -> {\"lcp\":{\"p50\":0,\"p75\":0,\"p95\":0},…,\"count\":0}; chart and metrics by path/device 200 empty",
   "quality": {
    "docs_match": "match",
    "docs_url": "https://docs.umami.is/docs/performance",
    "verify_route": "yes"
   }
  },
  {
   "t": "20:37",
   "cap": "cap-19",
   "capability": "Annotations",
   "task": "Add note \"AgentDrives test drive started\" on today",
   "route": "browser",
   "documented": true,
   "step": "create",
   "result": "done",
   "verified": true,
   "evidence": "Overview > Notes > Add note: POST /api/websites/{id}/annotations {\"date\":\"2026-10-08T00:00:00.000Z\",\"allDay\":true,\"note\":\"AgentDrives test drive started\"} -> 200 id 4f9c854f…; GET …/annotations lists it",
   "quality": {
    "docs_match": "match",
    "docs_url": "https://docs.umami.is/docs/annotations",
    "verify_route": "yes"
   }
  },
  {
   "t": "20:37",
   "cap": "cap-20",
   "capability": "Boards",
   "task": "Create board \"AgentDrives board\" (mixed)",
   "route": "browser",
   "documented": true,
   "step": "create",
   "result": "partial",
   "verified": true,
   "evidence": "Boards > Add board -> POST /api/boards 200 id 909791a4…, opens /boards/{id}/design; components not placed (no data to show and time)",
   "quality": {
    "docs_match": "match",
    "docs_url": "https://docs.umami.is/docs/add-a-board",
    "verify_route": "yes"
   }
  },
  {
   "t": "20:37",
   "cap": "cap-21",
   "capability": "Public share",
   "task": "Create website share \"Public stats\" and open it",
   "route": "browser",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "Website settings > Share > Add: POST /api/websites/{id}/shares 200 slug nRoR5YhKUxtrsiWp. in browser the share page renders Overview+Events only (as configured), GET /api/share/{slug} 200",
   "quality": {
    "docs_match": "match",
    "docs_url": "https://docs.umami.is/docs/enable-share-url",
    "verify_route": "yes"
   },
   "notes": "browser render was in our logged-in profile."
  },
  {
   "t": "20:37",
   "cap": "cap-22",
   "capability": "Teams",
   "task": "Open Teams settings",
   "route": "browser",
   "documented": true,
   "result": "plan_gated",
   "verified": true,
   "evidence": "Pricing: Teams \"Hobby -\", Pro and up; docs/cloud/teams. Hobby account."
  },
  {
   "t": "20:38",
   "cap": "cap-23",
   "capability": "Cloud REST API",
   "task": "GET https://api.umami.is/v1/websites",
   "route": "api",
   "documented": true,
   "result": "plan_gated",
   "verified": true,
   "evidence": "Settings > API keys: \"API access requires a Pro plan\"; no key -> 400 \"No API key specified.\"; pricing \"API access Hobby -\""
  },
  {
   "t": "20:38",
   "cap": "cap-25",
   "capability": "Streaming API",
   "task": "Check plan",
   "route": "none",
   "documented": true,
   "result": "plan_gated",
   "verified": true,
   "evidence": "Pricing: \"Streaming API Hobby - Pro - Business\"; no streaming docs page in llms.txt"
  },
  {
   "t": "20:38",
   "cap": "cap-27",
   "capability": "Install tracking script",
   "task": "Load a page with the tracker so a pageview appears",
   "route": "browser",
   "documented": true,
   "result": "failed",
   "verified": true,
   "evidence": "Tracker sends to /api/send; from our agent's browser (UA Chrome + AgentDrivesAgent/1.0) /api/send -> 200 {\"beep\":\"boop\"}, stats stay 0. Our agent cannot produce a visible pageview.",
   "quality": {
    "docs_match": "match",
    "docs_url": "https://docs.umami.is/docs/collect-data",
    "verify_route": "yes",
    "error_legibility": "silent"
   }
  },
  {
   "t": "20:38",
   "cap": "cap-07",
   "capability": "Session replay",
   "task": "Open Replays",
   "route": "browser",
   "documented": true,
   "result": "plan_gated",
   "verified": true,
   "evidence": "Website settings: \"Replays & Heatmaps, This feature requires a Business plan subscription.\" Pricing: Session replays Business+",
   "quality": {
    "docs_url": "https://docs.umami.is/docs/replays"
   }
  },
  {
   "t": "20:38",
   "cap": "cap-08",
   "capability": "Heatmaps",
   "task": "Open Heatmaps",
   "route": "browser",
   "documented": true,
   "result": "plan_gated",
   "verified": true,
   "evidence": "Website settings: \"Replays & Heatmaps, This feature requires a Business plan subscription.\"",
   "quality": {
    "docs_url": "https://docs.umami.is/docs/heatmaps"
   }
  },
  {
   "t": "22:45",
   "cap": "cap-28",
   "capability": "Self-host",
   "task": "Check docs",
   "route": "none",
   "documented": true,
   "verified": true,
   "result": "skipped",
   "evidence": "docs/install.md: source, Docker Compose, Docker image, Helm (third-party). Not installed: no Docker in the drive sandbox."
  },
  {
   "t": "22:45",
   "cap": "cap-29",
   "capability": "White-label",
   "task": "Open Settings > White-label",
   "route": "browser",
   "documented": true,
   "verified": true,
   "result": "plan_gated",
   "evidence": "\"White-label requires a Business plan\"; docs/cloud/white-label: Business plan"
  },
  {
   "t": "22:45",
   "cap": "cap-30",
   "capability": "Export data",
   "task": "Settings > Data > Export (website, last 30 days)",
   "route": "browser",
   "documented": true,
   "verified": true,
   "result": "done",
   "evidence": "available on Hobby (map said paid). Mail with download link: see next line.",
   "quality": {
    "docs_match": "match",
    "docs_url": "https://docs.umami.is/docs/cloud/export-data"
   }
  },
  {
   "t": "22:45",
   "cap": "cap-31",
   "capability": "Import data",
   "task": "Settings > Data > Import",
   "route": "browser",
   "documented": true,
   "verified": true,
   "result": "plan_gated",
   "evidence": "Settings > Data: \"Import data ... Upgrade\"; docs/cloud/import-data: import handled by the Umami team"
  },
  {
   "t": "22:45",
   "cap": "cap-32",
   "capability": "SAML SSO",
   "task": "Check pricing",
   "route": "none",
   "documented": true,
   "verified": true,
   "result": "plan_gated",
   "evidence": "Pricing: \"Enterprise ... Single sign on (SAML SSO)\""
  },
  {
   "t": "22:45",
   "cap": "cap-33",
   "capability": "Audit log",
   "task": "Check pricing",
   "route": "none",
   "documented": true,
   "verified": true,
   "result": "plan_gated",
   "evidence": "Pricing lists audit log under Enterprise only; no Hobby UI"
  },
  {
   "t": "22:45",
   "cap": "cap-34",
   "capability": "Email reports",
   "task": "Open Settings > Email reports",
   "route": "browser",
   "documented": true,
   "verified": true,
   "result": "plan_gated",
   "evidence": "\"Email reports requires a Pro plan\"; docs/cloud/email-reports: \"starting at the Pro plan\""
  },
  {
   "t": "22:45",
   "cap": "credentials",
   "capability": "API key revoke",
   "task": "Revoke API key",
   "route": "browser",
   "documented": true,
   "verified": true,
   "result": "plan_gated",
   "key": "revoke",
   "evidence": "No key could be created on Hobby (API access requires a Pro plan)"
  },
  {
   "t": "22:45",
   "cap": "credentials",
   "capability": "API key use",
   "task": "Use API key",
   "route": "api",
   "documented": true,
   "verified": true,
   "result": "plan_gated",
   "key": "use",
   "evidence": "No key on Hobby; api.umami.is/v1 answers 400 \"No API key specified.\""
  },
  {
   "t": "26:26",
   "cap": "cap-26",
   "capability": "Add a website",
   "task": "Read website back in list after reload",
   "route": "browser",
   "documented": true,
   "step": "read",
   "result": "done",
   "verified": true,
   "evidence": "GET /api/users/{id}/websites lists c1df5277… \"AgentDrives Test\" agentdrives.com",
   "quality": {
    "docs_match": "match",
    "docs_url": "https://docs.umami.is/docs/add-a-website",
    "verify_route": "yes"
   }
  },
  {
   "t": "26:26",
   "cap": "cap-26",
   "capability": "Add a website",
   "task": "Rename website in settings",
   "route": "browser",
   "documented": true,
   "step": "update",
   "result": "done",
   "verified": true,
   "evidence": "Website settings Save -> POST /api/websites/c1df5277… 200 name \"AgentDrives Test 2\"; after reload input shows \"AgentDrives Test 2\"",
   "quality": {
    "docs_match": "match",
    "docs_url": "https://docs.umami.is/docs/add-a-website",
    "verify_route": "yes"
   }
  },
  {
   "t": "26:26",
   "cap": "cap-26",
   "capability": "Add a website",
   "task": "Use: get tracking code and record a visit",
   "route": "browser",
   "documented": true,
   "step": "use",
   "result": "failed",
   "verified": true,
   "evidence": "Tracking code shown in settings; visits via the tracker endpoint /api/send from our agent return {\"beep\":\"boop\"} and are not recorded (see)",
   "quality": {
    "docs_match": "match",
    "docs_url": "https://docs.umami.is/docs/add-a-website",
    "verify_route": "yes",
    "error_legibility": "silent"
   }
  },
  {
   "t": "26:26",
   "cap": "cap-26",
   "capability": "Add a website",
   "task": "Delete website (type DELETE) and read back",
   "route": "browser",
   "documented": true,
   "step": "delete",
   "result": "done",
   "verified": true,
   "evidence": "Settings > Delete website > type DELETE > Delete. List right after still showed it; a few seconds later a new website could be created (Hobby limit 1) and GET /api/users/{id}/websites -> {\"data\":[],\"count\":0}",
   "quality": {
    "docs_match": "match",
    "docs_url": "https://docs.umami.is/docs/add-a-website",
    "verify_route": "yes"
   },
   "notes": "delete request not on gateway-eu; list lags a few seconds"
  },
  {
   "t": "26:26",
   "cap": "cap-26",
   "capability": "Add a website",
   "task": "Trial 2: create, list, delete website",
   "route": "browser",
   "documented": true,
   "trial": 2,
   "result": "done",
   "verified": true,
   "evidence": "POST /api/websites 200 id [id] \"AgentDrives Trial 2\", listed; deleted via settings; later list empty",
   "quality": {
    "docs_match": "match",
    "docs_url": "https://docs.umami.is/docs/add-a-website",
    "verify_route": "yes"
   }
  },
  {
   "t": "26:26",
   "cap": "cap-26",
   "capability": "Add a website",
   "task": "Trial 3: create, list, delete website",
   "route": "browser",
   "documented": true,
   "trial": 3,
   "result": "done",
   "verified": true,
   "evidence": "POST /api/websites 200 id [id] \"AgentDrives Trial 3\", listed; deleted via settings; later list empty",
   "quality": {
    "docs_match": "match",
    "docs_url": "https://docs.umami.is/docs/add-a-website",
    "verify_route": "yes"
   }
  },
  {
   "t": "26:34",
   "cap": "cap-30",
   "capability": "Export data",
   "task": "Download the export from the mail and open it",
   "route": "browser",
   "documented": true,
   "verified": true,
   "result": "done",
   "evidence": "Mail \"Website export completed\" arrived at 21:07:47 (~1 min); presigned S3 link -> 200 application/octet-stream 794; zip contains ['website_event.csv', 'event_data.csv', 'session_data.csv']",
   "notes": "mail says link expires in 24 hours; URL carries X-Amz-Expires=259200 (72 h)",
   "quality": {
    "docs_match": "match",
    "docs_url": "https://docs.umami.is/docs/cloud/export-data"
   }
  },
  {
   "t": "27:12",
   "cap": "cap-01",
   "capability": "View pageviews, visitors, visits",
   "task": "Trial 2: Overview stats on fresh website b56e693c",
   "route": "browser",
   "documented": true,
   "trial": 2,
   "result": "done",
   "verified": true,
   "evidence": "GET /api/websites/{id}/stats 200 {\"pageviews\":0,\"visitors\":0,...}",
   "quality": {
    "docs_match": "match",
    "docs_url": "https://docs.umami.is/docs/api-reference/get-website-stats",
    "verify_route": "yes"
   }
  },
  {
   "t": "27:12",
   "cap": "cap-03",
   "capability": "Top referrers/pages/…",
   "task": "Trial 2: Overview metric panels",
   "route": "browser",
   "documented": true,
   "trial": 2,
   "result": "done",
   "verified": true,
   "evidence": "5x GET /api/websites/{id}/metrics 200 []",
   "quality": {
    "docs_match": "match",
    "docs_url": "https://docs.umami.is/docs/api-reference/get-website-metrics",
    "verify_route": "yes"
   }
  },
  {
   "t": "27:12",
   "cap": "cap-04",
   "capability": "Realtime",
   "task": "Trial 2: Realtime screen",
   "route": "browser",
   "documented": true,
   "trial": 2,
   "result": "done",
   "verified": true,
   "evidence": "GET /api/realtime/{id} 200 totals 0; /active {\"visitors\":0}",
   "quality": {
    "docs_match": "match",
    "docs_url": "https://docs.umami.is/docs/api-reference/get-realtime",
    "verify_route": "yes"
   }
  },
  {
   "t": "27:12",
   "cap": "cap-10",
   "capability": "Define a goal",
   "task": "Trial 2: create goal, read back, delete",
   "route": "browser",
   "documented": true,
   "trial": 2,
   "result": "done",
   "verified": true,
   "evidence": "POST …/goals 200 id 7048199d…; reload GET …/goals lists it; DELETE …/goals/7048199d… {\"ok\":true}; GET …/goals -> count 0",
   "quality": {
    "docs_match": "match",
    "docs_url": "https://docs.umami.is/docs/goals",
    "verify_route": "yes"
   }
  },
  {
   "t": "27:13",
   "cap": "cap-09",
   "capability": "Build a funnel",
   "task": "Trial 2: create funnel, read back, delete",
   "route": "browser",
   "documented": true,
   "trial": 2,
   "result": "done",
   "verified": true,
   "evidence": "POST …/funnels 200 id cdb7a773…; reload lists it; DELETE …/funnels/cdb7a773… {\"ok\":true}; GET …/funnels -> count 0",
   "quality": {
    "docs_match": "match",
    "docs_url": "https://docs.umami.is/docs/funnel",
    "verify_route": "yes"
   }
  },
  {
   "t": "27:13",
   "cap": "cap-01",
   "capability": "View pageviews, visitors, visits",
   "task": "Trial 3: Overview stats on fresh website b56e693c",
   "route": "browser",
   "documented": true,
   "trial": 3,
   "result": "done",
   "verified": true,
   "evidence": "GET /api/websites/{id}/stats 200 {\"pageviews\":0,\"visitors\":0,...}",
   "quality": {
    "docs_match": "match",
    "docs_url": "https://docs.umami.is/docs/api-reference/get-website-stats",
    "verify_route": "yes"
   }
  },
  {
   "t": "27:13",
   "cap": "cap-03",
   "capability": "Top referrers/pages/…",
   "task": "Trial 3: Overview metric panels",
   "route": "browser",
   "documented": true,
   "trial": 3,
   "result": "done",
   "verified": true,
   "evidence": "5x GET /api/websites/{id}/metrics 200 []",
   "quality": {
    "docs_match": "match",
    "docs_url": "https://docs.umami.is/docs/api-reference/get-website-metrics",
    "verify_route": "yes"
   }
  },
  {
   "t": "27:13",
   "cap": "cap-04",
   "capability": "Realtime",
   "task": "Trial 3: Realtime screen",
   "route": "browser",
   "documented": true,
   "trial": 3,
   "result": "done",
   "verified": true,
   "evidence": "GET /api/realtime/{id} 200 totals 0; /active {\"visitors\":0} (rechecked in its own page load)",
   "quality": {
    "docs_match": "match",
    "docs_url": "https://docs.umami.is/docs/api-reference/get-realtime",
    "verify_route": "yes"
   }
  },
  {
   "t": "27:13",
   "cap": "cap-10",
   "capability": "Define a goal",
   "task": "Trial 3: create goal, read back, delete",
   "route": "browser",
   "documented": true,
   "trial": 3,
   "result": "done",
   "verified": true,
   "evidence": "POST …/goals 200 id 5432b19e…; reload GET …/goals lists it; DELETE …/goals/5432b19e… {\"ok\":true}; GET …/goals -> count 0",
   "quality": {
    "docs_match": "match",
    "docs_url": "https://docs.umami.is/docs/goals",
    "verify_route": "yes"
   }
  },
  {
   "t": "27:13",
   "cap": "cap-09",
   "capability": "Build a funnel",
   "task": "Trial 3: create funnel, read back, delete",
   "route": "browser",
   "documented": true,
   "trial": 3,
   "result": "done",
   "verified": true,
   "evidence": "POST …/funnels 200 id 1abce95d…; reload lists it; DELETE …/funnels/1abce95d… {\"ok\":true}; GET …/funnels -> count 0",
   "quality": {
    "docs_match": "match",
    "docs_url": "https://docs.umami.is/docs/funnel",
    "verify_route": "yes"
   }
  },
  {
   "t": "27:23",
   "cap": "cancel",
   "capability": "cancel plan",
   "task": "Cancel a started plan",
   "route": "none",
   "documented": true,
   "verified": false,
   "result": "skipped",
   "evidence": "not tested: no plan or trial was started (Hobby free plan; the Pro trial goes through checkout.stripe.com, which robots.txt disallows for our agent). docs/cloud/subscription: \"Navigate to Billing and click on the Manage plan button. You will be sent to the Stripe billing portal where you can ... Cancel your plan\". docs/cloud/delete-account: \"If you have a paid subscription, it will be cancelled.\""
  },
  {
   "t": "28:10",
   "cap": "delete",
   "capability": "delete account",
   "task": "Settings > Account > Delete account (type DELETE), then try to log in",
   "route": "browser",
   "documented": true,
   "verified": true,
   "result": "done",
   "evidence": "Login again with same email/password -> 401 {\"message\":\"Invalid email or password\",\"code\":\"INVALID_EMAIL_OR_PASSWORD\"}. Short link /q/o9r86YJwQ afterwards -> HTTP 302.",
   "quality": {
    "docs_match": "match",
    "docs_url": "https://docs.umami.is/docs/cloud/delete-account"
   },
   "notes": "web UI only; no documented API route for account deletion on Cloud (delete-user API excludes self and /users is not allowed with Cloud keys)"
  },
  {
   "t": "28:21",
   "cap": "delete",
   "capability": "",
   "task": "Open our short link and pixel after the account delete",
   "route": "api",
   "documented": true,
   "verified": true,
   "result": "partial",
   "evidence": "GET /p/0UJzHAvGY -> 200 image/gif.",
   "notes": "account login refused; link/pixel redirect still served (may be a cache that expires later; not re-checked)"
  }
 ],
 "stale": false,
 "icon": "/logos/umami.png",
 "monitored": false,
 "verdict": "Gets in on its own: L3 · Does the work. Our agent signs up for Umami Cloud without a bot check and reaches the dashboard unaided. It stopped at Settings > API keys, which answers \"API access requires a Pro plan.\" The documented send endpoint took hits with no key, but dropped them as bot traffic, leaving every report empty. In the browser it added a website, set goals and funnels, made shares and links, then deleted the account: login after that returned invalid-credentials, though a short link still redirected minutes later. Upgrading redirects to Stripe's checkout, which robots.txt keeps our agent off, so whether the trial needs a card is unknown.",
 "page": "https://agentdrives.com/tools/umami?via=api"
}