{
 "slug": "browserless",
 "name": "Browserless",
 "url": "https://browserless.io",
 "domain": "browserless.io",
 "category": "browser-infrastructure",
 "category_name": "Browser infrastructure",
 "tested_at": "2026-10-06",
 "run": "20261006T000908Z",
 "draft": false,
 "reviewed": true,
 "owner_verified": null,
 "origin": "editorial",
 "history": [
  {
   "run": "20261006T000908Z",
   "date": "2026-10-06",
   "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": [
  "agent-can-leave"
 ],
 "stages": [
  {
   "key": "in",
   "label": "Access",
   "state": "yes",
   "text": "Gets in on its own: sign-up in a browser"
  },
  {
   "key": "work",
   "label": "Use",
   "state": "yes",
   "text": "Work done: 100% of the core"
  },
  {
   "key": "pay",
   "label": "Pay",
   "state": "unreached",
   "text": "Payment not reached",
   "value": "unreached",
   "route": "card_checkout"
  },
  {
   "key": "leave",
   "label": "Leave",
   "state": "yes",
   "text": "Leaves on its own: cancels on its own, deletes its account",
   "left": "deleted"
  }
 ],
 "outcomes": [
  {
   "key": "find",
   "label": "Find",
   "state": "yes",
   "text": "Docs agents can read: llms.txt, an OpenAPI and an MCP server",
   "have": [
    "llms_txt",
    "openapi",
    "mcp"
   ]
  },
  {
   "key": "access",
   "label": "Access",
   "state": "yes",
   "text": "Gets in on its own: sign-up in a browser",
   "stage": "in"
  },
  {
   "key": "use",
   "label": "Use",
   "state": "yes",
   "text": "Work done: 100% of the core",
   "stage": "work"
  },
  {
   "key": "pay",
   "label": "Pay",
   "state": "unreached",
   "text": "Payment not reached",
   "value": "unreached",
   "route": "card_checkout",
   "stage": "pay"
  },
  {
   "key": "leave",
   "label": "Leave",
   "state": "yes",
   "text": "Leaves on its own: cancels on its own, deletes its account",
   "left": "deleted",
   "stage": "leave"
  }
 ],
 "access": [
  {
   "key": "browser_signup",
   "label": "Sign-up in a browser",
   "routes": [],
   "minutes": 14.1,
   "core": "8/8"
  }
 ],
 "minutes": 14.1,
 "next": {
  "to": 5,
  "text": "Next: pay without a person"
 },
 "stop": null,
 "core": "8/8",
 "scores": {
  "coverage": 82,
  "reliability": 82,
  "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": 2,
    "value": "3.0.0"
   }
  ]
 },
 "reliability_method": "first-try",
 "resilience": null,
 "stress": [],
 "surface_audit": null,
 "coverage_core": 100,
 "after_wall": null,
 "coverage_source": "computed",
 "driver": {
  "version": 2,
  "model": "claude-opus-5-5",
  "profile": "full",
  "assisted": false,
  "handoff": null,
  "prompt_sha": "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": "signup",
   "at": "2026-10-12"
  },
  "browser": {
   "state": "in",
   "measured": false
  },
  "our_key": "pending",
  "robots": null,
  "tip": false
 },
 "ladder": {
  "docs": {
   "status": "headless",
   "note": "llms.txt (text/markdown) with agent instructions, llms-full.txt, .md pages, Accept: text/markdown negotiation, OpenAPI 3.0.0 at www.browserless.io/swagger.json"
  },
  "signup": {
   "status": "browser",
   "note": "Web form /signup/email?plan=free: email -> 6-digit OTP -> name/company/ToS. No CAPTCHA met, no card. No signup API, auth.md or device flow."
  },
  "verify": {
   "status": "browser",
   "note": "OTP mail arrived in ~1 min (valid 15 min), read headless from our inbox, typed into the web form"
  },
  "credentials": {
   "status": "browser",
   "note": "API token only on dashboard home (masked until revealed); no key-create API. MCP OAuth (DCR) also needs a browser login.",
   "via": ""
  },
  "first_call": {
   "status": "headless",
   "note": "POST /screenshot?token= 200 image/png"
  },
  "first_action": {
   "status": "headless",
   "note": "POST /session created a persistent session, connected via Puppeteer, DELETE stop URL removed it"
  },
  "pay": {
   "status": "",
   "grade": "P1",
   "rails": [
    "Stripe (dashboard upgrade)"
   ],
   "rail_ids": [
    "stripe-checkout"
   ],
   "first_party": false,
   "rail_scope": "none",
   "trial_path": "free tier",
   "note": "No 402/x402/MPP/L402/UCP; paid routes answer 401. Not in x402 Bazaar or mpp.dev. Upgrade page found (/account/upgrade, Prototyping $35/mo); Continue to Checkout did not open a checkout in our agent's browser. No billing API/CLI.",
   "reached": false
  },
  "cancel": {
   "status": "browser",
   "grade": "X3",
   "note": "Free plan, nothing recurring. Cancel Account is web UI only, behind a 3-question required survey and a confirm step."
  },
  "delete": {
   "status": "browser",
   "note": "Delete Account appears after cancelling; confirmed in web UI; old token then returns 401 Invalid API key. No API/CLI/MCP route.",
   "left": "deleted",
   "account": true
  }
 },
 "routes": [],
 "checkout": null,
 "docs": null,
 "claims": null,
 "pay_options": {
  "checked": "2026-10-06",
  "source": "drive",
  "options": [
   {
    "id": "stripe-checkout",
    "name": "Stripe Checkout",
    "kind": "checkout",
    "first_party": false,
    "lead": false,
    "networks": [],
    "testnet": false
   }
  ],
  "agentic": [],
  "paid": null,
  "exercised": null,
  "detected_grade": null,
  "trial": {
   "no_card": 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": true,
  "sdk": true,
  "mcp": "official",
  "llms_txt": true,
  "webhooks": false,
  "sandbox": false
 },
 "surface_notes": {
  "api": "REST + BrowserQL + CDP WebSocket; token in ?token=",
  "openapi": "3.0.0, 87 paths, no x-payment-info",
  "mcp": "official hosted, the older 25 Nov 2025 spec, 16 tools incl. account/usage/logs/sessions",
  "cli": "@browserless.io/cli for profiles and agent (not exercised)"
 },
 "can_do": [
  "Take screenshots and PDFs of URLs or raw HTML",
  "Get rendered HTML and scrape elements to JSON",
  "Run custom Puppeteer code server-side and get its return value",
  "Script multi-step browser flows (type, click, check, submit) in BrowserQL",
  "Connect Puppeteer to a managed remote Chrome over WebSocket",
  "Run a natural-language browsing task with the Agent Run API and poll the answer",
  "Search the web, map a site's URLs, crawl a site, export a page as zip, run Lighthouse",
  "Use residential proxies by country",
  "Drive a stateful multi-turn browser over MCP and read account plan, usage and per-request logs"
 ],
 "cannot_do": [
  {
   "what": "Sign up and get an API token headless",
   "why": "web form and dashboard only; no registration or key API"
  },
  {
   "what": "Pay for a plan the agent way",
   "why": "no x402/MPP; Stripe checkout in the dashboard only"
  },
  {
   "what": "Restore localStorage/cookies after reconnecting a persistent session",
   "why": "state was empty after reconnect on Free, unlike the docs"
  },
  {
   "what": "Create an authenticated profile",
   "why": "createProfile returned a 404 about a session ID"
  },
  {
   "what": "Cancel or delete the account headless",
   "why": "web UI only, behind a required survey"
  }
 ],
 "blockers": [
  "Sign-up and API token are web UI only"
 ],
 "tips_for_owner": [
  "Let agents get an API token headless",
  "Move MCP to the 28 Jul 2026 spec and CIMD",
  "Add an agent payment rail for units",
  "Fix session state restore on reconnect",
  "Return clear plan-gate errors",
  "Offer cancel and delete via API"
 ],
 "tips_for_agents": [
  "Start with docs.browserless.io/llms.txt; REST APIs with ?token= on production-sfo.browserless.io are the simplest route",
  "/scrape fails the whole request (408) when one selector is missing; BQL returns partial data with per-field errors",
  "The MCP server needs initialize (2025-11-25) and Mcp-Session-Id; browserless_agent's sessionId is in the prose text",
  "Use browserless_logs with the requestId from an error body to debug",
  "The dashboard API key field is masked until you click reveal"
 ],
 "selfhost": {
  "install": {
   "status": "skipped",
   "minutes": 0,
   "note": "no docker in the drive sandbox (official Docker image documented at docs.browserless.io/enterprise/docker/overview)"
  }
 },
 "summary": "With a token, an agent can do nearly everything in Browserless headless: REST, BrowserQL, Puppeteer, the Agent Run API and a 16-tool MCP server all worked on the Free plan and were verified. Sign-up (email OTP, no CAPTCHA), getting the token, and cancel/delete are web UI only, and there is no agent payment rail. Persisted session state did not survive a reconnect, and profile creation failed with an unclear error.",
 "wall": "Sign-up and API token only in web UI",
 "plan_scope": "free plan",
 "robots_stop": null,
 "robots": null,
 "plain": {
  "summary": "Browserless rents out cloud browsers that an AI agent can control to take screenshots, fill forms, scrape pages, and run full automation scripts. Once it had an account and an API key, the agent did almost everything itself without any human help. Creating the account, getting the key, and later cancelling and deleting it needed the web dashboard; the agent did those itself in its browser.",
  "can_do": [
   "Take screenshots and PDFs of any web page",
   "Read the fully loaded content of a page, including JavaScript-rendered parts",
   "Pull specific pieces of data off a page into structured results",
   "Run its own custom browser scripts on Browserless's servers",
   "Fill out and submit web forms automatically",
   "Search the web, map a site's pages, and crawl an entire site",
   "Use residential proxies by country",
   "Run a plain-English browsing task and get a written answer back",
   "Check its own account balance, usage, and error logs"
  ],
  "cannot_do": [
   {
    "what": "Sign up for an account without using the web sign-up form",
    "why": "no automated registration exists, only the dashboard form"
   },
   {
    "what": "Get an API key without opening the dashboard",
    "why": "keys are only shown on the account page"
   },
   {
    "what": "Pay for a paid plan by itself",
    "why": "no agent payment method; the dashboard's Continue to Checkout did not open a checkout"
   },
   {
    "what": "Cancel or delete the account without the web dashboard",
    "why": "no API exists for cancel or delete"
   },
   {
    "what": "Keep saved login data across a restarted browser session",
    "why": "cookies and storage were empty after reconnecting, unlike the docs promised"
   }
  ]
 },
 "plan_gated": [
  {
   "capability": "Record a video of a browser session",
   "plan": "Prototyping",
   "evidence": "browserless_agent record:true -> 'Recording is not supported'; pricing lists 'Access to screen recording' under Prototyping"
  }
 ],
 "reply": null,
 "capabilities": [
  {
   "id": "cap-01",
   "group": "core",
   "capability": "Connect Puppeteer/Playwright/Selenium to a managed remote browser",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "WSS /chromium, /chromium/playwright",
    "mcp": null,
    "cli": null,
    "ui": "dashboard connection URL page"
   },
   "check": "Open a WebSocket to wss://production-sfo.browserless.io/chromium?token=... and drive it via CDP; browser.wsEndpoint connects",
   "source": "https://docs.browserless.io/baas/start; https://docs.browserless.io/baas/quick-start"
  },
  {
   "id": "cap-02",
   "group": "core",
   "capability": "Take a screenshot of a page or raw HTML",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "POST /screenshot",
    "mcp": "browserless_smartscraper (formats: screenshot)",
    "cli": "/browserless:screenshot",
    "ui": null
   },
   "check": "POST /screenshot?token=... with {url} returns image/png|jpeg|webp bytes",
   "source": "https://docs.browserless.io/rest-apis/screenshot-api"
  },
  {
   "id": "cap-03",
   "group": "core",
   "capability": "Generate a PDF from a page or raw HTML",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "POST /pdf",
    "mcp": "browserless_smartscraper (formats: pdf)",
    "cli": "/browserless:pdf",
    "ui": null
   },
   "check": "POST /pdf?token=... with {url} returns application/pdf bytes",
   "source": "https://docs.browserless.io/rest-apis/pdf-api"
  },
  {
   "id": "cap-04",
   "group": "core",
   "capability": "Get fully rendered HTML including JS-generated content",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "POST /content",
    "mcp": "browserless_smartscraper (formats: html)",
    "cli": null,
    "ui": null
   },
   "check": "POST /content?token=... with {url} returns text/html of rendered DOM",
   "source": "https://docs.browserless.io/rest-apis/content"
  },
  {
   "id": "cap-05",
   "group": "core",
   "capability": "Extract structured JSON from a page via CSS selectors",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "POST /scrape",
    "mcp": "browserless_smartscraper",
    "cli": "/browserless:smart-scrape",
    "ui": null
   },
   "check": "POST /scrape?token=... with {url, elements:[{selector}]} returns application/json with matched values",
   "source": "https://docs.browserless.io/rest-apis/scrape; https://docs.browserless.io/rest-apis/smart-scrape"
  },
  {
   "id": "cap-06",
   "group": "core",
   "capability": "Run custom Puppeteer code server-side and get its return value",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "POST /function",
    "mcp": "browserless_function",
    "cli": null,
    "ui": "BaaS Debugger in dashboard"
   },
   "check": "POST /function?token=... with JS code returns {data,type} the function computed",
   "source": "https://docs.browserless.io/rest-apis/function"
  },
  {
   "id": "cap-07",
   "group": "core",
   "capability": "Write declarative BrowserQL (GraphQL) automation scripts",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "POST /chromium/bql",
    "mcp": null,
    "cli": null,
    "ui": "BrowserQL IDE"
   },
   "check": "POST to /chromium/bql with a BQL query returns JSON with each mutation's result field",
   "source": "https://docs.browserless.io/browserql/start; https://docs.browserless.io/browserql/getting-started"
  },
  {
   "id": "cap-08",
   "group": "core",
   "capability": "Run a natural-language task with a managed AI browser agent and get structured JSON back",
   "weight": "core",
   "plan": "paid",
   "surfaces": {
    "api": "POST /agent/run, GET /agent/run/{id}",
    "mcp": "browserless_agent",
    "cli": "/cli/agent",
    "ui": null
   },
   "check": "POST /agent/run with {query} returns {id,status:pending}; poll GET /agent/run/{id} until status succeeded with data.answer populated",
   "source": "https://docs.browserless.io/rest-apis/agent-run; https://docs.browserless.io/mcp/browser-agent"
  },
  {
   "id": "cap-09",
   "group": "secondary",
   "capability": "Bypass bot detection / CAPTCHAs on a page (unblock)",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "POST /unblock",
    "mcp": null,
    "cli": null,
    "ui": null
   },
   "check": "POST /unblock?token=... on a protected URL returns content/cookies/screenshot despite bot-detection, with solve metadata",
   "source": "https://docs.browserless.io/rest-apis/unblock; https://docs.browserless.io/overview/getting-started/bypass-captchas"
  },
  {
   "id": "cap-10",
   "group": "secondary",
   "capability": "Automatically solve CAPTCHAs (reCAPTCHA, Cloudflare, image) mid-session",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "BQL solve mutation",
    "mcp": "browserless_agent (captchas skill)",
    "cli": null,
    "ui": null
   },
   "check": "BQL query with solve(type: recaptcha) returns {found:true, solved:true} in response JSON",
   "source": "https://docs.browserless.io/browserql/bot-detection/solving-captchas; https://docs.browserless.io/baas/bot-detection/captchas"
  },
  {
   "id": "cap-11",
   "group": "secondary",
   "capability": "Route browser traffic through residential or datacenter proxies",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "query params ?proxy=residential|datacenter on REST/BaaS/BQL",
    "mcp": null,
    "cli": null,
    "ui": "BQL IDE session settings"
   },
   "check": "Request with &proxy=residential&proxyCountry=us returns content whose apparent origin IP matches the proxy region",
   "source": "https://docs.browserless.io/rest-apis/proxies; https://docs.browserless.io/browserql/bot-detection/proxies"
  },
  {
   "id": "cap-12",
   "group": "secondary",
   "capability": "Run sessions through a hardened stealth browser route",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "/stealth/bql, stealth query params",
    "mcp": null,
    "cli": null,
    "ui": null
   },
   "check": "Request against /stealth/bql on a fingerprinting test site shows reduced bot-detection signals vs. default route",
   "source": "https://docs.browserless.io/browserql/bot-detection/stealth; https://docs.browserless.io/baas/bot-detection/stealth"
  },
  {
   "id": "cap-13",
   "group": "secondary",
   "capability": "Fill in and submit a web form (type, select, check, click)",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "BQL type/click/select/check mutations",
    "mcp": "browserless_agent",
    "cli": null,
    "ui": null
   },
   "check": "BQL script fills form fields, submits, and a subsequent selector/response check shows the post-submit confirmation state",
   "source": "https://docs.browserless.io/browserql/use-cases/submitting-forms; https://docs.browserless.io/examples/forms"
  },
  {
   "id": "cap-14",
   "group": "secondary",
   "capability": "Search the web and optionally scrape each result page",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "POST /search",
    "mcp": "browserless_search",
    "cli": null,
    "ui": null
   },
   "check": "POST /search?token=... with {query} returns application/json list of results with titles/URLs/snippets",
   "source": "https://docs.browserless.io/rest-apis/search"
  },
  {
   "id": "cap-15",
   "group": "secondary",
   "capability": "Discover all URLs on a site (sitemap/link mapping)",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "POST /map",
    "mcp": "browserless_map",
    "cli": null,
    "ui": null
   },
   "check": "POST /map?token=... with {url} returns application/json array of discovered page URLs",
   "source": "https://docs.browserless.io/rest-apis/map"
  },
  {
   "id": "cap-16",
   "group": "secondary",
   "capability": "Crawl an entire site and scrape every discovered page",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": "POST /crawl",
    "mcp": "browserless_crawl",
    "cli": null,
    "ui": null
   },
   "check": "POST /crawl?token=... returns a crawl job; polling/waiting returns per-page scraped content for every page up to maxDepth/limit",
   "source": "https://docs.browserless.io/rest-apis/crawl"
  },
  {
   "id": "cap-17",
   "group": "secondary",
   "capability": "Export a URL in native format (HTML/PDF/image) or as a zipped offline snapshot with assets",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "POST /export",
    "mcp": "browserless_export",
    "cli": null,
    "ui": null
   },
   "check": "POST /export?token=... with includeResources:true returns a ZIP containing HTML plus linked CSS/JS/images/fonts",
   "source": "https://docs.browserless.io/rest-apis/export"
  },
  {
   "id": "cap-18",
   "group": "secondary",
   "capability": "Trigger and retrieve files that Chrome downloads during a script run",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "POST /download",
    "mcp": "browserless_agent getDownloads",
    "cli": null,
    "ui": null
   },
   "check": "POST /download?token=... with code that triggers a browser download returns the downloaded file bytes matching its content type",
   "source": "https://docs.browserless.io/rest-apis/download; https://docs.browserless.io/baas/features/file-transfers"
  },
  {
   "id": "cap-19",
   "group": "secondary",
   "capability": "Run a Lighthouse performance/accessibility/SEO audit on a URL",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "POST /performance",
    "mcp": "browserless_performance",
    "cli": null,
    "ui": null
   },
   "check": "POST /performance?token=... with {url} returns application/json with scores for performance/accessibility/seo/pwa/best-practices",
   "source": "https://docs.browserless.io/rest-apis/performance"
  },
  {
   "id": "cap-20",
   "group": "secondary",
   "capability": "Create a persistent browser session and reconnect to it across requests",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "Session REST API, BQL reconnect mutation",
    "mcp": null,
    "cli": null,
    "ui": "dashboard Sessions"
   },
   "check": "Create session via Session API, disconnect, reconnect with the returned browserWSEndpoint, and cookies/localStorage from before persist",
   "source": "https://docs.browserless.io/baas/session-management/persisting-state; https://docs.browserless.io/examples/persist-session"
  },
  {
   "id": "cap-21",
   "group": "secondary",
   "capability": "Save a logged-in browser profile and reuse it across sessions",
   "weight": "secondary",
   "plan": "prototyping",
   "surfaces": {
    "api": "createProfile param, profile param",
    "mcp": "browserless_profiles (list); browserless_agent (create/use)",
    "cli": null,
    "ui": "dashboard profiles list"
   },
   "check": "Run a session with createProfile:true after login, then start a new session with profile:<name> and the page loads already authenticated",
   "source": "https://docs.browserless.io/baas/features/authenticated-profiles; https://docs.browserless.io/mcp/account-tools"
  },
  {
   "id": "cap-22",
   "group": "secondary",
   "capability": "Record a video of a browser session",
   "weight": "secondary",
   "plan": "prototyping",
   "surfaces": {
    "api": "CDP screencast start/stop via /function or BaaS",
    "mcp": null,
    "cli": null,
    "ui": "dashboard replay viewer"
   },
   "check": "Start/stop recording during a session; resulting .webm file plays back the captured navigation/clicks",
   "source": "https://docs.browserless.io/baas/monitor-sessions/screen-recording; https://docs.browserless.io/examples/screen-recording"
  },
  {
   "id": "cap-23",
   "group": "secondary",
   "capability": "Record an interactive DOM-based session replay viewable in the dashboard",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "BQL session replay flag; browserless_sessions (replays/replay)",
    "mcp": "browserless_sessions",
    "cli": null,
    "ui": "dashboard session replays"
   },
   "check": "browserless_sessions action:replays lists a recorded session; action:replay with its sessionId returns a self-contained playable rrweb page",
   "source": "https://docs.browserless.io/browserql/session-management/session-replay; https://docs.browserless.io/mcp/account-tools"
  },
  {
   "id": "cap-24",
   "group": "secondary",
   "capability": "Stream a running session to a human via a live, embeddable URL and hand off control (hybrid automation)",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "liveURL BQL/BAP mutation",
    "mcp": null,
    "cli": null,
    "ui": "embeddable iframe live view"
   },
   "check": "Call liveURL mid-session, open returned URL in a browser, and observe the live remote page; pausing script hands control to the viewer until resumed",
   "source": "https://docs.browserless.io/baas/monitor-sessions/hybrid-automation; https://docs.browserless.io/baas/monitor-sessions/embedding-live-url"
  },
  {
   "id": "cap-25",
   "group": "secondary",
   "capability": "Give an AI assistant a stateful, multi-turn browser to navigate and interact with across turns",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": "browserless_agent",
    "cli": "/cli/agent",
    "ui": null
   },
   "check": "Call browserless_agent tool across multiple turns (navigate, click, read) in an MCP client and confirm state (login, page) persists between calls",
   "source": "https://docs.browserless.io/mcp/browser-agent"
  },
  {
   "id": "cap-26",
   "group": "secondary",
   "capability": "Load Chrome browser extensions into a session",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "launch param extensions",
    "mcp": null,
    "cli": null,
    "ui": null
   },
   "check": "Launch a session with an extension id/path param and verify the extension's injected behavior (e.g. ad blocking) is active on a loaded page",
   "source": "https://docs.browserless.io/baas/features/browser-extensions"
  },
  {
   "id": "cap-27",
   "group": "secondary",
   "capability": "Fill login credentials from a 1Password vault without exposing them to the script",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "loadSecret BAP method",
    "mcp": "browserless_sessions (integrations)",
    "cli": null,
    "ui": null
   },
   "check": "Call loadSecret referencing a configured 1Password item; the field is filled on the page while script-side value stays redacted",
   "source": "https://docs.browserless.io/bap/secrets; https://docs.browserless.io/baas/features/1password"
  },
  {
   "id": "cap-28",
   "group": "secondary",
   "capability": "Load site-specific agent skills/recipes for known sites",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": "browserless_skill",
    "cli": null,
    "ui": "Skill Catalog (browserless.io/skills)"
   },
   "check": "Call browserless_skill with site:'ebay.com' and get back a list of ebay.com-specific recipe ids; loading one by id returns its guidance text",
   "source": "https://docs.browserless.io/mcp/rest-api-tools; https://www.browserless.io/skills"
  },
  {
   "id": "cap-29",
   "group": "peripheral",
   "capability": "Read account plan, unit balance, billing period, and API key list",
   "weight": "peripheral",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": "browserless_account",
    "cli": null,
    "ui": "dashboard account/home"
   },
   "check": "browserless_account action:billing returns the current plan name and remaining unit balance matching the dashboard",
   "source": "https://docs.browserless.io/mcp/account-tools"
  },
  {
   "id": "cap-30",
   "group": "peripheral",
   "capability": "View request/unit usage breakdown (success, errors, concurrency, proxy, CAPTCHAs)",
   "weight": "peripheral",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": "browserless_usage",
    "cli": null,
    "ui": "dashboard usage"
   },
   "check": "browserless_usage with timeframe:week returns counts of successes/errors/billed units reconcilable against dashboard usage charts",
   "source": "https://docs.browserless.io/mcp/account-tools"
  },
  {
   "id": "cap-31",
   "group": "peripheral",
   "capability": "Search and filter per-request logs for diagnosing failed runs",
   "weight": "peripheral",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": "browserless_logs",
    "cli": null,
    "ui": "dashboard request logs"
   },
   "check": "browserless_logs with requestId filters to the single matching log entry showing outcome, duration, and failure category",
   "source": "https://docs.browserless.io/mcp/account-tools; https://docs.browserless.io/overview/request-logs"
  },
  {
   "id": "cap-32",
   "group": "peripheral",
   "capability": "Inspect currently running and persistent browser sessions",
   "weight": "peripheral",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": "browserless_sessions (active/persistent)",
    "cli": null,
    "ui": "dashboard sessions"
   },
   "check": "Start a session, then call browserless_sessions action:active and see it listed with matching session id",
   "source": "https://docs.browserless.io/mcp/account-tools"
  },
  {
   "id": "cap-33",
   "group": "peripheral",
   "capability": "Self-host Browserless on own infrastructure via Docker",
   "weight": "peripheral",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": null
   },
   "check": "docker run the published browserless image and confirm it accepts WebSocket/REST connections on the configured local port",
   "source": "https://docs.browserless.io/enterprise/docker/overview; https://www.browserless.io/platform/self-hosted"
  },
  {
   "id": "cap-34",
   "group": "peripheral",
   "capability": "Install a Claude Code plugin exposing Browserless as slash commands",
   "weight": "peripheral",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": "/plugin install browserless@browserless; /browserless:screenshot etc.",
    "ui": null
   },
   "check": "Run /plugin install browserless@browserless in Claude Code, then invoke /browserless:screenshot <url> and receive an image result",
   "source": "https://docs.browserless.io/ai-integrations/claude-code-plugin"
  }
 ],
 "attempts": [
  {
   "t": "00:50",
   "cap": "discovery",
   "capability": "MCP discover",
   "task": "POST server/discover 2026-07-28 to https://mcp.browserless.io/mcp unauthenticated",
   "route": "mcp",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "401 application/json, WWW-Authenticate: Bearer resource_metadata=\"https://mcp.browserless.io/.well-known/oauth-protected-resource\"; JSON-RPC error -32000 No Browserless API token provided",
   "notes": "auth-required; retry with token later",
   "quality": {
    "error_legibility": "clear"
   }
  },
  {
   "t": "00:50",
   "cap": "discovery",
   "capability": "cards and well-known",
   "task": "Probe server-card, ai-catalog, agent-card, PRM, AS metadata, api-catalog, ucp, auth.md, SKILL.md",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "mcp.browserless.io/mcp/server-card 404; www /.well-known/ai-catalog.json 404 html; /.well-known/mcp/server-card.json 200 application/json (schema 2025-09, streamable-http + stdio npx @browserless.io/mcp); agent-card.json & agent.json 404; api-catalog 200 application/linkset+json -> swagger.json; mcp PRM 200 {authorization_servers:[https://mcp.browserless.io]}; mcp AS metadata has registration_endpoint (DCR), no client_id_metadata_document_supported, PKCE S256+plain, iss param supported; www AS metadata issuer data.browserless.io/auth/v1 (no device grant); ucp/auth.md/SKILL.md 404",
   "notes": ""
  },
  {
   "t": "00:50",
   "cap": "discovery",
   "capability": "robots/aipref/markdown/openapi",
   "task": "robots.txt Content-Usage, markdown negotiation, llms.txt, OpenAPI version",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "robots.txt: Content-Signal: search=yes, ai-input=yes, ai-train=no (Cloudflare Content Signals scheme, parses), no aipref Content-Usage line, no Content-Usage header; docs Accept: text/markdown -> content-type text/markdown, vary: Accept-Encoding, Accept; .md URL 200 text/markdown; docs.browserless.io/llms.txt 200 text/markdown (88 KB); www.browserless.io/swagger.json openapi 3.0.0, 87 paths, no x-payment-info",
   "notes": ""
  },
  {
   "t": "04:20",
   "cap": "pay",
   "capability": "pay step probes",
   "task": "Probe 402 rails, well-knowns, registries, pricing",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "Unauthenticated POST production-sfo /screenshot and /chromium/bql -> 401 text/html (no 402, no PAYMENT-REQUIRED, no WWW-Authenticate Payment); x402./mpp./agents.browserless.io resolve (wildcard) but TLS cert does not match -> no service; /.well-known/ucp 404; swagger.json has no x-payment-info; x402 Bazaar and mpp.dev/api/services: no browserless entries; llms-full.txt has 0 mentions of x402/402/machine payments/Stripe Projects; pricing page: Free $0 (1k units, no credit card per sign-up page), Prototyping $25/mo billed annually, Starter, Scale; Switch plans or cancel anytime",
   "notes": "No agent-native rail; paid upgrade via web billing UI"
  },
  {
   "t": "11:47",
   "cap": "docs",
   "capability": "docs",
   "task": "Read llms.txt, markdown docs, OpenAPI",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "docs.browserless.io/llms.txt 200 text/markdown with explicit agent instructions; .md pages; swagger.json 3.0.0",
   "notes": "headless"
  },
  {
   "t": "11:47",
   "cap": "signup",
   "capability": "signup",
   "task": "Sign up for free plan headless",
   "route": "none",
   "documented": false,
   "result": "blocked",
   "verified": false,
   "evidence": "No documented signup API/CLI/agent registration; www /.well-known/oauth-authorization-server lists only authorization_code+refresh_token; sign-up is a web form (/signup/email?plan=free) with email OTP (Supabase-style auth/v1 in JS bundle)",
   "notes": "web form only"
  },
  {
   "t": "11:47",
   "cap": "signup",
   "capability": "signup",
   "task": "Sign up via web form in browser: email -> 6-digit OTP -> name/company/ToS -> Create my account",
   "route": "browser",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "Landed on https://www.browserless.io/account/home showing Units 0 / 1k, Free plan, API Key section",
   "notes": "No CAPTCHA or visible bot check met. OTP resend cooldown (For security purposes, you can only request this after N seconds) and the SPA loses the OTP/profile step on reload, which cost several retries of our own (our pw tool reloads per call). No card asked.",
   "quality": {
    "error_legibility": "clear",
    "recoverable": "yes"
   }
  },
  {
   "t": "11:47",
   "cap": "verify",
   "capability": "verify",
   "task": "Verify email with OTP code from inbox",
   "route": "browser",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "Mail [Action required] Verify your email address from no-reply@browserless.io arrived within ~1 min, 6-digit code, expires in 15 minutes; code accepted in form",
   "notes": "mail read headless; code entered in browser form"
  },
  {
   "t": "11:47",
   "cap": "credentials",
   "capability": "credentials",
   "task": "Copy API token from dashboard home",
   "route": "browser",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "account/home API Key field (password input), 49-char token; saved to secrets.env",
   "notes": "Docs: token only from dashboard; no API to create keys. MCP OAuth exists (DCR at mcp.browserless.io/oauth/register) but needs browser login/consent"
  },
  {
   "t": "14:04",
   "cap": "first_call",
   "capability": "The first call",
   "task": "POST /screenshot with token",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "200 image/png 59156 bytes, PNG 800x600 of example.com (out/shot.png)",
   "notes": "first try with masked dashboard value gave 401 text/plain Invalid API key ... (requestId) - our extraction read the masked field; reveal button gives real token"
  },
  {
   "t": "14:04",
   "cap": "cap-02",
   "capability": "screenshot",
   "task": "Screenshot example.com",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "POST /screenshot 200 image/png 59156 bytes; file reports PNG 800x600",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match"
   }
  },
  {
   "t": "14:04",
   "cap": "cap-03",
   "capability": "pdf",
   "task": "PDF from raw HTML",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "POST /pdf {html} 200 application/pdf 13089 bytes; PDF 1.4, 1 page",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match"
   }
  },
  {
   "t": "14:04",
   "cap": "cap-04",
   "capability": "rendered HTML",
   "task": "Rendered HTML of example.com",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "POST /content 200 text/html 2374 bytes, <title>Example Domain</title>",
   "quality": {
    "docs_match": "match"
   }
  },
  {
   "t": "14:04",
   "cap": "cap-05",
   "capability": "scrape",
   "task": "Extract h1 and links from example.com",
   "route": "api",
   "documented": true,
   "result": "failed",
   "verified": false,
   "evidence": "POST /scrape elements [h1,a] -> 408 application/json {error: Timed out waiting for selector \"h1\" (requestId ...)}",
   "notes": "example.com no longer has an h1 (our selector choice); one missing selector fails the whole request rather than returning partial results",
   "quality": {
    "error_legibility": "clear",
    "recoverable": "yes"
   }
  },
  {
   "t": "14:04",
   "cap": "cap-05",
   "capability": "scrape",
   "task": "Extract title and links from example.com",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "200 application/json data[title].results[0].text=Example Domain; data[a] href https://iana.org/help/example-domains (matches /content HTML)",
   "quality": {
    "docs_match": "match"
   }
  },
  {
   "t": "14:04",
   "cap": "cap-06",
   "capability": "function",
   "task": "Run puppeteer code returning title + links + computed value",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "POST /function application/javascript -> 200 {data:{title:Example Domain,links:[https://iana.org/help/example-domains],sum:42},type:application/json}; earlier attempt with h1 selector returned 400 text/plain with stack trace and requestId",
   "quality": {
    "error_legibility": "clear",
    "recoverable": "yes"
   }
  },
  {
   "t": "14:04",
   "cap": "cap-07",
   "capability": "BQL",
   "task": "BQL goto + text",
   "route": "api",
   "documented": true,
   "result": "partial",
   "verified": true,
   "evidence": "POST /chromium/bql 200 data.goto {status:200,time:862}; h:null with errors[0] Timeout of 30000ms waiting for DOM selector h1 (path [h])",
   "notes": "GraphQL-style partial result with clear per-field error; selector choice ours",
   "quality": {
    "error_legibility": "clear"
   }
  },
  {
   "t": "15:48",
   "cap": "cap-13",
   "capability": "form fill",
   "task": "BQL: type name, pick radio, check box, submit httpbin.org/forms/post, read echoed form",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "POST /chromium/bql 200; result page <pre> shows form {custname: [redacted], size: medium, topping: cheese}",
   "notes": "waitForNavigation returned null after click already navigated (no error); submission to httpbin echo service only",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match"
   }
  },
  {
   "t": "15:48",
   "cap": "cap-07",
   "capability": "BQL",
   "task": "BQL multi-step script with type/click/checkbox/text",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "Same /chromium/bql call: each mutation alias returned {time}, text(pre) returned server-echoed form data",
   "quality": {
    "docs_match": "match"
   }
  },
  {
   "t": "15:48",
   "cap": "cap-14",
   "capability": "search",
   "task": "Search browserless.io docs, 3 results",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "POST /search 200 application/json success:true, data.web 3 results with title/url/description/position; unresponsiveEngines lists brave timeout",
   "quality": {
    "docs_match": "match"
   }
  },
  {
   "t": "15:48",
   "cap": "cap-15",
   "capability": "map",
   "task": "Map URLs of docs.browserless.io (limit 5)",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "POST /map 200 {success:true,links:[docs.browserless.io/search, /, /ai-integrations/agent-browser, ...]} 5 links; example.com returned links:[] (single-page site)",
   "quality": {
    "docs_match": "match"
   }
  },
  {
   "t": "15:49",
   "cap": "cap-17",
   "capability": "export",
   "task": "Export example.com with resources as zip",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "POST /export includeResources:true 200 application/zip 4537 bytes; unzip: index.html (2372) + s.js (1963)",
   "quality": {
    "docs_match": "match"
   }
  },
  {
   "t": "15:49",
   "cap": "cap-19",
   "capability": "lighthouse",
   "task": "Lighthouse audit example.com",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "POST /performance 200 application/json 542 KB; categories performance 1, accessibility 0.96, best-practices 1, seo 0.8, agentic-browsing 1",
   "quality": {
    "docs_match": "match"
   }
  },
  {
   "t": "15:49",
   "cap": "cap-18",
   "capability": "download",
   "task": "Trigger a browser download and get the file",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "POST /download (code clicks a data: link with download attr) 200 text/plain 25 bytes: AgentDrives download test",
   "quality": {
    "docs_match": "match"
   }
  },
  {
   "t": "18:10",
   "cap": "cap-01",
   "capability": "connect puppeteer",
   "task": "puppeteer-core connect to wss://production-sfo.browserless.io/chromium, open example.com",
   "route": "sdk",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "browser.version Chrome/153.0.8010.12; page.title Example Domain",
   "quality": {
    "docs_match": "match"
   }
  },
  {
   "t": "18:10",
   "cap": "first_action",
   "capability": "The first action",
   "task": "Create a persistent browser session (POST /session ttl 180000)",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "POST /session 200 {id,connect,cloudEndpointId,ttl,stop,browserQL}; connected via connect URL; DELETE stop&force=true 200 {success:true, message: Session ... was successfully removed}",
   "notes": "also produced files: PDF, export zip"
  },
  {
   "t": "18:10",
   "cap": "cap-20",
   "capability": "persistent session",
   "task": "Set localStorage + cookie in session, browser.close, reconnect, read back",
   "route": "sdk",
   "documented": true,
   "result": "failed",
   "verified": true,
   "evidence": "Two tries: after reconnect to session.connect and goto https://example.com, localStorage.getItem(ad)=null and document.cookie empty (first try used disconnect, second browser.close as in docs)",
   "notes": "Docs say session data is saved to disk on browser.close and restored on reconnect; not observed on free plan here. Session create/stop worked. GET /sessions 404 (no list route at that path)",
   "quality": {
    "docs_match": "drift",
    "verify_route": "yes"
   }
  },
  {
   "t": "18:10",
   "cap": "cap-24",
   "capability": "liveURL",
   "task": "Get a live view URL mid-session via CDP Browserless.liveURL",
   "route": "sdk",
   "documented": true,
   "result": "partial",
   "verified": false,
   "evidence": "cdp.send(Browserless.liveURL) returned {liveURLId, timeout:30000, liveURL: https://production-sfo.browserless.io/e/...}",
   "notes": "URL not opened in a browser or human handoff not exercised"
  },
  {
   "t": "18:10",
   "cap": "discovery",
   "capability": "MCP version",
   "task": "server/discover with token, then initialize offering 2026-07-28",
   "route": "mcp",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "server/discover with Bearer token -> 400 JSON-RPC -32000 Bad Request: No valid session ID provided (legacy); initialize -> 200 text/event-stream, mcp-session-id header, protocolVersion 2025-11-25, serverInfo browserless-mcp 1.36.0, capabilities tools/resources/prompts/logging/completions",
   "notes": "legacy streamable-http server"
  },
  {
   "t": "18:10",
   "cap": "cap-29",
   "capability": "account",
   "task": "MCP browserless_account billing",
   "route": "mcp",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "Plan Free (cloud-unit-based), period ends 2026-11-06, Remaining 977, Used 13, Included 1000 - matches dashboard 0/1k at start + our calls",
   "quality": {
    "docs_match": "match"
   }
  },
  {
   "t": "18:10",
   "cap": "cap-30",
   "capability": "usage",
   "task": "MCP browserless_usage timeframe day",
   "route": "mcp",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "Used 13 units; Successful 8, Errored 1, peak concurrency 1 - consistent with our REST calls",
   "quality": {
    "docs_match": "match"
   }
  },
  {
   "t": "18:10",
   "cap": "cap-31",
   "capability": "logs",
   "task": "MCP browserless_logs filtered by requestId of the failed /scrape",
   "route": "mcp",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "requestId 5bbe9897... returns 5 entries ending target_error/operation_timeout 30690ms Error: Timed out waiting for selector h1, 2 units - same id as the 408 body",
   "notes": "logs include many warn worker_refused HTTP 429 lines per request",
   "quality": {
    "docs_match": "match"
   }
  },
  {
   "t": "18:10",
   "cap": "cap-32",
   "capability": "active sessions",
   "task": "MCP browserless_sessions action active",
   "route": "mcp",
   "documented": true,
   "result": "partial",
   "verified": false,
   "evidence": "No browsers are running on this account right now (called when no session was open)",
   "notes": "not called while a session was running"
  },
  {
   "t": "18:10",
   "cap": "cap-28",
   "capability": "skills",
   "task": "MCP browserless_skill site ebay.com",
   "route": "mcp",
   "documented": true,
   "result": "partial",
   "verified": false,
   "evidence": "Returned 2 ebay.com recipes (ebay.com/find-a-product-ef49sf, ebay.com/search-products) with load ids; recipe not loaded yet"
  },
  {
   "t": "19:37",
   "cap": "cap-08",
   "capability": "agent run",
   "task": "Agent Run: read the link text on example.com",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "POST /agent/run 200 {id:run_9f7d8e54be18,status:pending}; GET /agent/run/{id} after ~13 s status succeeded, data.answer The link text is Learn more., final_url https://example.com/, 4 units - matches /scrape result (a text Learn more)",
   "notes": "capability map lists it as paid; it ran on the Free plan",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match"
   }
  },
  {
   "t": "19:37",
   "cap": "cap-16",
   "capability": "crawl",
   "task": "Crawl example.com limit 2",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "POST /crawl 200 {success:true,id:crawl_75778f778945,url}; GET /crawl/{id} status completed total 1, data[0] metadata title Example Domain statusCode 200, contentUrl presigned S3 JSON",
   "notes": "ran on Free plan; site has 1 page",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match"
   }
  },
  {
   "t": "19:37",
   "cap": "cap-09",
   "capability": "unblock",
   "task": "POST /unblock content:true",
   "route": "api",
   "documented": true,
   "result": "partial",
   "verified": false,
   "evidence": "200 {browserWSEndpoint:null, content:<html>...Example Domain}",
   "notes": "tried on an unprotected page only; bypass not tested against a protected target (we do not target third-party bot defences)"
  },
  {
   "t": "19:37",
   "cap": "cap-10",
   "capability": "captcha solve",
   "task": "BQL solve(type: recaptcha) on Google public reCAPTCHA demo page",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "POST /chromium/bql 200 data.solve {found:true, solved:true, time:20821}",
   "notes": "Google demo page built for testing; free plan"
  },
  {
   "t": "19:37",
   "cap": "cap-11",
   "capability": "proxy",
   "task": "BQL with proxy=residential&proxyCountry=us, read ipinfo.io/json",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "200; ipinfo shows country US, Comcast residential AS7922 (not a datacenter IP)",
   "quality": {
    "docs_match": "match"
   }
  },
  {
   "t": "19:38",
   "cap": "cap-12",
   "capability": "stealth",
   "task": "Compare /stealth/bql vs /chromium/bql on bot.sannysoft.com",
   "route": "api",
   "documented": true,
   "result": "partial",
   "verified": true,
   "evidence": "Both routes: webdriver missing (passed); UA HeadlessChrome absent in both (Chrome/154 stealth vs Chrome/153 default)",
   "notes": "stealth route works but on this test page no difference vs default was visible"
  },
  {
   "t": "21:00",
   "cap": "cap-25",
   "capability": "multi-turn MCP browser",
   "task": "browserless_agent: turn 1 goto+snapshot keepSessionAlive, turn 2 type name+submit+read result with sessionId, turn 3 close",
   "route": "mcp",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "Turn 1 snapshot 16 elements with refs and sessionId s:a5b7...; browserless_sessions active listed agent sessions; turn 2 text(pre) shows form custname [redacted] from httpbin echo; close -> Browser session closed.",
   "notes": "session handle is only in the prose text, not structuredContent",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match"
   }
  },
  {
   "t": "21:00",
   "cap": "cap-32",
   "capability": "active sessions",
   "task": "browserless_sessions active while agent session kept alive",
   "route": "mcp",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "Active sessions (2): chromium (agent) started 00:29:08 and 00:29:17 - our two kept-alive agent calls; after close only 1 remained",
   "quality": {
    "docs_match": "match"
   }
  },
  {
   "t": "21:00",
   "cap": "cap-28",
   "capability": "skills",
   "task": "Load ebay.com/search-products recipe",
   "route": "mcp",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "browserless_skill {id: ebay.com/search-products} returned SITE SKILL frontmatter (name search-products, title eBay Listing Finder, read-only) and guidance"
  },
  {
   "t": "21:00",
   "cap": "cap-21",
   "capability": "profiles",
   "task": "browserless_agent createProfile {name: ad-test}",
   "route": "mcp",
   "documented": true,
   "result": "failed",
   "verified": false,
   "evidence": "isError: Failed to connect to browser agent (HTTP 404): Session ID \"7a48...\" was not found. (requestId 758fb286...); string form rejected with -32602 expected object",
   "notes": "No plan message; error does not say what to fix. Capability map lists it as Prototyping",
   "quality": {
    "error_legibility": "vague",
    "recoverable": "no"
   }
  },
  {
   "t": "21:00",
   "cap": "cap-22",
   "capability": "video recording",
   "task": "browserless_agent record:true startRecording/goto/stopRecording",
   "route": "mcp",
   "documented": true,
   "result": "plan_gated",
   "verified": true,
   "evidence": "Response: Recording is not supported; pricing page lists Access to screen recording under Prototyping ($25/mo billed annually), not Free",
   "quality": {
    "error_legibility": "vague"
   }
  },
  {
   "t": "27:46",
   "cap": "pay",
   "capability": "pay step checkout",
   "task": "Find upgrade path in dashboard (no payment)",
   "route": "browser",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "account/settings Change Plan -> /account/upgrade: Prototyping $35/mo monthly, Continue to Checkout; app JS references Stripe; clicking Continue to Checkout showed no navigation in our agent's browser; no billing API/CLI in docs; MCP tools browserless_link_connect/link_checkout manage a Stripe Link wallet for checkouts on other sites, not for buying Browserless",
   "notes": "no card entered, nothing paid"
  },
  {
   "t": "27:46",
   "cap": "cancel",
   "capability": "cancel",
   "task": "Cancel account (free plan, nothing recurring)",
   "route": "browser",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "Settings > Cancel Account: required reason combobox, sub-reason radio, a \"When do you expect to need Browserless again?\" month select, then confirm; after reload Undo Cancellation + Delete Account buttons shown",
   "notes": "web UI only; 3-question retention survey before cancel; nothing recurring on Free"
  },
  {
   "t": "27:46",
   "cap": "delete",
   "capability": "delete",
   "task": "Delete account and data",
   "route": "browser",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "Delete Account -> confirm dialog -> logged out; afterwards POST /content with old token 401 Invalid API key; MCP browserless_account isError Could not load account",
   "notes": "web UI only (docs: Cancel Account then Delete Account); no API/CLI; requires cancel first. MCP initialize still accepted the dead token"
  },
  {
   "t": "27:46",
   "cap": "cap-23",
   "capability": "session replay",
   "task": "session replay",
   "route": "none",
   "documented": true,
   "result": "skipped",
   "verified": false,
   "evidence": "",
   "notes": "not reached in time budget"
  },
  {
   "t": "27:46",
   "cap": "cap-26",
   "capability": "extensions",
   "task": "extensions",
   "route": "none",
   "documented": true,
   "result": "skipped",
   "verified": false,
   "evidence": "",
   "notes": "not reached in time budget"
  },
  {
   "t": "27:46",
   "cap": "cap-27",
   "capability": "1Password secrets",
   "task": "1Password secrets",
   "route": "none",
   "documented": true,
   "result": "skipped",
   "verified": false,
   "evidence": "",
   "notes": "needs a 1Password service account we do not have"
  },
  {
   "t": "27:46",
   "cap": "cap-33",
   "capability": "self-host via Docker",
   "task": "self-host via Docker",
   "route": "none",
   "documented": true,
   "result": "skipped",
   "verified": false,
   "evidence": "",
   "notes": "no docker in the drive sandbox"
  },
  {
   "t": "27:46",
   "cap": "cap-34",
   "capability": "Claude Code plugin",
   "task": "Claude Code plugin",
   "route": "none",
   "documented": true,
   "result": "skipped",
   "verified": false,
   "evidence": "",
   "notes": "requires Claude Code plugin install."
  }
 ],
 "stale": false,
 "icon": "/logos/browserless.png",
 "monitored": false,
 "verdict": "Runs on its own, L4 · Runs on its own: our agent signed up, got a token and did the core work without help. No checkpoint stopped it: sign-up took an email code with no bot check, and the token on the dashboard opened REST, BrowserQL, Puppeteer, the Agent Run API and the MCP server, each tried and working on the Free plan. A persisted session did not survive a reconnect, and profile creation failed with an unclear error. Paying needs a card at checkout our agent could not open, and cancelling or deleting the account both run through a web form with a required survey.",
 "page": "https://agentdrives.com/tools/browserless?via=api"
}