{
 "slug": "anchorbrowser",
 "name": "Anchor Browser",
 "url": "https://anchorbrowser.io",
 "domain": "anchorbrowser.io",
 "category": "browser-infrastructure",
 "category_name": "Browser infrastructure",
 "tested_at": "2026-10-05",
 "run": "20261005T233837Z",
 "draft": false,
 "reviewed": true,
 "owner_verified": null,
 "origin": "editorial",
 "history": [
  {
   "run": "20261005T233837Z",
   "date": "2026-10-05",
   "level": 4,
   "engine": {
    "runner": "omp",
    "model": "claude-opus-5-5",
    "driver": 2,
    "signed": true,
    "inbox": null,
    "robots": "start"
   }
  }
 ],
 "level": 4,
 "level_name": "Runs on its own",
 "level_selfhost": null,
 "entry": "self-start",
 "door": {
  "passed": 1,
  "tries": 1,
  "self_start": true
 },
 "badges": [],
 "stages": [
  {
   "key": "in",
   "label": "Access",
   "state": "yes",
   "text": "Gets in on its own: key by API"
  },
  {
   "key": "work",
   "label": "Use",
   "state": "yes",
   "text": "Work done: 90% of the core"
  },
  {
   "key": "pay",
   "label": "Pay",
   "state": "unreached",
   "text": "Payment not reached",
   "value": "unreached",
   "route": "card_checkout"
  },
  {
   "key": "leave",
   "label": "Leave",
   "state": "yes",
   "text": "Nothing to cancel; can't delete what it made",
   "at": "delete",
   "how": "no-account",
   "left": "stuck"
  }
 ],
 "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: key by API",
   "stage": "in"
  },
  {
   "key": "use",
   "label": "Use",
   "state": "yes",
   "text": "Work done: 90% of the core",
   "stage": "work"
  },
  {
   "key": "pay",
   "label": "Pay",
   "state": "unreached",
   "text": "Payment not reached",
   "value": "unreached",
   "route": "card_checkout",
   "stage": "pay"
  },
  {
   "key": "leave",
   "label": "Leave",
   "state": "yes",
   "text": "Nothing to cancel; can't delete what it made",
   "at": "delete",
   "how": "no-account",
   "left": "stuck",
   "stage": "leave"
  }
 ],
 "access": [
  {
   "key": "key_by_api",
   "label": "Key by API",
   "routes": [],
   "minutes": 0.7,
   "core": "9/10"
  }
 ],
 "minutes": 0.7,
 "next": {
  "to": 5,
  "text": "Next: pay without a person"
 },
 "stop": "delete",
 "core": "9/10",
 "scores": {
  "coverage": 75,
  "reliability": 88,
  "resilience": null,
  "setup": 100,
  "surface_coverage": null,
  "docs_accuracy": null,
  "docs_completeness": null
 },
 "parts": {
  "holds_up": null,
  "docs_match": null,
  "setup": 100,
  "security": null,
  "standards": [
   {
    "standard": "MCP",
    "state": "behind",
    "behind": 1,
    "value": "2025-11-25"
   },
   {
    "standard": "MCP discovery",
    "state": "behind",
    "behind": null,
    "value": "legacy"
   },
   {
    "standard": "MCP client registration",
    "state": "behind",
    "behind": null,
    "value": "dcr"
   },
   {
    "standard": "OpenAPI",
    "state": "behind",
    "behind": 1,
    "value": "3.1.0"
   },
   {
    "standard": "A2A",
    "state": "behind",
    "behind": 1,
    "value": "0.3"
   }
  ]
 },
 "reliability_method": "first-try",
 "resilience": null,
 "stress": [],
 "surface_audit": null,
 "coverage_core": 90,
 "after_wall": null,
 "coverage_source": "computed",
 "driver": {
  "version": 2,
  "model": "claude-opus-5-5",
  "profile": "full",
  "assisted": false,
  "handoff": null,
  "prompt_sha": "59d395064c20",
  "kb_version": "2",
  "identity": null
 },
 "methodology": 15,
 "rules_date": "2026-10-15",
 "engine": {
  "runner": "omp",
  "model": "claude-opus-5-5",
  "driver": 2,
  "signed": true,
  "inbox": null,
  "robots": "start"
 },
 "same_level_drives": 1,
 "drives": 1,
 "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": "home",
   "at": "2026-10-12"
  },
  "browser": {
   "state": "in",
   "measured": false
  },
  "our_key": "pending",
  "robots": null,
  "tip": false
 },
 "ladder": {
  "docs": {
   "status": "headless",
   "note": "llms.txt, llms-full.txt, .md pages and an OpenAPI 3.1.0 spec (101 paths, 136 operations) at docs.anchorbrowser.io/openapi.yaml; llms.txt sends agents straight to Agent Access."
  },
  "signup": {
   "status": "n/a",
   "note": "Not needed: the documented Agent Access flow (GET /v1/agent-access/challenge, POST /v1/agent-access) gives an API key with no account. A WorkOS email/Google/Microsoft sign-up exists for the dashboard; we did not use it."
  },
  "verify": {
   "status": "n/a",
   "note": "No email verification needed on the Agent Access route."
  },
  "credentials": {
   "status": "headless",
   "note": "Solved the text reasoning puzzle (fetch the appendix it points to, count tagged entries, multiply) first try; POST /v1/agent-access returned api_key, project_id and 1 free credit. 120 s token TTL. An OIDC identity token would raise it to 5 credits.",
   "via": ""
  },
  "first_call": {
   "status": "headless",
   "note": "GET /v1/billing 200: credits 1, tier monthly_free, max_concurrent_browsers 5."
  },
  "first_action": {
   "status": "headless",
   "note": "POST /v1/sessions created a cloud browser (cdp_url, live_view_url); Playwright connected over CDP and drove it."
  },
  "pay": {
   "status": "",
   "grade": "P1",
   "rails": [
    "web dashboard billing (app.anchorbrowser.io/billing)"
   ],
   "rail_ids": [
    "other"
   ],
   "first_party": false,
   "rail_scope": "none",
   "trial_path": "free tier",
   "note": "No 402 anywhere (paid paths answer 401 without a key), no x402/MPP/UCP, not in x402 Bazaar or mpp.dev, no billing write API (only GET /v1/billing). Upgrading is through the dashboard billing page behind a WorkOS sign-in that an Agent Access project has no login for; session.x402 lets sessions pay third-party sites, not Anchor.",
   "reached": false
  },
  "cancel": {
   "status": "n/a",
   "grade": "n/a",
   "note": "Nothing to cancel: our agent used the free plan.",
   "docs_note": "No plan started (free tier with a 1-credit gift); nothing recurring. No billing write API exists for a later cancel.",
   "nothing": "free_plan"
  },
  "delete": {
   "status": "blocked",
   "note": "Every resource we created was deleted over the API (sessions, identities, applications, profiles, volume, certificate, extension, tasks, webhook, batches). No documented way to delete the Agent Access project or revoke its API key; docs only give support@anchorbrowser.io. Batch records stay listed after DELETE.",
   "left": "stuck",
   "account": false
  }
 },
 "routes": [],
 "checkout": null,
 "docs": null,
 "claims": null,
 "pay_options": {
  "checked": "2026-10-05",
  "source": "drive",
  "options": [],
  "agentic": [],
  "paid": null,
  "exercised": null,
  "detected_grade": null,
  "trial": {
   "no_card": null,
   "card_required": null,
   "free_plan": true
  },
  "owner_fixes": [
   {
    "title": "Accept x402 or MPP on your API",
    "how": "Answer an unpaid call with 402 and a payment challenge, so an agent pays per call or buys credits without an account or a card."
   },
   {
    "title": "List your plans on Stripe Projects",
    "how": "Agents buy a plan with `stripe projects add`, paid with a token under a spend cap the owner sets (projects.dev)."
   }
  ]
 },
 "surfaces": {
  "api": true,
  "openapi": true,
  "cli": false,
  "sdk": true,
  "mcp": "official",
  "llms_txt": true,
  "webhooks": true,
  "sandbox": false
 },
 "surface_notes": {
  "api": "REST, 136 operations; X-RateLimit-* on most routes, draft-11 RateLimit on session-create 429",
  "openapi": "3.1.0; small drift (input_params required but optional; batch configuration required but not marked)",
  "mcp": "official hosted, the older 25 Nov 2025 spec, 25 Playwright tools",
  "llms_txt": "llms.txt + llms-full.txt; Agent Instructions block points to Agent Access",
  "discovery": "docs host cards are Mintlify's docs-search MCP and docs A2A card, not the product; docs robots.txt has Cloudflare 'Content-Signal: ai-train=yes, search=yes, ai-input=yes'"
 },
 "can_do": [
  "Get an API key with no account by solving a short text puzzle over HTTP",
  "Start a cloud browser, drive it with Playwright over CDP, REST goto/mouse/keyboard, or MCP tools, and end it",
  "Run natural-language web tasks synchronously or async and poll for the answer",
  "Generate a reusable Automation Task from a prompt and run it by ID",
  "Create a login identity and start sessions already signed in; re-authenticate it on demand",
  "Persist cookies across sessions with profiles",
  "Take screenshots, PDFs and rendered HTML; list and fetch downloads and recordings",
  "Upload files and extensions into sessions; tag, list and inspect sessions",
  "Register webhooks and see delivery logs; coordinate with wait/signal events",
  "Use geo-targeted residential proxies and batch sessions on the free tier",
  "Read credit balance and usage"
 ],
 "cannot_do": [
  {
   "what": "Pay for or upgrade the plan headless",
   "why": "No payment rail or billing write API; upgrade is in the web dashboard behind sign-in, which an Agent Access project has no login for"
  },
  {
   "what": "Delete the Agent Access project or revoke its key",
   "why": "No documented route; support mail only"
  },
  {
   "what": "Run code snippets in a session or sign requests with Web Bot Auth",
   "why": "Growth plan features (code execution returns 403; Web Bot Auth flag is accepted silently and signs nothing)"
  },
  {
   "what": "Use the MCP server with a client on the 28 Jul 2026 spec",
   "why": "Server is on the older 25 Nov 2025 spec and needs initialize plus Mcp-Session-Id"
  }
 ],
 "blockers": [
  "Pay step: no agent purchase path; dashboard billing only",
  "Delete step: no project/key deletion route"
 ],
 "tips_for_owner": [
  "Add an API route to buy credits",
  "Let agents delete their project and key",
  "Error on plan-gated session flags",
  "Move the MCP server to the 28 Jul 2026 spec",
  "Fix small OpenAPI drift"
 ],
 "tips_for_agents": [
  "Start at GET https://api.anchorbrowser.io/v1/agent-access/challenge: follow `next`, fetch the appendix, POST {token, answer} within 120 s.",
  "Use the cdp_url from POST /v1/sessions as-is (it carries an rt token); GET /v1/sessions/{id} does not return it.",
  "Session creation is limited to 5 per minute on free; the 429 carries RateLimit and Retry-After.",
  "Set provider/model on perform-web-task (e.g. openai gpt-4.1-mini) and max_steps to keep cost down; async status values are uppercase.",
  "MCP needs initialize first (legacy 2025-11-25); its first navigate opens a residential-proxy session that keeps running after anchor_close, so end it with DELETE /v1/sessions/{id}.",
  "Creating an identity also creates an application, and perform-web-task saves a 'Perform Web Task' task: delete those too when cleaning up."
 ],
 "selfhost": null,
 "summary": "Anchor Browser lets an agent in with no account at all: a short text puzzle over HTTP returns an API key, and from there sessions, CDP control, natural-language tasks, saved tasks, managed logins, profiles, files, webhooks and batches all worked headless on the free tier (9 of 10 core capabilities verified). The stops are buying more credits (dashboard only, no payment rail or billing API) and deleting the self-made project; the MCP server is still on the 25 Nov 2025 spec.",
 "wall": "No way for an agent to pay",
 "plan_scope": "free plan (Agent Access, 1 credit)",
 "robots_stop": null,
 "robots": null,
 "plain": null,
 "plan_gated": [
  {
   "capability": "Execute a custom code snippet in a live session",
   "plan": "Growth",
   "evidence": "POST /v1/tools/execute-code 403 'Code execution is not enabled for this team'; pricing: Code Execution Growth/Enterprise"
  },
  {
   "capability": "Cloudflare Web Bot Auth signed identity",
   "plan": "Growth",
   "evidence": "flag accepted, no Signature headers reached httpbin.org/headers; pricing: Cloudflare verified browser agents Growth+"
  }
 ],
 "reply": null,
 "capabilities": [
  {
   "id": "cap-01",
   "group": "Browser Sessions",
   "capability": "Start a cloud browser session and connect over CDP",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "POST /v1/sessions",
    "mcp": "create browser session tool",
    "cli": null,
    "ui": "Playground"
   },
   "check": "GET /v1/sessions/{id} returns the session with cdp_url and status active",
   "source": "https://docs.anchorbrowser.io/api-reference/browser-sessions/start-browser-session; https://docs.anchorbrowser.io/quickstart/create-session"
  },
  {
   "id": "cap-02",
   "group": "Browser Sessions",
   "capability": "End a browser session",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "DELETE /v1/sessions/{sessionId}",
    "mcp": "end session tool",
    "cli": null,
    "ui": "Dashboard sessions list"
   },
   "check": "GET /v1/sessions/{sessionId} returns terminated/not found",
   "source": "https://docs.anchorbrowser.io/api-reference/browser-sessions/end-browser-session"
  },
  {
   "id": "cap-03",
   "group": "Browser Sessions",
   "capability": "List and inspect running/past sessions",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "GET /v1/sessions, GET /v1/sessions/history-page, GET /v1/sessions/{id}",
    "mcp": null,
    "cli": null,
    "ui": "Dashboard sessions list"
   },
   "check": "GET /v1/sessions/history-page returns the created session with status/timestamps",
   "source": "https://docs.anchorbrowser.io/api-reference/browser-sessions/list-sessions-history-page; https://docs.anchorbrowser.io/api-reference/browser-sessions/list-all-sessions-status"
  },
  {
   "id": "cap-04",
   "group": "Browser Sessions",
   "capability": "Run natural-language web tasks (agent navigates/clicks/extracts)",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "POST /v1/tools/perform-web-task",
    "mcp": "perform web task tool",
    "cli": null,
    "ui": "Playground"
   },
   "check": "Response contains result field with extracted answer matching the prompt",
   "source": "https://docs.anchorbrowser.io/agentic-browser-control/ai-task-completion; https://docs.anchorbrowser.io/api-reference/ai-tools/perform-web-task"
  },
  {
   "id": "cap-06",
   "group": "Automation Tasks",
   "capability": "Create a reusable Automation Task from a demonstration or prompt",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "POST /v2/tasks/generate",
    "mcp": null,
    "cli": null,
    "ui": "Tasks builder"
   },
   "check": "GET /v2/tasks/{taskId}/generation-status shows status ready with generated workflow",
   "source": "https://docs.anchorbrowser.io/tasks/creating-a-task; https://docs.anchorbrowser.io/api-reference/tasks/generate-a-task"
  },
  {
   "id": "cap-07",
   "group": "Automation Tasks",
   "capability": "Run a saved Automation Task by ID (sync or async)",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "POST /v2/tasks/{id}/run (and legacy /v1/task endpoints)",
    "mcp": "run task tool",
    "cli": null,
    "ui": "Tasks dashboard"
   },
   "check": "GET task run status endpoint returns completed with output",
   "source": "https://docs.anchorbrowser.io/tasks/run-a-task; https://docs.anchorbrowser.io/api-reference/tasks/run-a-task; https://docs.anchorbrowser.io/advanced/async-automation-tasks"
  },
  {
   "id": "cap-09",
   "group": "Authentication",
   "capability": "Define an Application (target site + login flow) for managed auth",
   "weight": "core",
   "plan": "starter",
   "surfaces": {
    "api": "POST /v1/applications",
    "mcp": null,
    "cli": null,
    "ui": "Dashboard Applications"
   },
   "check": "GET /v1/applications/{id} returns the created application config",
   "source": "https://docs.anchorbrowser.io/essentials/applications; https://docs.anchorbrowser.io/api-reference/applications/create-application"
  },
  {
   "id": "cap-10",
   "group": "Authentication",
   "capability": "Create an Identity (credentials) and attach it to a session for auto sign-in",
   "weight": "core",
   "plan": "starter",
   "surfaces": {
    "api": "POST /v1/identities; session.identities[]",
    "mcp": null,
    "cli": null,
    "ui": "Dashboard Identities"
   },
   "check": "Session started with identities:[{id}] loads the target site already signed in",
   "source": "https://docs.anchorbrowser.io/essentials/authenticated-applications; https://docs.anchorbrowser.io/essentials/managed-authentication"
  },
  {
   "id": "cap-13",
   "group": "Authentication",
   "capability": "Embed end-user sign-in UI (OmniConnect) in your own product",
   "weight": "core",
   "plan": "paid",
   "surfaces": {
    "api": "Create Identity Token endpoint",
    "mcp": null,
    "cli": null,
    "ui": "Embeddable OmniConnect widget"
   },
   "check": "Completed embedded flow creates a new identity retrievable via GET /v1/identities/{id}",
   "source": "https://docs.anchorbrowser.io/essentials/omniconnect; https://docs.anchorbrowser.io/api-reference/applications/create-identity-token"
  },
  {
   "id": "cap-15",
   "group": "Session Control",
   "capability": "Drive the browser via natural language, code (Playwright/Puppeteer CDP), REST, or OS-level input",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "cdp_url; /v1/sessions/{id}/mouse,/keyboard,/clipboard",
    "mcp": "os-level control tools",
    "cli": null,
    "ui": "Embedded live view"
   },
   "check": "Mouse click / type-text call changes page state visible in a subsequent screenshot",
   "source": "https://docs.anchorbrowser.io/essentials/control-a-session; https://docs.anchorbrowser.io/advanced/os-level-control"
  },
  {
   "id": "cap-05",
   "group": "Browser Sessions",
   "capability": "Run a web task asynchronously and poll for status",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "POST /v1/tools/perform-web-task (async), GET .../status",
    "mcp": null,
    "cli": null,
    "ui": null
   },
   "check": "GET status endpoint transitions workflow_id from running to completed with result",
   "source": "https://docs.anchorbrowser.io/agentic-browser-control/async-perform-web-task; https://docs.anchorbrowser.io/api-reference/ai-tools/get-perform-web-task-status"
  },
  {
   "id": "cap-08",
   "group": "Automation Tasks",
   "capability": "Self-healing: agent auto-fixes a task when the target site changes",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Task run view"
   },
   "check": "Task run log shows a self-heal event and subsequent steps succeed instead of failing",
   "source": "https://docs.anchorbrowser.io/advanced/self-healing"
  },
  {
   "id": "cap-11",
   "group": "Authentication",
   "capability": "Re-authenticate / refresh a saved identity on demand",
   "weight": "secondary",
   "plan": "starter",
   "surfaces": {
    "api": "POST /v1/identities/{id}/reauthenticate",
    "mcp": null,
    "cli": null,
    "ui": null
   },
   "check": "GET /v1/identities/{id} shows refreshed profile/authenticated state after call",
   "source": "https://docs.anchorbrowser.io/api-reference/identities/reauthenticate-identity"
  },
  {
   "id": "cap-12",
   "group": "Authentication",
   "capability": "Run a dynamic auth flow interactively (handle login forms/2FA decisions step by step)",
   "weight": "secondary",
   "plan": "starter",
   "surfaces": {
    "api": "POST .../dynamic-auth-flow, GET state, POST resolve-step, POST finalize",
    "mcp": null,
    "cli": null,
    "ui": "Embedded auth UI"
   },
   "check": "Finalize call returns automatable:true and identity is persisted",
   "source": "https://docs.anchorbrowser.io/api-reference/identities/start-dynamic-auth-flow; https://docs.anchorbrowser.io/api-reference/identities/finalize-dynamic-auth-flow"
  },
  {
   "id": "cap-14",
   "group": "Authentication",
   "capability": "Inject MFA/OTP codes (email-based or custom) during login",
   "weight": "secondary",
   "plan": "starter",
   "surfaces": {
    "api": "Email MFA + Signal Event endpoints",
    "mcp": null,
    "cli": null,
    "ui": null
   },
   "check": "Auth flow that previously blocked on OTP proceeds to authenticated after code is signaled",
   "source": "https://docs.anchorbrowser.io/advanced/email-otp; https://docs.anchorbrowser.io/advanced/mfa"
  },
  {
   "id": "cap-16",
   "group": "Session Control",
   "capability": "Pause/resume the AI agent and respond to human-in-the-loop interventions",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "POST .../agent/pause, /resume, /respond-to-human-intervention; GET pending interventions",
    "mcp": null,
    "cli": null,
    "ui": "Live view intervention prompt"
   },
   "check": "GET pending-human-interventions list clears after a response is submitted and agent run continues",
   "source": "https://docs.anchorbrowser.io/agentic-browser-control/human-in-the-loop; https://docs.anchorbrowser.io/api-reference/agentic-capabilities/respond-to-human-intervention"
  },
  {
   "id": "cap-17",
   "group": "Session Control",
   "capability": "Upload files/ZIPs into a session for forms or agent use",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "POST /v1/sessions/{id}/uploads; agent-resources upload",
    "mcp": null,
    "cli": null,
    "ui": null
   },
   "check": "GET agent resources list shows the uploaded file available to the agent",
   "source": "https://docs.anchorbrowser.io/advanced/file-upload; https://docs.anchorbrowser.io/agentic-browser-control/agentic-file-usage"
  },
  {
   "id": "cap-18",
   "group": "Session Control",
   "capability": "Download files produced during a session (incl. real-time P2P download events)",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "GET /v1/sessions/{id}/downloads",
    "mcp": null,
    "cli": null,
    "ui": null
   },
   "check": "GET downloads list returns metadata/URL for a file the agent downloaded on-page",
   "source": "https://docs.anchorbrowser.io/advanced/file-download; https://docs.anchorbrowser.io/advanced/p2p-downloads"
  },
  {
   "id": "cap-19",
   "group": "Session Control",
   "capability": "Execute a custom TypeScript code snippet inside a live session",
   "weight": "secondary",
   "plan": "growth",
   "surfaces": {
    "api": "POST /v1/tools/execute-code-snippet?sessionId=",
    "mcp": "execute code tool",
    "cli": null,
    "ui": null
   },
   "check": "Response returns the snippet's console output/return value",
   "source": "https://docs.anchorbrowser.io/api-reference/tools/execute-code-snippet; https://docs.anchorbrowser.io/tools/execute-code-snippet"
  },
  {
   "id": "cap-20",
   "group": "Session Control",
   "capability": "Capture screenshots, fully-rendered HTML (Web Unlocker), and page PDFs",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "POST /v1/tools/screenshot, /v1/tools/web-unlocker; GET .../pdf",
    "mcp": "screenshot tool",
    "cli": null,
    "ui": null
   },
   "check": "Returned screenshot/PDF binary or HTML body matches the requested page",
   "source": "https://docs.anchorbrowser.io/tools/screenshot-webpage; https://docs.anchorbrowser.io/advanced/web-unlocker"
  },
  {
   "id": "cap-21",
   "group": "Session Control",
   "capability": "Record a session's video and manage recordings",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "session.recording config; pause/resume/list/get/delete recording endpoints",
    "mcp": null,
    "cli": null,
    "ui": "Dashboard session detail"
   },
   "check": "GET /v1/sessions/{id}/recordings returns an MP4 URL downloadable via GET recording endpoint",
   "source": "https://docs.anchorbrowser.io/essentials/recording; https://docs.anchorbrowser.io/api-reference/session-recordings/list-session-recordings"
  },
  {
   "id": "cap-22",
   "group": "Session Control",
   "capability": "Tag sessions with custom labels for filtering/tracking",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "PUT/GET/DELETE /v1/sessions/{id}/tags",
    "mcp": null,
    "cli": null,
    "ui": "Dashboard session filters"
   },
   "check": "GET /v1/sessions/{id}/tags returns the tags just set via PUT",
   "source": "https://docs.anchorbrowser.io/advanced/session-tags; https://docs.anchorbrowser.io/api-reference/browser-sessions/put-session-tags"
  },
  {
   "id": "cap-23",
   "group": "Scale",
   "capability": "Create and manage up to 5,000 browser sessions in one batch",
   "weight": "secondary",
   "plan": "growth",
   "surfaces": {
    "api": "POST /v1/batches, GET status, PATCH update, DELETE, retry-failed",
    "mcp": null,
    "cli": null,
    "ui": "Dashboard batches"
   },
   "check": "GET /v1/batches/{id}/status shows the requested session count progressing to completed",
   "source": "https://docs.anchorbrowser.io/advanced/batch-browser-sessions; https://docs.anchorbrowser.io/api-reference/batch-sessions/create-batch-sessions"
  },
  {
   "id": "cap-24",
   "group": "Scale",
   "capability": "Persist login state across sessions via reusable Profiles",
   "weight": "secondary",
   "plan": "starter",
   "surfaces": {
    "api": "POST/GET/DELETE /v1/profiles",
    "mcp": null,
    "cli": null,
    "ui": null
   },
   "check": "A new session referencing the saved profile loads the site already signed in without re-login",
   "source": "https://docs.anchorbrowser.io/api-reference/profiles/create-profile; https://docs.anchorbrowser.io/quickstart/browser-sessions"
  },
  {
   "id": "cap-25",
   "group": "Network & Stealth",
   "capability": "Route sessions through residential/geo-targeted proxies or a dedicated sticky IP",
   "weight": "secondary",
   "plan": "starter",
   "surfaces": {
    "api": "session.proxy config",
    "mcp": null,
    "cli": null,
    "ui": "Session config"
   },
   "check": "IP-check page loaded in the session reports the configured country/sticky IP",
   "source": "https://docs.anchorbrowser.io/advanced/proxy; https://docs.anchorbrowser.io/advanced/dedicated-sticky-ip"
  },
  {
   "id": "cap-26",
   "group": "Network & Stealth",
   "capability": "Bring your own proxy (HTTP/HTTPS/SOCKS5) or route through Anchor VPN",
   "weight": "secondary",
   "plan": "growth",
   "surfaces": {
    "api": "session.proxy custom config",
    "mcp": null,
    "cli": null,
    "ui": null
   },
   "check": "Session traffic egresses from the supplied proxy/VPN IP, confirmed via IP-check page",
   "source": "https://docs.anchorbrowser.io/advanced/bring-your-own-proxy; https://docs.anchorbrowser.io/advanced/anchor-vpn"
  },
  {
   "id": "cap-27",
   "group": "Network & Stealth",
   "capability": "Enable extra stealth / anti-fingerprinting and automated CAPTCHA solving",
   "weight": "secondary",
   "plan": "starter",
   "surfaces": {
    "api": "session/browser config flags (stealth, captcha solver)",
    "mcp": null,
    "cli": null,
    "ui": "Session config"
   },
   "check": "Session loaded against a bot-detection test site is scored as human / solves a CAPTCHA page",
   "source": "https://docs.anchorbrowser.io/essentials/stealth; https://docs.anchorbrowser.io/advanced/captcha-solving"
  },
  {
   "id": "cap-28",
   "group": "Network & Stealth",
   "capability": "Present a Cloudflare Web-Bot-Auth verified signed-agent identity",
   "weight": "secondary",
   "plan": "growth",
   "surfaces": {
    "api": "session config flag",
    "mcp": null,
    "cli": null,
    "ui": null
   },
   "check": "Cloudflare-protected test page served without a challenge when flag enabled",
   "source": "https://docs.anchorbrowser.io/advanced/cloudflare-web-bot-auth"
  },
  {
   "id": "cap-29",
   "group": "Session Add-ons",
   "capability": "Load custom browser extensions into a session",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "POST /v1/extensions; session.extensions[]",
    "mcp": null,
    "cli": null,
    "ui": null
   },
   "check": "GET /v1/extensions/{id} confirms upload; session started with it shows extension active",
   "source": "https://docs.anchorbrowser.io/advanced/extensions; https://docs.anchorbrowser.io/api-reference/extensions/upload-extension"
  },
  {
   "id": "cap-31",
   "group": "Session Add-ons",
   "capability": "Block ads/trackers and cookie-consent popups automatically",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "session config flags",
    "mcp": null,
    "cli": null,
    "ui": null
   },
   "check": "Page load in the session shows no ad iframes / no cookie banner compared to a plain load",
   "source": "https://docs.anchorbrowser.io/advanced/adblocker; https://docs.anchorbrowser.io/advanced/popup-blocker"
  },
  {
   "id": "cap-32",
   "group": "Session Add-ons",
   "capability": "Automatically mask sensitive data (passwords, cards, PII) in recordings/logs",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": "session config flag",
    "mcp": null,
    "cli": null,
    "ui": null
   },
   "check": "Session recording/log of a page containing a card number shows it redacted",
   "source": "https://docs.anchorbrowser.io/advanced/sensitive-data-masking"
  },
  {
   "id": "cap-34",
   "group": "Integrations",
   "capability": "Pass your own LLM provider API key (BYOK) to power agent runs",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": "task/session config (byok key)",
    "mcp": null,
    "cli": null,
    "ui": null
   },
   "check": "Billing info shows AI step charged at flat BYOK rate instead of tiered model pricing",
   "source": "https://docs.anchorbrowser.io/advanced/bring-your-own-key"
  },
  {
   "id": "cap-37",
   "group": "Integrations",
   "capability": "Receive webhook notifications for task/session/identity lifecycle events",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "POST/GET/PATCH/DELETE /v1/webhooks; rotate-secret",
    "mcp": null,
    "cli": null,
    "ui": "Dashboard webhooks"
   },
   "check": "Triggering a session completion delivers a signed POST to the registered endpoint matching documented event schema",
   "source": "https://docs.anchorbrowser.io/webhooks/overview; https://docs.anchorbrowser.io/api-reference/webhooks/create-webhook"
  },
  {
   "id": "cap-38",
   "group": "Integrations",
   "capability": "Embed the live interactive browser view in your own app",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "live_view_url from session create",
    "mcp": null,
    "cli": null,
    "ui": "Embeddable iframe"
   },
   "check": "Loading live_view_url in an iframe shows the real-time session screen and accepts input",
   "source": "https://docs.anchorbrowser.io/advanced/browser-live-view"
  },
  {
   "id": "cap-30",
   "group": "Session Add-ons",
   "capability": "Install custom CA certificates trusted inside sessions",
   "weight": "peripheral",
   "plan": "free",
   "surfaces": {
    "api": "POST/GET/DELETE /v1/certificates",
    "mcp": null,
    "cli": null,
    "ui": null
   },
   "check": "Session configured with the certificate connects to the internal HTTPS service without a trust error",
   "source": "https://docs.anchorbrowser.io/advanced/ca-certificates"
  },
  {
   "id": "cap-33",
   "group": "Session Add-ons",
   "capability": "Attach persistent Volumes (storage) that follow sessions",
   "weight": "peripheral",
   "plan": "growth",
   "surfaces": {
    "api": "session.volumes config",
    "mcp": null,
    "cli": null,
    "ui": null
   },
   "check": "A file written in one session is still present when a later session mounts the same volume",
   "source": "https://docs.anchorbrowser.io/advanced/volumes"
  },
  {
   "id": "cap-35",
   "group": "Integrations",
   "capability": "Inject secrets from a connected 1Password vault into sessions",
   "weight": "peripheral",
   "plan": "paid",
   "surfaces": {
    "api": "POST /v1/integrations (type 1PASSWORD); session.integrations[]",
    "mcp": null,
    "cli": null,
    "ui": null
   },
   "check": "Session form field is auto-filled with the 1Password-stored secret value",
   "source": "https://docs.anchorbrowser.io/integrations/1password; https://docs.anchorbrowser.io/api-reference/integrations/create-integration"
  },
  {
   "id": "cap-36",
   "group": "Integrations",
   "capability": "Coordinate across sessions/workflows with wait/signal events",
   "weight": "peripheral",
   "plan": "free",
   "surfaces": {
    "api": "POST /v1/events/wait, POST /v1/events/signal",
    "mcp": null,
    "cli": null,
    "ui": null
   },
   "check": "A waiting call unblocks and returns the signaled payload after the signal call",
   "source": "https://docs.anchorbrowser.io/api-reference/event-coordination/wait-for-event; https://docs.anchorbrowser.io/api-reference/event-coordination/signal-event"
  },
  {
   "id": "cap-39",
   "group": "Account",
   "capability": "Get an API key programmatically as an unauthenticated agent (no sign-up)",
   "weight": "peripheral",
   "plan": "free",
   "surfaces": {
    "api": "GET /v1/agent-access/challenge, POST /v1/agent-access",
    "mcp": null,
    "cli": null,
    "ui": null
   },
   "check": "POST /v1/agent-access with solved challenge returns a usable anchor-api-key",
   "source": "https://docs.anchorbrowser.io/quickstart/agent-access; https://docs.anchorbrowser.io/api-reference/agent-access/create-agent-access-project"
  },
  {
   "id": "cap-40",
   "group": "Account",
   "capability": "View credit balance, usage history, and plan/billing limits",
   "weight": "peripheral",
   "plan": "free",
   "surfaces": {
    "api": "GET /v1/billing",
    "mcp": null,
    "cli": null,
    "ui": "Dashboard billing"
   },
   "check": "GET /v1/billing reflects reduced credit balance after running a session/task",
   "source": "https://docs.anchorbrowser.io/api-reference/billing/get-billing-info; https://anchorbrowser.io/pricing"
  }
 ],
 "attempts": [
  {
   "t": "00:04",
   "cap": "docs",
   "capability": "Find docs",
   "task": "Fetch llms.txt and agent-access page",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "https://docs.anchorbrowser.io/llms.txt 200 text/plain; points agents to /quickstart/agent-access; .md pages served",
   "notes": ""
  },
  {
   "t": "00:33",
   "cap": "cap-39",
   "capability": "Get an API key programmatically as an unauthenticated agent",
   "task": "GET /v1/agent-access/challenge, GET appendix, POST /v1/agent-access with answer",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "POST /v1/agent-access 200 -> api_key, project_id 781bef60-…, credits_granted 1; key then used on authenticated calls",
   "notes": "Puzzle is a text reasoning task aimed at agents (follow `next`, fetch appendix, count tagged entries). Solved first try. 120 s token TTL.",
   "quality": {
    "verify_route": "yes",
    "error_legibility": "n/a",
    "docs_match": "match",
    "recoverable": "n/a"
   }
  },
  {
   "t": "00:33",
   "cap": "credentials",
   "capability": "Get API credentials",
   "task": "Agent Access onboarding (no account)",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "api_key returned by POST /v1/agent-access; stored in secrets.env",
   "notes": "Rate limit on POST: x-ratelimit-limit 10"
  },
  {
   "t": "00:41",
   "cap": "first_call",
   "capability": "First authenticated API call",
   "task": "GET /v1/billing",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "200 {\"credits\":1,\"credits_used\":0,\"tier\":\"monthly_free\",\"max_concurrent_browsers\":5,...}",
   "notes": ""
  },
  {
   "t": "00:41",
   "cap": "cap-40",
   "capability": "View credit balance, usage history, and plan/billing limits",
   "task": "GET /v1/billing before usage",
   "route": "api",
   "documented": true,
   "result": "partial",
   "verified": true,
   "evidence": "200 credits 1, credits_used 0, tier monthly_free; recheck after usage",
   "notes": "",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match"
   }
  },
  {
   "t": "01:14",
   "cap": "first_action",
   "capability": "First real action that creates something",
   "task": "POST /v1/sessions (tagged, recording, adblock)",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "200 data.id [id], cdp_url, live_view_url; GET /v1/sessions/[id] status running",
   "notes": ""
  },
  {
   "t": "02:01",
   "cap": "cap-01",
   "capability": "Start a cloud browser session and connect over CDP",
   "task": "Create session, connect Playwright over cdp_url, fill a form",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "POST /v1/sessions 200 id [id]; GET /v1/sessions/{id} status running; playwright-core connectOverCDP(cdp_url) read title 'Example Domain' and filled httpbin form",
   "notes": "",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match"
   }
  },
  {
   "t": "02:01",
   "cap": "cap-15",
   "capability": "Drive the browser via code, REST or OS-level input",
   "task": "REST goto + mouse/click on 'Learn more' + keyboard/type into a field; CDP Playwright",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "POST /goto 200; POST /mouse/click (720,859) then GET /pages url https://www.iana.org/help/example-domains; POST /keyboard/type '12345' then CDP inputValue tel=12345",
   "notes": "Mouse coordinates are screen coordinates matching GET /screenshot (1439x986).",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match"
   }
  },
  {
   "t": "02:11",
   "cap": "cap-22",
   "capability": "Tag sessions with custom labels",
   "task": "PUT tags then GET tags and list sessions",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "PUT /v1/sessions/{id}/tags 200; GET tags {\"tags\":[\"agentdrives-test\",\"drive-2\"]}; GET /v1/sessions shows tags",
   "notes": "",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match"
   }
  },
  {
   "t": "02:11",
   "cap": "cap-03",
   "capability": "List and inspect running/past sessions",
   "task": "GET /v1/sessions, /v1/sessions/{id}, /v1/sessions/history",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "GET /v1/sessions lists our session status running with tags; GET /v1/sessions/history summary total_sessions 1 with pagination",
   "notes": "capability map names /v1/sessions/history-page; the OpenAPI path is /v1/sessions/history",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match"
   }
  },
  {
   "t": "02:30",
   "cap": "cap-20",
   "capability": "Capture screenshots, rendered HTML and PDFs",
   "task": "POST /v1/tools/screenshot, /v1/tools/page-pdf (sessionId) and /v1/tools/fetch/webpage for example.com",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "screenshot 200 1440x900 image of example.com; page-pdf 200 application/pdf 1 page; fetch/webpage 200 HTML ending </body></html>",
   "notes": "Screenshot response is labelled content-type image/png but the bytes are JPEG.",
   "quality": {
    "verify_route": "yes",
    "docs_match": "drift"
   }
  },
  {
   "t": "02:38",
   "cap": "cap-17",
   "capability": "Upload files into a session",
   "task": "POST /v1/sessions/{id}/uploads (multipart text file); GET /agent/files",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "200 \"File saved at /uploads/agentdrives-upload.txt\"; GET /v1/sessions/{id}/agent/files lists agentdrives-upload.txt size 24",
   "notes": "Our ZIP for /agent/files was not built (no zip binary here); listing still shows the session upload.",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match"
   }
  },
  {
   "t": "02:54",
   "cap": "cap-18",
   "capability": "Download files produced during a session",
   "task": "Click an attachment link in the session (CDP), list and fetch it",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "GET /v1/sessions/{id}/downloads count 1 agentdrives.txt size 135; GET file_link returned the JSON body httpbin served",
   "notes": "",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match"
   }
  },
  {
   "t": "03:04",
   "cap": "cap-36",
   "capability": "Coordinate with wait/signal events",
   "task": "POST /v1/events/agentdrives_evt/wait (30 s) in one thread, POST /v1/events/agentdrives_evt with data in another",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "wait call returned 200 {\"data\":{\"hello\":\"agentdrives\"}} after signal returned {\"data\":{\"status\":\"success\"}}",
   "notes": "",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match"
   }
  },
  {
   "t": "03:31",
   "cap": "cap-37",
   "capability": "Receive webhook notifications",
   "task": "POST /v1/webhooks/{id}/test with empty body",
   "route": "api",
   "documented": true,
   "result": "failed",
   "verified": false,
   "evidence": "400 {\"error\":\"[ {code: invalid_value, path:[event_type], message: Invalid option: expected one of task.queued|…}]\"}",
   "notes": "Error names the missing field and allowed values (a raw validation dump inside a string, application/json not problem+json). Fixed on the next call.",
   "quality": {
    "error_legibility": "clear",
    "recoverable": "yes"
   }
  },
  {
   "t": "03:31",
   "cap": "cap-37",
   "capability": "Receive webhook notifications",
   "task": "Create webhook to https://httpbin.org/post, send a test event, read delivery log",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "POST /v1/webhooks 201 (returns secret); POST /test {event_type:session.completed} 202 evt_5769…; GET /v1/webhooks/{id}/events: status succeeded, response_status 200",
   "notes": "We could not inspect the delivered headers/signature (httpbin endpoint is not ours to read).",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match"
   }
  },
  {
   "t": "04:10",
   "cap": "cap-04",
   "capability": "Run natural-language web tasks",
   "task": "perform-web-task: return the H1 text of example.com (gpt-4.1-mini, max_steps 4) in our session",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "200 status success, steps 4, result: page has no H1; cross-checked over CDP: h1 count 0 on example.com (title 'Example Domain')",
   "notes": "Answer was correct; 23 s.",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match"
   }
  },
  {
   "t": "04:29",
   "cap": "cap-05",
   "capability": "Run a web task asynchronously and poll",
   "task": "perform-web-task async:true then poll GET /v1/tools/perform-web-task/{workflowId}/status",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "POST 200 {status:running, workflow_id:140379}; status RUNNING then COMPLETED with result \"The page title of https://example.com is 'Example Domain'.\" (matches CDP title)",
   "notes": "POST reports lowercase 'running', status endpoint uppercase 'RUNNING'/'COMPLETED'.",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match"
   }
  },
  {
   "t": "04:57",
   "cap": "discovery",
   "capability": "MCP discovery",
   "task": "POST server/discover (2026-07-28) to https://api.anchorbrowser.io/mcp, then initialize",
   "route": "mcp",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "no creds: 401 WWW-Authenticate Bearer resource_metadata=https://api.anchorbrowser.io/api/.well-known/oauth-protected-resource; with anchor-api-key: 400 {code:-32000,'Bad Request: Server not initialized'} = legacy; initialize offering 2026-07-28 answered protocolVersion 2025-11-25, serverInfo Playwright 0.0.30, mcp-session-id, SSE reply; tools/list 25 anchor_* tools",
   "notes": "Docs say '24 tools enabled'; live list has 25."
  },
  {
   "t": "05:17",
   "cap": "cap-01",
   "capability": "Start a cloud browser session (MCP)",
   "task": "MCP anchor_navigate example.com, anchor_snapshot, anchor_close",
   "route": "mcp",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "anchor_navigate returned Page Title 'Example Domain' + a11y snapshot; GET /v1/sessions shows a new running session e0b1d99d… created by MCP",
   "notes": "No explicit create-session tool: the first navigate opens a session. anchor_close answered 'No open pages available' and the session stayed status running until ended over REST.",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match"
   }
  },
  {
   "t": "06:02",
   "cap": "cap-06",
   "capability": "Create a reusable Automation Task from a prompt",
   "task": "POST /v2/tasks/generate {taskName agentdrives-title, prompt: open example.com and return the page title}; poll generation-status",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "POST 200 {status generating, taskId 86bdda7b…}; GET /v2/tasks/{id}/generation-status -> status ready, project_state completed after ~1.5 min (a 'demonstration' session ran)",
   "notes": "",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match"
   }
  },
  {
   "t": "06:25",
   "cap": "cap-07",
   "capability": "Run a saved Automation Task by ID",
   "task": "POST /v2/tasks/{id}/run {} then GET /v2/tasks/our records",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "run 200 queued -> status success, result {\"page_title\":\"Example Domain\"} (matches CDP title), session e960cc97…",
   "notes": "OpenAPI marks input_params required; an empty body was accepted.",
   "quality": {
    "verify_route": "yes",
    "docs_match": "drift"
   }
  },
  {
   "t": "06:25",
   "cap": "cap-09",
   "capability": "Define an Application for managed auth",
   "task": "POST /v1/applications {name, source example.com}; GET /v1/applications/{id}",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "201 id d19d4583…, auth_mode dynauth; GET returns it with identity_count 0",
   "notes": "Pricing page lists Authenticated browsers as Starter+, but creating an application worked on the free tier.",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match"
   }
  },
  {
   "t": "06:40",
   "cap": "cap-02",
   "capability": "End a browser session",
   "task": "DELETE /v1/sessions/{id} on the session MCP opened; GET it back",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "DELETE 200 success; GET /v1/sessions/e0b1d99d… status completed, duration 88, credits_used 0.11518",
   "notes": "The MCP-opened session ran with proxy anchor_residential active by default, which made it cost 0.115 credits in 88 s.",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match"
   }
  },
  {
   "t": "08:40",
   "cap": "cap-10",
   "capability": "Create an Identity and attach it to a session for auto sign-in",
   "task": "Identity for the-internet.herokuapp.com/login (public practice creds), session with identities:[id], goto /secure",
   "route": "api",
   "documented": true,
   "result": "failed",
   "verified": false,
   "evidence": "POST /v1/identities 201 status pending; session started; goto /secure -> 500 'VNC API error … net::ERR_ABORTED'; page shows Heroku 'Application error' at /login",
   "notes": "The practice target site itself was down (Heroku Application error), so this says nothing about Anchor; retried on another public practice login.",
   "quality": {
    "error_legibility": "vague",
    "recoverable": "yes"
   }
  },
  {
   "t": "08:40",
   "cap": "cap-10",
   "capability": "Create an Identity and attach it to a session for auto sign-in",
   "task": "Identity for practicetestautomation.com practice login (public demo creds student/Password123), session with identities:[id]",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "POST /v1/identities 201 (pending); POST /v1/sessions with identities 200 in 27 s; GET /pages + CDP: session opens on 'Logged In Successfully | Practice Test Automation'; GET /v1/identities/{id} status active",
   "notes": "Worked on the free tier although pricing lists Authenticated browsers as Starter+.",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match"
   }
  },
  {
   "t": "08:40",
   "cap": "cap-29",
   "capability": "Load custom browser extensions into a session",
   "task": "POST /v1/extensions (MV3 zip setting data-agentdrives on every page), session with browser.extensions:[id]",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "POST /v1/extensions 200 returns parsed manifest; in the new session CDP read document.documentElement data-agentdrives = '1'",
   "notes": "",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match"
   }
  },
  {
   "t": "09:29",
   "cap": "cap-21",
   "capability": "Record a session's video and manage recordings",
   "task": "Session created with recording.active; ended; list recordings and fetch primary",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "GET /v1/sessions/{id}/recordings: 1 item mp4 5926492 bytes, duration 464.7 s; /recordings/primary/fetch 302 to signed artifacts URL, which served video/mp4 (ISO Media MP4)",
   "notes": "",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match"
   }
  },
  {
   "t": "09:29",
   "cap": "cap-38",
   "capability": "Embed the live interactive browser view",
   "task": "GET live_view_url from session create",
   "route": "api",
   "documented": true,
   "result": "partial",
   "verified": false,
   "evidence": "live_view_url https://live.anchorbrowser.io/inspector.html?sessionId=…&rt=… answered 200 text/html 23 kB",
   "notes": "We did not render it in an iframe or send input through it; only that the URL serves the viewer page."
  },
  {
   "t": "09:46",
   "cap": "cap-24",
   "capability": "Persist login state via reusable Profiles",
   "task": "Session A with profile agentdrives-p2 persist:true sets an httpbin cookie; end; session B with the same profile reads cookies",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "GET /v1/profiles/agentdrives-p2 status ready; session B https://httpbin.org/cookies -> {\"cookies\":{\"agentdrives\":\"persisted\"}}",
   "notes": "Pricing lists profiles under paid features in the map (starter); it worked on the free tier.",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match"
   }
  },
  {
   "t": "10:36",
   "cap": "cap-25",
   "capability": "Route sessions through geo-targeted residential proxies",
   "task": "Session with proxy {active, anchor_residential, country_code de}; load ipinfo.io in it",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "ipinfo.io in the session: ip 92.209.211.88, Stuttgart, country DE, AS3209 Vodafone GmbH",
   "notes": "Pricing lists geolocation as Starter+; it worked on the free tier.",
   "quality": {
    "verify_route": "no",
    "docs_match": "match"
   }
  },
  {
   "t": "10:36",
   "cap": "cap-27",
   "capability": "Enable extra stealth and CAPTCHA solving",
   "task": "Session with captcha_solver active (no proxy); session with extra_stealth active",
   "route": "api",
   "documented": true,
   "result": "partial",
   "verified": false,
   "evidence": "captcha_solver: 400 {\"error\":\"browser.captcha_solver: CAPTCHA solving requires an active proxy configuration.\"}; extra_stealth: 200 session created",
   "notes": "Not checked against a bot-detection site (we do not test CAPTCHA bypass). Error was clear.",
   "quality": {
    "error_legibility": "clear",
    "recoverable": "yes"
   }
  },
  {
   "t": "10:36",
   "cap": "cap-28",
   "capability": "Present a Cloudflare Web Bot Auth signed identity",
   "task": "Session with browser.web_bot_auth.active true; load httpbin.org/headers",
   "route": "api",
   "documented": true,
   "result": "plan_gated",
   "verified": false,
   "evidence": "Session created 200 (flag accepted); httpbin saw no Signature/Signature-Input/Signature-Agent headers, UA Chrome/136 macOS. Pricing page: 'Cloudflare verified browser agents' Growth ($2000/month) only",
   "notes": "On the free tier the flag is accepted silently and nothing is signed: no error says it is a Growth feature.",
   "quality": {
    "error_legibility": "silent"
   }
  },
  {
   "t": "10:36",
   "cap": "rate-limit",
   "capability": "Session creation rate limit",
   "task": "6 session creates within a minute (feature probes)",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "5th/6th create: 429 {\"error\":{\"code\":429,\"message\":\"Session creation rate limit exceeded.\"}} with RateLimit: \"5-in-1min\"; r=0; t=16, RateLimit-Policy: \"5-in-1min\"; q=5; w=60, Retry-After: 16",
   "notes": "Draft -11 RateLimit/RateLimit-Policy fields plus Retry-After; matches pricing 'Session creation rate 5 per minute'. Other routes send legacy X-RateLimit-*.",
   "quality": {
    "error_legibility": "clear",
    "recoverable": "yes"
   }
  },
  {
   "t": "11:56",
   "cap": "cap-11",
   "capability": "Re-authenticate a saved identity on demand",
   "task": "POST /v1/identities/{id}/reauthenticate",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "200 {\"auth_status\":\"authenticated\",\"method\":\"task\",\"sessionId\":\"91438dad…\"}; GET /v1/identities/{id} status active",
   "notes": "",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match"
   }
  },
  {
   "t": "11:56",
   "cap": "cap-13",
   "capability": "Embed end-user sign-in UI (OmniConnect)",
   "task": "POST /v1/applications/{id}/tokens to get an identity token for the embed",
   "route": "api",
   "documented": true,
   "result": "partial",
   "verified": false,
   "evidence": "201 {token: JWT (type identity, applicationId), expiresAt +15 min, tokenHash}",
   "notes": "The rest of the flow is an end user signing in through the embedded widget in our own product: a human step we did not do. Token issued on free tier."
  },
  {
   "t": "12:47",
   "cap": "cap-23",
   "capability": "Create and manage batch browser sessions",
   "task": "POST /v1/batch-sessions {count 1, configuration}; GET /v1/batch-sessions/{id}",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "200 batch_id c8b77e42…; GET: completed_requests 1, progress 100% phase ready, session d7e60a44… with cdp_url",
   "notes": "First try without configuration: 400 'configuration: Invalid input: expected object, received undefined' (OpenAPI lists only count as required). Pricing lists batches (map: growth) yet it ran on free.",
   "quality": {
    "verify_route": "yes",
    "docs_match": "drift",
    "error_legibility": "clear"
   }
  },
  {
   "t": "13:35",
   "cap": "cap-33",
   "capability": "Attach persistent Volumes to sessions",
   "task": "POST /v1/volumes; upload+list files; session with browser.volume.id; trigger a download in it; list volume files",
   "route": "api",
   "documented": true,
   "result": "partial",
   "verified": false,
   "evidence": "Volume created 200 state ready; POST files 200, GET files lists agentdrives-upload.txt + 'downloads' dir; session with volume 200, volume last_used_at updated; downloaded file did not appear under downloads (items [])",
   "notes": "We could not show a file written inside a session persisting in the volume; the docs path for that was not clear to us. Created on free tier although the map lists it as growth."
  },
  {
   "t": "13:35",
   "cap": "cap-19",
   "capability": "Execute a custom code snippet in a live session",
   "task": "POST /v1/tools/execute-code?sessionId=… {code}",
   "route": "api",
   "documented": true,
   "result": "plan_gated",
   "verified": false,
   "evidence": "403 {\"code\":403,\"error\":\"Code execution is not enabled for this team\"}; pricing: Code Execution only Growth/Enterprise",
   "notes": "",
   "quality": {
    "error_legibility": "clear"
   }
  },
  {
   "t": "13:35",
   "cap": "cap-30",
   "capability": "Install custom CA certificates",
   "task": "POST /v1/certificates (self-signed AgentDrives Test CA PEM); GET /v1/certificates",
   "route": "api",
   "documented": true,
   "result": "partial",
   "verified": true,
   "evidence": "200 id 37ad33b5…, name agentdrives-ca; listed by GET",
   "notes": "No internal HTTPS service to prove trust inside a session."
  },
  {
   "t": "13:36",
   "cap": "cap-40",
   "capability": "View credit balance and usage",
   "task": "GET /v1/billing after sessions and tasks; GET /v1/sessions/history",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "credits 1 -> 0.40953 with credits_used rising; per-session credits_used on GET /v1/sessions/{id}",
   "notes": "",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match"
   }
  },
  {
   "t": "14:27",
   "cap": "discovery",
   "capability": "Cards, aipref, markdown",
   "task": "Well-known probes on anchorbrowser.io, api., docs.; robots.txt; Accept: text/markdown",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "anchorbrowser.io: ai-catalog/agent-card/agent.json/mcp server-card 404 (HTML), robots.txt 'User-agent: * / Disallow:' no Content-Usage; docs.anchorbrowser.io: /.well-known/mcp/server-card.json 200 JSON (Mintlify docs-search MCP, not the product MCP), /.well-known/agent-card.json 200 JSON protocolVersion 0.3 (docs agent), agent-skills index 200; docs robots.txt 'Content-Signal: ai-train=yes, search=yes, ai-input=yes'; Accept: text/markdown -> text/markdown with Vary: Accept; .md URLs served; api.anchorbrowser.io/mcp/server-card 404",
   "notes": "Mintlify-generated cards describe the docs site, not the browser product."
  },
  {
   "t": "14:27",
   "cap": "pay",
   "capability": "Buy the product the agent way",
   "task": "Unauthenticated calls on API base and paid paths; x402./mpp./agents. subdomains; /.well-known/ucp; x402 Bazaar and mpp.dev registries; docs search",
   "route": "api",
   "documented": true,
   "result": "blocked",
   "verified": true,
   "evidence": "No 402 anywhere: /v1/sessions, /v1/tools/perform-web-task, /v1/billing -> 401 'Unauthorized, please log in.'; x402./mpp./agents. subdomains -> 400 'No query parameters found in the URL' (a wildcard host, not a payment endpoint); /.well-known/ucp 404; Bazaar and mpp.dev list nothing for anchorbrowser; OpenAPI has only GET /v1/billing (no top-up/upgrade); docs: 402 = 'Insufficient credits balance … After topping up', upgrade links to https://app.anchorbrowser.io/billing",
   "notes": "session.x402 lets a browser session pay third-party x402 resources (Amazon Bedrock AgentCore Payments); it is not a way to buy Anchor."
  },
  {
   "t": "21:29",
   "cap": "cap-08",
   "capability": "Self-healing tasks",
   "task": "",
   "route": "none",
   "documented": true,
   "result": "skipped",
   "verified": false,
   "evidence": "Automatic behaviour with no API to trigger; would need a target site that changes. Not attempted.",
   "notes": ""
  },
  {
   "t": "21:29",
   "cap": "cap-12",
   "capability": "Dynamic auth flow step by step",
   "task": "",
   "route": "none",
   "documented": true,
   "result": "skipped",
   "verified": false,
   "evidence": "Not attempted in the time box; identity auto-auth (/11) covered the managed-auth path.",
   "notes": ""
  },
  {
   "t": "21:29",
   "cap": "cap-14",
   "capability": "Inject MFA/OTP codes",
   "task": "",
   "route": "none",
   "documented": true,
   "result": "skipped",
   "verified": false,
   "evidence": "No target login with MFA that we own. Not attempted.",
   "notes": ""
  },
  {
   "t": "21:29",
   "cap": "cap-16",
   "capability": "Human-in-the-loop interventions",
   "task": "",
   "route": "none",
   "documented": true,
   "result": "skipped",
   "verified": false,
   "evidence": "Only GET /v1/sessions/pending-interventions called (200, count 0); no agent run requested an intervention.",
   "notes": ""
  },
  {
   "t": "21:29",
   "cap": "cap-31",
   "capability": "Ad and cookie-banner blocking",
   "task": "",
   "route": "none",
   "documented": true,
   "result": "skipped",
   "verified": false,
   "evidence": "Flags accepted on session create (adblock/popup_blocker active in GET config); no before/after comparison done.",
   "notes": ""
  },
  {
   "t": "21:29",
   "cap": "cap-32",
   "capability": "Sensitive data masking",
   "task": "",
   "route": "none",
   "documented": true,
   "result": "skipped",
   "verified": false,
   "evidence": "Not attempted in the time box (rate limit hit on the probe session; credits low).",
   "notes": ""
  },
  {
   "t": "21:29",
   "cap": "cap-34",
   "capability": "Bring your own LLM key",
   "task": "",
   "route": "none",
   "documented": true,
   "result": "skipped",
   "verified": false,
   "evidence": "We have no LLM provider key to hand over. Not attempted.",
   "notes": ""
  },
  {
   "t": "21:29",
   "cap": "cap-35",
   "capability": "1Password secrets",
   "task": "",
   "route": "none",
   "documented": true,
   "result": "skipped",
   "verified": false,
   "evidence": "We have no 1Password vault. Not attempted.",
   "notes": ""
  },
  {
   "t": "21:29",
   "cap": "delete",
   "capability": "Delete the account and its data",
   "task": "DELETE every created resource; look for a project/API-key/account delete route",
   "route": "api",
   "documented": true,
   "result": "partial",
   "verified": true,
   "evidence": "DELETE 200 for webhook, sessions/all, 2 identities, 3 applications (incl. 2 auto-created by identity creation), 2 profiles, volume, certificate, extension, 7 tasks (6 auto-created 'Perform Web Task'), 2 batches; lists come back empty except batch records (still listed as completed after DELETE). No documented route to delete the Agent Access project or revoke its API key (not in OpenAPI or docs); docs only offer support@anchorbrowser.io.",
   "notes": "Data removable headless; the project and key stay."
  },
  {
   "t": "21:29",
   "cap": "cancel",
   "capability": "Cancel/downgrade plan",
   "task": "",
   "route": "none",
   "documented": true,
   "result": "skipped",
   "verified": false,
   "evidence": "No plan started (free monthly tier, 1 gift credit); nothing recurring to cancel.",
   "notes": ""
  }
 ],
 "stale": false,
 "icon": "/logos/anchorbrowser.png",
 "monitored": false,
 "verdict": "Runs on its own, L4 · Runs on its own: our agent got in with no account, solving a short text puzzle for an API key straight from the docs. It opened a cloud browser session, drove it over CDP, and ran saved tasks, managed logins, profiles, files, webhooks and batches, all on the free tier. Buying more credits needs the dashboard: no payment API or x402 route, so our agent never reached checkout. It deleted sessions, identities, profiles and other resources over the API, though batch records stayed listed after deletion, and found no documented way to remove the project itself or revoke the key.",
 "page": "https://agentdrives.com/tools/anchorbrowser?via=api"
}