{
 "slug": "browse",
 "name": "Browse AI",
 "url": "https://browse.ai",
 "domain": "browse.ai",
 "category": "web-scraping",
 "category_name": "Web scraping",
 "tested_at": "2026-10-06",
 "run": "20261006T000707Z",
 "draft": false,
 "reviewed": true,
 "owner_verified": null,
 "origin": "editorial",
 "history": [
  {
   "run": "20261006T000707Z",
   "date": "2026-10-06",
   "level": 3,
   "engine": {
    "runner": "omp",
    "model": "claude-opus-5-5",
    "driver": 2,
    "signed": true,
    "inbox": null,
    "robots": "start"
   }
  }
 ],
 "level": 3,
 "level_name": "Does the work",
 "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": "part",
   "text": "Work done: 50% of the core"
  },
  {
   "key": "pay",
   "label": "Pay",
   "state": "part",
   "text": "Reaches the checkout: stopped at the card form",
   "value": "ready",
   "route": "card_checkout"
  },
  {
   "key": "leave",
   "label": "Leave",
   "state": "yes",
   "text": "Leaves on its own: nothing to cancel, deletes its account",
   "left": "deleted"
  }
 ],
 "outcomes": [
  {
   "key": "find",
   "label": "Find",
   "state": "part",
   "text": "Some docs agents can read: llms.txt and an OpenAPI",
   "have": [
    "llms_txt",
    "openapi"
   ]
  },
  {
   "key": "access",
   "label": "Access",
   "state": "yes",
   "text": "Gets in on its own: sign-up in a browser",
   "stage": "in"
  },
  {
   "key": "use",
   "label": "Use",
   "state": "part",
   "text": "Work done: 50% of the core",
   "stage": "work"
  },
  {
   "key": "pay",
   "label": "Pay",
   "state": "part",
   "text": "Reaches the checkout: stopped at the card form",
   "value": "ready",
   "route": "card_checkout",
   "stage": "pay"
  },
  {
   "key": "leave",
   "label": "Leave",
   "state": "yes",
   "text": "Leaves on its own: nothing to cancel, deletes its account",
   "left": "deleted",
   "stage": "leave"
  }
 ],
 "access": [
  {
   "key": "browser_signup",
   "label": "Sign-up in a browser",
   "routes": [],
   "minutes": 12.7,
   "core": "5/8"
  }
 ],
 "minutes": 12.7,
 "next": {
  "to": 4,
  "text": "Next: do 80% of the core work (now 50%)"
 },
 "stop": "pay",
 "core": "4/8",
 "scores": {
  "coverage": 40,
  "reliability": 100,
  "resilience": null,
  "setup": 75,
  "surface_coverage": null,
  "docs_accuracy": null,
  "docs_completeness": null
 },
 "parts": {
  "holds_up": null,
  "docs_match": null,
  "setup": 75,
  "security": "private",
  "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"
   }
  ]
 },
 "reliability_method": "first-try",
 "resilience": null,
 "stress": [],
 "surface_audit": null,
 "coverage_core": 50,
 "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": "robots",
   "kind": "signup",
   "at": "2026-10-12"
  },
  "browser": {
   "state": "in",
   "measured": false
  },
  "our_key": "pending",
  "robots": "closed",
  "tip": false
 },
 "ladder": {
  "docs": {
   "status": "headless",
   "note": "docs.browse.ai/api/llms.txt is the full v2 REST reference in Markdown (OpenAPI 3.1.0, 19 operations); help.browse.ai/llms.txt indexes .md help articles."
  },
  "signup": {
   "status": "browser",
   "note": "Auth0 web form at auth.browse.ai (email + password, no CAPTCHA), then a 5-step onboarding questionnaire. No documented headless sign-up."
  },
  "verify": {
   "status": "headless",
   "note": "Verification mail arrived in about a minute; the link and its Continue form worked over plain HTTP (302 to dashboard login). Not required: the dashboard and API key worked before verifying; the profile still said unverified afterwards (mail warns of up to 24 h caching)."
  },
  "credentials": {
   "status": "browser",
   "note": "API key created in Dashboard > API; no API/CLI to create keys.",
   "via": ""
  },
  "first_call": {
   "status": "headless",
   "note": "GET /v2/robots with Bearer key -> 200."
  },
  "first_action": {
   "status": "browser",
   "note": "Robots can only be created in the web UI. Table Studio (AI) built a 'Books List' robot from a URL and a one-line instruction in about 90 s; read back via GET /v2/robots/{id}. Running, monitoring and bulk runs then work headless through the API."
  },
  "pay": {
   "status": "blocked",
   "grade": "P1",
   "rails": [
    "Stripe card form in the dashboard"
   ],
   "rail_ids": [
    "stripe-elements"
   ],
   "first_party": true,
   "rail_scope": "none",
   "trial_path": "free tier",
   "note": "Free plan without a card (60 credits/month, 2 websites). Dashboard > Billing: Select Plan showed a cost breakdown with 'Confirm and pay $228' (not clicked: no card) and an error panel under it; no card form was reached. No 402/x402/MPP, no billing API. Not in the mpp.dev registry or x402 Bazaar."
  },
  "cancel": {
   "status": "n/a",
   "grade": "n/a",
   "note": "Nothing to cancel: our agent used the free plan.",
   "docs_note": "No paid plan started. Help docs describe cancel/pause in the dashboard; no billing API.",
   "nothing": "free_plan"
  },
  "delete": {
   "status": "browser",
   "note": "Profile > 'click here' > type 'delete' > confirm. Account gone: login answers 'Wrong email or password'. Web only; paid plans and workspace owners go through support chat per help article.",
   "left": "deleted",
   "account": true
  }
 },
 "routes": [],
 "checkout": null,
 "docs": null,
 "claims": null,
 "pay_options": {
  "checked": "2026-10-06",
  "source": "drive",
  "options": [
   {
    "id": "stripe-elements",
    "name": "Stripe card form",
    "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": false,
  "sdk": false,
  "mcp": "none",
  "llms_txt": true,
  "webhooks": true,
  "sandbox": false
 },
 "surface_notes": {
  "api": "REST v2, 19 operations: run tasks, monitors, bulk runs, webhooks, cookies; no robot create/delete",
  "openapi": "3.1.0 declared in docs llms.txt; JSON file URL not found; some drift (cookie booleans required, date filter units)",
  "llms_txt": "www, docs and help each have one; API reference fully in Markdown"
 },
 "can_do": [
  "Run a trained robot through the REST API and read back structured rows",
  "Create, change and delete monitors with RRULE schedules on a robot",
  "Bulk-run a robot over a list of URLs and track the bulk run",
  "Filter task history by status, bulk run and date range",
  "Register and delete webhooks for task and export events",
  "Store cookies on a robot via the API"
 ],
 "cannot_do": [
  {
   "what": "Create (train) a robot headless",
   "why": "No API or CLI route creates a robot; training is only in the web UI (Table Studio, Robot Studio, Chrome extension)."
  },
  {
   "what": "Get an API key headless",
   "why": "Keys are created only in Dashboard > API."
  },
  {
   "what": "Follow pagination with an AI-trained robot",
   "why": "Table Studio robot returned only page 1 (20 of 32 rows) with books_limit=25."
  },
  {
   "what": "Delete the account or robots headless",
   "why": "Web UI only."
  }
 ],
 "blockers": [
  "Robot creation is web-UI only",
  "API keys are created in the dashboard only"
 ],
 "tips_for_owner": [
  "Add an API to create and train robots",
  "Let agents create API keys headless",
  "Fix API drift in cookies and filters",
  "Add API routes to delete robots and accounts"
 ],
 "tips_for_agents": [
  "Have a human (or a browser agent) train the robot once in Table Studio; everything after that is clean REST at https://api.browse.ai/v2 with a Bearer key.",
  "Poll GET /v2/robots/{id}/tasks/{taskId}; tasks took about 10-30 s on simple pages.",
  "PATCH /cookies wants a bare array and secure/httpOnly/hostOnly booleans on each cookie.",
  "Task filters fromDate/toDate take Unix seconds; createdAt comes back in milliseconds.",
  "Table Studio robots may not follow pagination; check row counts."
 ],
 "selfhost": null,
 "summary": "Browse AI has a clean, documented REST API for running robots, monitors, bulk runs and webhooks; an agent drives all of that headless once a robot exists. Sign-up, API keys and robot training are web UI only (no CAPTCHA met); the agent did them in its own browser. 4 of 8 core capabilities done and verified; pagination failed, screenshots and change alerts were not tried.",
 "wall": "Robots can only be created in the web UI",
 "plan_scope": "free plan",
 "robots_stop": null,
 "robots": null,
 "plain": {
  "summary": "Browse AI turns web pages into structured data and APIs via trained 'robots.' An agent could run, schedule, bulk-run and get webhooks from an already-trained robot entirely on its own, but had to stop and use the website to sign up, get an API key, and actually train the robot in the first place.",
  "can_do": [
   "Run an already-trained robot and read back the extracted data on its own",
   "Schedule the robot to check a page repeatedly and change the schedule",
   "Run the robot over many web pages at once in one batch",
   "Set up and remove webhook notifications and stored login cookies",
   "Filter past runs by status, date and batch"
  ],
  "cannot_do": [
   {
    "what": "Teach a robot what to extract from a new page",
    "why": "Only the website's point-and-click tool can train a robot."
   },
   {
    "what": "Get an API key without using the website",
    "why": "Keys are only created in the account dashboard."
   },
   {
    "what": "Follow a page's 'next page' links automatically",
    "why": "The AI-trained robot only read the first page of results."
   },
   {
    "what": "Upgrade to a paid plan or cancel one without a human",
    "why": "No card was available and payment is a web dashboard form only."
   }
  ]
 },
 "plan_gated": [],
 "reply": null,
 "capabilities": [
  {
   "id": "cap-01",
   "group": "Extraction",
   "capability": "Train a robot on a webpage with AI (point-and-approve, no code)",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Dashboard new robot / Recorder"
   },
   "check": "GET /robots/{robotId} shows the new robot with its trained extraction fields",
   "source": "https://www.browse.ai/, https://www.browse.ai/extract"
  },
  {
   "id": "cap-02",
   "group": "Extraction",
   "capability": "Run a robot to extract structured data from a page (capture list/text)",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "POST /v2/robots/{robotId}/tasks",
    "mcp": null,
    "cli": null,
    "ui": "Robot detail page > Run"
   },
   "check": "GET /v2/robots/{robotId}/tasks/{taskId} returns capturedLists/capturedTexts with the extracted rows",
   "source": "https://docs.browse.ai/api/, https://www.browse.ai/website-to-api"
  },
  {
   "id": "cap-03",
   "group": "Extraction",
   "capability": "Scrape dynamic/interactive content (logins, forms, dropdowns, pagination, infinite scroll, CAPTCHAs)",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "POST /v2/robots/{robotId}/tasks (inputParameters)",
    "mcp": null,
    "cli": null,
    "ui": "Robot training steps"
   },
   "check": "Task result for a robot trained on a login-gated or paginated page returns rows beyond page 1 / behind auth",
   "source": "https://www.browse.ai/extract, https://www.browse.ai/monitor"
  },
  {
   "id": "cap-04",
   "group": "Extraction",
   "capability": "Capture a full-page or element screenshot",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "POST /v2/robots/{robotId}/tasks",
    "mcp": null,
    "cli": null,
    "ui": "Robot training > capture screenshot"
   },
   "check": "Task result includes a capturedScreenshot URL for the trained screenshot field",
   "source": "https://www.browse.ai/extract"
  },
  {
   "id": "cap-05",
   "group": "Monitoring",
   "capability": "Monitor a webpage for changes on a schedule (minute to monthly, RRULE)",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "POST /v2/robots/{robotId}/monitors",
    "mcp": null,
    "cli": null,
    "ui": "Robot detail > Monitor tab > Create new monitor"
   },
   "check": "GET /v2/robots/{robotId}/monitors/{monitorId} shows schedule and lastRunAt advancing per schedule",
   "source": "https://www.browse.ai/monitor, https://docs.browse.ai/api/"
  },
  {
   "id": "cap-06",
   "group": "Monitoring",
   "capability": "Get alerted with field-level diff when monitored data changes",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "webhook event taskCapturedDataChanged",
    "mcp": null,
    "cli": null,
    "ui": "Monitor notification settings (email)"
   },
   "check": "After a tracked value changes on the source page, the next monitor run's task shows old vs new values and an email/webhook fires",
   "source": "https://www.browse.ai/monitor, https://www.browse.ai/website-to-api"
  },
  {
   "id": "cap-07",
   "group": "Scale",
   "capability": "Bulk-run a robot across up to 50,000 URLs/inputs in one job",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "POST /v2/robots/{robotId}/bulk-runs",
    "mcp": null,
    "cli": null,
    "ui": "Robot detail > Bulk Run"
   },
   "check": "GET /v2/robots/{robotId}/bulk-our records shows totalTasks matching submitted count and tasks completing",
   "source": "https://docs.browse.ai/api/, https://www.browse.ai/website-to-api"
  },
  {
   "id": "cap-08",
   "group": "Integration",
   "capability": "Call a trained robot as a REST API endpoint",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "POST /v2/robots/{robotId}/tasks",
    "mcp": null,
    "cli": null,
    "ui": "API docs link on robot page"
   },
   "check": "Authenticated POST with Bearer API key returns task JSON with extracted fields for a freshly trained robot",
   "source": "https://www.browse.ai/website-to-api, https://docs.browse.ai/api/"
  },
  {
   "id": "cap-09",
   "group": "Monitoring",
   "capability": "Add multiple independent monitors (different URLs/params/schedules) to one robot",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "POST /v2/robots/{robotId}/monitors, PATCH .../monitors/{monitorId}",
    "mcp": null,
    "cli": null,
    "ui": "Robot > Monitor tab > Bulk Monitor"
   },
   "check": "GET /v2/robots/{robotId}/monitors lists 2+ monitors on the same robotId with distinct originUrl/schedule",
   "source": "https://docs.browse.ai/api/, https://www.browse.ai/monitor"
  },
  {
   "id": "cap-10",
   "group": "Integration",
   "capability": "Register webhooks for task/monitor/export events",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "POST /v2/robots/{robotId}/webhooks",
    "mcp": null,
    "cli": null,
    "ui": "Robot > Webhooks tab"
   },
   "check": "GET /v2/robots/{robotId}/webhooks lists the new webhook URL, and it receives a POST on the subscribed event",
   "source": "https://docs.browse.ai/api/"
  },
  {
   "id": "cap-11",
   "group": "Export",
   "capability": "Export captured data as CSV/JSON (table export)",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "tableExportFinishedSuccessfully webhook / table export endpoint",
    "mcp": null,
    "cli": null,
    "ui": "Robot data table > Export"
   },
   "check": "Requested export produces a downloadable CSV/JSON/zip file matching the table's row count",
   "source": "https://www.browse.ai/website-to-api, https://docs.browse.ai/api/"
  },
  {
   "id": "cap-12",
   "group": "Extraction",
   "capability": "Use a prebuilt robot template (250+ sites) instead of training from scratch",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "browse.ai/prebuilt-robots gallery > Use this robot"
   },
   "check": "Selecting a prebuilt template creates a robot in the account pre-configured with that site's fields",
   "source": "https://www.browse.ai/prebuilt-robots"
  },
  {
   "id": "cap-13",
   "group": "Extraction",
   "capability": "Add an AI-written formula column to transform/clean a captured field",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Robot training > Add field > formula column"
   },
   "check": "New formula column appears in task output with a value derived from the plain-language description, not the raw page text",
   "source": "https://www.browse.ai/website-to-api"
  },
  {
   "id": "cap-14",
   "group": "Extraction",
   "capability": "Copy a column schema from an existing robot/table when training a new one",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "New robot setup > Copy columns (schema) from existing table"
   },
   "check": "New robot's columns match the selected source robot's column names/types before any manual edit",
   "source": "https://www.browse.ai/"
  },
  {
   "id": "cap-15",
   "group": "Extraction",
   "capability": "Store and reuse session cookies for authenticated scraping",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "PATCH /v2/robots/{robotId}/cookies",
    "mcp": null,
    "cli": null,
    "ui": "Robot settings > Cookies"
   },
   "check": "After PATCH with a session cookie, a task against a login-walled page succeeds without re-authenticating",
   "source": "https://docs.browse.ai/api/, https://www.browse.ai/extract"
  },
  {
   "id": "cap-16",
   "group": "Operations",
   "capability": "Query and filter task run history (status, bulk run, date range)",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "GET /v2/robots/{robotId}/tasks",
    "mcp": null,
    "cli": null,
    "ui": "Robot detail > Tasks/Runs tab"
   },
   "check": "GET with status/bulkRunId/date filters returns only matching tasks, each with origin field (api/monitor/dashboard/bulk-run)",
   "source": "https://docs.browse.ai/api/, https://www.browse.ai/website-to-api"
  },
  {
   "id": "cap-17",
   "group": "Scale",
   "capability": "Scrape across pages and subpages via workflows/automations (deep scraping)",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Dashboard > Workflows/Automations"
   },
   "check": "A configured workflow visits a list page then each detail subpage, producing one combined dataset across both levels",
   "source": "https://www.browse.ai/, https://www.browse.ai/extract"
  },
  {
   "id": "cap-18",
   "group": "Integration",
   "capability": "Sync captured data to Google Sheets, Airtable, Amazon S3, or via Zapier/Make/Pabbly (7,000+ apps)",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Robot > Integrations tab"
   },
   "check": "Connected Google Sheet/Airtable base receives new rows after the robot's next task completes",
   "source": "https://www.browse.ai/integrations, https://www.browse.ai/monitor"
  },
  {
   "id": "cap-19",
   "group": "Operations",
   "capability": "Check Browse AI platform/infrastructure status",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "GET /v2/status",
    "mcp": null,
    "cli": null,
    "ui": null
   },
   "check": "GET /v2/status returns a current health payload (e.g. operational/degraded)",
   "source": "https://docs.browse.ai/api/"
  },
  {
   "id": "cap-20",
   "group": "Extraction",
   "capability": "Set a geographic proxy location for an extraction run",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "POST /v2/robots/{robotId}/tasks (inputParameters geo)",
    "mcp": null,
    "cli": null,
    "ui": "Robot run form > geo parameter"
   },
   "check": "Two tasks run with different geo input parameters return region-specific content (e.g. different prices/currency) for the same URL",
   "source": "https://www.browse.ai/extract, https://www.browse.ai/"
  },
  {
   "id": "cap-21",
   "group": "Admin",
   "capability": "Invite and manage team users on an account",
   "weight": "peripheral",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Dashboard > Team settings"
   },
   "check": "Invited user appears in the account's user list and can log in with access to shared robots",
   "source": "https://www.browse.ai/pricing"
  },
  {
   "id": "cap-22",
   "group": "Admin",
   "capability": "Manage the number of websites/domains allowed under the plan",
   "weight": "peripheral",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Dashboard > Billing/Plan"
   },
   "check": "Adding a robot on a new domain beyond the plan's included count prompts an add-on charge or blocks creation",
   "source": "https://www.browse.ai/pricing"
  },
  {
   "id": "cap-23",
   "group": "Admin",
   "capability": "Generate and revoke an API key",
   "weight": "peripheral",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Dashboard > API settings"
   },
   "check": "Newly generated key authenticates a GET /v2/robots call; after revoking, the same key returns 401",
   "source": "https://docs.browse.ai/api/"
  },
  {
   "id": "cap-24",
   "group": "Admin",
   "capability": "Book managed/premium data extraction service (enterprise onboarding and custom pipelines)",
   "weight": "peripheral",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "browse.ai/managed-web-scraping > Book a call"
   },
   "check": "Submitting the service contact form produces a confirmation message and a scheduled consultation",
   "source": "https://www.browse.ai/pricing, https://www.browse.ai/managed-web-scraping"
  }
 ],
 "attempts": [
  {
   "t": "01:20",
   "cap": "discovery",
   "capability": "agent discovery",
   "route": "api",
   "documented": true,
   "verified": true,
   "task": "robots.txt + aipref",
   "result": "done",
   "evidence": "GET https://www.browse.ai/robots.txt 200: only 'User-agent: ia_archiver / Disallow: /pricing', Sitemap, Host. No Content-Usage or Content-signal line; no Content-Usage header on www or docs."
  },
  {
   "t": "01:20",
   "cap": "discovery",
   "capability": "agent discovery",
   "route": "api",
   "documented": true,
   "verified": true,
   "task": "llms.txt",
   "result": "done",
   "evidence": "https://www.browse.ai/llms.txt 200 text/plain (H1 'Browse AI - No-code web scraping...'); https://docs.browse.ai/llms.txt links https://docs.browse.ai/api/llms.txt (full v2 API reference in Markdown, 'OpenAPI Version: 3.1.0'); help.browse.ai/llms.txt lists .md articles"
  },
  {
   "t": "01:20",
   "cap": "discovery",
   "capability": "agent discovery",
   "route": "api",
   "documented": true,
   "verified": true,
   "task": "markdown negotiation",
   "result": "partial",
   "evidence": "Accept: text/markdown on https://docs.browse.ai/api/ and www.browse.ai -> text/html, no Vary: Accept. docs.browse.ai/api.md 404. help.browse.ai articles have .md URLs (200, markdown)."
  },
  {
   "t": "01:20",
   "cap": "docs",
   "capability": "agent discovery",
   "route": "api",
   "documented": true,
   "verified": true,
   "task": "find API docs",
   "result": "done",
   "evidence": "docs.browse.ai/api/ (v2 REST, OpenAPI 3.1.0 per llms.txt), 19 operations; no create-robot or delete-robot endpoint; auth by Bearer API key from dashboard.browse.ai/api"
  },
  {
   "t": "01:20",
   "cap": "pay",
   "capability": "agent discovery",
   "route": "api",
   "documented": true,
   "verified": true,
   "task": "402 / agent payment probes",
   "result": "failed",
   "evidence": "x402./mpp./agents.browse.ai do not resolve; api.browse.ai/v2/robots unauthenticated -> 401 JSON {statusCode:401,messageCode:unauthorized}, no 402/PAYMENT-REQUIRED/WWW-Authenticate Payment; /.well-known/ucp 404"
  },
  {
   "t": "01:36",
   "cap": "pay",
   "capability": "agent discovery",
   "route": "api",
   "documented": true,
   "verified": true,
   "task": "registries by domain",
   "result": "failed",
   "evidence": "mpp.dev/api/services: no browse.ai service (only unrelated 'browse' text matches). x402 Bazaar: no browse.ai resource."
  },
  {
   "t": "02:32",
   "cap": "signup",
   "capability": "sign up",
   "task": "create account with test email + password",
   "route": "browser",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "auth.browse.ai/u/signup (Auth0 Universal Login) web form: email+password, no CAPTCHA shown; redirected to dashboard.browse.ai/welcome onboarding",
   "notes": "No documented headless sign-up (API needs a key from the dashboard). Google sign-in also offered."
  },
  {
   "t": "08:17",
   "cap": "verify",
   "capability": "verify email",
   "task": "confirm email via link in verification mail",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": false,
   "evidence": "Mail 'Verify your email' from support@browse.ai arrived in ~1 min; GET ticket link + POST its Continue form (state, action=default) with plain HTTP -> 302 Found to https://dashboard.browse.ai/login. Dashboard was usable before verifying.",
   "notes": "Verification is not required to use the dashboard or create an API key."
  },
  {
   "t": "12:41",
   "cap": "credentials",
   "capability": "get API key",
   "task": "create API key",
   "route": "browser",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "Dashboard > API (dashboard.browse.ai/workspaces/<ws>/api) 'Create API key' with a name; key shown in table (format <uuid>:<uuid>). No API/CLI to create keys; docs: 'Generate your API key' -> dashboard.browse.ai/api."
  },
  {
   "t": "12:41",
   "cap": "first_call",
   "capability": "first API call",
   "task": "GET /v2/robots with Bearer key",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "GET https://api.browse.ai/v2/robots -> 200 {robots:{totalCount:0,items:[]}}",
   "quality": {
    "docs_match": "match"
   }
  },
  {
   "t": "12:41",
   "cap": "cap-19",
   "capability": "Check platform status",
   "task": "GET /v2/status",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "GET /v2/status (with key) -> 200 {statusCode:200,messageCode:success,tasksQueueStatus:OK}; without key -> 401 {statusCode:401,messageCode:unauthorized}",
   "notes": "Docs list no security exception for /status but an unauthenticated status call would be friendlier.",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match",
    "error_legibility": "clear"
   }
  },
  {
   "t": "18:06",
   "cap": "cap-01",
   "capability": "Train a robot on a webpage with AI",
   "task": "Train a robot on books.toscrape.com travel category: title, price, availability, URL",
   "route": "browser",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "Dashboard New robot > Extract > Train robot > Table Studio (Beta): AI built 'Books List' table with 11 rows in ~90 s; Save Robot -> robot [id]. GET /v2/robots/[id] -> 200 name 'Books List', inputParameters originUrl, books_limit (max 5000, default 50).",
   "notes": "No API or CLI route to create a robot; only the web UI (Table Studio / Robot Studio / Chrome extension).",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match"
   }
  },
  {
   "t": "18:06",
   "cap": "first_action",
   "capability": "first real action",
   "task": "create a robot",
   "route": "browser",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "robot [id] created in Table Studio, read back with GET /v2/robots/[id]"
  },
  {
   "t": "18:28",
   "cap": "cap-02",
   "capability": "Run a robot to extract structured data",
   "task": "Run Books List robot via API with books_limit=5 and read the result",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "POST /v2/robots/[id]/tasks -> 200 task [id] in-progress; GET .../tasks/[id] after ~30 s -> status successful, capturedLists.Books has 5 rows (Title, Price, Availability, Book Page URL), first 'It's Only the Himalayas' £45.17",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match",
    "idempotent": "n/a"
   }
  },
  {
   "t": "18:28",
   "cap": "cap-08",
   "capability": "Call a trained robot as a REST API endpoint",
   "task": "Bearer-key POST to run freshly trained robot, get JSON fields",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "same task [id]: JSON with extracted fields returned by GET /v2/robots/[id]/tasks/[id]",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match"
   }
  },
  {
   "t": "18:37",
   "cap": "cap-10",
   "capability": "Register webhooks",
   "task": "Register taskFinished webhook, list it, delete one",
   "route": "api",
   "documented": true,
   "result": "partial",
   "verified": true,
   "evidence": "POST /v2/robots/[id]/webhooks {hookUrl:https://agentdrives.com/hooks/browse-test,eventType:taskFinished} -> 200 webhook [id]; GET .../webhooks lists it; DELETE of a second webhook -> 200.",
   "notes": "Delivery of the POST not verified: we have no webhook receiver. hookUrl 'not a url' was accepted with 200 although the docs list error invalid_hookUrl.",
   "quality": {
    "verify_route": "yes",
    "error_legibility": "silent",
    "docs_match": "drift",
    "recoverable": "yes"
   }
  },
  {
   "t": "18:55",
   "cap": "cap-09",
   "capability": "Multiple monitors on one robot",
   "task": "Create 2 monitors (travel daily, poetry weekly) and change one to hourly",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "POST /v2/robots/[id]/monitors x2 -> 200 [id], [id]; PATCH [id] schedule FREQ=HOURLY -> 200 everyMinutes 60; GET .../monitors lists both with distinct originUrl and schedule",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match"
   }
  },
  {
   "t": "19:17",
   "cap": "cap-15",
   "capability": "Store session cookies",
   "task": "PATCH a session cookie onto the robot",
   "route": "api",
   "documented": true,
   "result": "failed",
   "verified": false,
   "evidence": "PATCH /v2/robots/[id]/cookies with wrong shape {cookies:[...]} -> 500 internal_server_error (should be 400); with documented bare array -> 400 {'statusCode': 400, 'messageCode': 'bad_request', 'errors': [{'name': 'ad_test', 'summary': 'Could not store new cookies', 'fields': [{'field': 'secure', 'message': 'Invalid input: expected boolean, received undefined'}, {'field': 'httpOnly', 'message': 'Invalid input: expected boolean, received undefined'}, {'field': 'hostOnly', 'message': 'Invalid input: expected boolean, received undefined'}]}]}",
   "notes": "No GET route to read cookies back; no login-walled test site of our own to prove reuse.",
   "quality": {
    "verify_route": "no",
    "error_legibility": "vague",
    "docs_match": "match",
    "recoverable": "yes"
   }
  },
  {
   "t": "19:23",
   "cap": "cap-15",
   "capability": "Store session cookies",
   "task": "PATCH a session cookie (retry with secure/httpOnly/hostOnly)",
   "route": "api",
   "documented": true,
   "result": "partial",
   "verified": false,
   "evidence": "bare array without secure/httpOnly/hostOnly -> 400 with field errors 'expected boolean, received undefined' (docs list them as optional: drift); with all three -> 200 {'statusCode': 200, 'messageCode': 'success', 'cookies': [{'name': 'ad_test', 'value': '***', 'domain': 'books.toscrape.com', 'expirationDate': 1822782399, 'path': '/', 'secure': True, 'hostOnly': True, 'httpOnly': False}]}",
   "notes": "No documented route reads cookies back, and we have no login-walled test site, so reuse was not proven.",
   "quality": {
    "verify_route": "no",
    "error_legibility": "clear",
    "docs_match": "drift",
    "recoverable": "yes"
   }
  },
  {
   "t": "19:48",
   "cap": "cap-07",
   "capability": "Bulk-run a robot",
   "task": "Bulk run robot over 2 category URLs",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "POST /v2/robots/[id]/bulk-runs (2 inputParameters) -> 200 bulkRun [id] tasksCount 2; GET .../bulk-our records -> status finished, successfulTasks 2, robotTasks lists both successful",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match"
   }
  },
  {
   "t": "19:48",
   "cap": "cap-03",
   "capability": "Scrape dynamic content (pagination)",
   "task": "Run AI-trained robot on a 32-book, 2-page category with books_limit=25",
   "route": "api",
   "documented": true,
   "result": "failed",
   "verified": true,
   "evidence": "task [id] successful but capturedLists.Books has 20 rows (page 1 only); page 2 not followed although books_limit=25",
   "notes": "Table Studio-trained robot did not learn pagination; Robot Studio (visual) or the Chrome extension may, but those need point-and-click training in a browser. Not tried for time.",
   "quality": {
    "verify_route": "yes",
    "error_legibility": "silent"
   }
  },
  {
   "t": "20:22",
   "cap": "cap-16",
   "capability": "Query and filter task history",
   "task": "Filter tasks by bulk run, status, page size and date range",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "GET /v2/robots/[id]/tasks?robotBulkRunId=[id] -> 2 (both of that run); status=failed -> 0; status=successful&pageSize=2 -> totalCount 6, 2 items, hasMore true; fromDate/toDate in seconds (last hour) -> 6, ms -> 0. Items carry runByAPI, robotBulkRunId, runByTaskMonitorId, runByUserId.",
   "notes": "Docs say 'Unix timestamp' for fromDate/toDate without a unit; filters take seconds while createdAt is returned in milliseconds, and ms values silently return 0.",
   "quality": {
    "verify_route": "yes",
    "docs_match": "drift",
    "error_legibility": "silent"
   }
  },
  {
   "t": "20:22",
   "cap": "cap-05",
   "capability": "Monitor a page on a schedule",
   "task": "Create monitors (daily / weekly RRULE), change one to hourly, see first check run",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "POST /v2/robots/[id]/monitors -> active, schedule FREQ=DAILY;INTERVAL=1 (everyMinutes 1440); PATCH to FREQ=HOURLY (60); monitor [id] ran a check right away: task [id] runByTaskMonitorId=[id], successful, 5 rows. GET .../monitors/[id] reads schedule back.",
   "notes": "Later scheduled runs not observed within the drive window.",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match"
   }
  },
  {
   "t": "20:22",
   "cap": "cap-06",
   "capability": "Field-level diff alerts",
   "task": "Get an alert when monitored data changes",
   "route": "api",
   "documented": true,
   "result": "skipped",
   "verified": false,
   "evidence": "Monitors created with notifyOnCapturedTextChange=true and a taskCapturedDataChanged webhook event exists, but we control no source page to change and have no webhook receiver; no change could be produced inside the drive window."
  },
  {
   "t": "21:28",
   "cap": "pay",
   "capability": "buy a plan",
   "task": "See how a paid plan is bought (no payment made)",
   "route": "browser",
   "documented": true,
   "result": "blocked",
   "verified": true,
   "evidence": "Dashboard > Billing: free plan (60 credits/month, 2 websites); Select Plan Personal -> 'Update my plan' panel with cost breakdown and 'Confirm and pay $228' (not clicked). Dashboard bundle loads js.stripe.com (Stripe card collection in-app). No billing API, no 402/x402/MPP.",
   "notes": "We have no card; not paid. A panel error 'An error occurred ... engineering team has been notified' appeared under the cost breakdown."
  },
  {
   "t": "21:28",
   "cap": "cap-22",
   "capability": "Manage number of websites",
   "task": "Read website allowance on free plan",
   "route": "browser",
   "documented": true,
   "result": "partial",
   "verified": true,
   "evidence": "Billing page: 'Total websites: 2', 'Add websites' button; Personal plan includes 5 websites, add-on $4/mo. Adding websites costs money, not done."
  },
  {
   "t": "22:41",
   "cap": "cap-11",
   "capability": "Export captured data as CSV/JSON",
   "task": "Download table as CSV",
   "route": "browser",
   "documented": true,
   "result": "partial",
   "verified": false,
   "evidence": "Robot Tables > Export panel shows 'Download CSV', 'Download JSON', 'Export JSON/CSV to S3', scheduled exports. Our scripted click on Download did not complete within the drive time (selector timeouts), so no file was read back. No documented REST endpoint to start an export (only the tableExportFinishedSuccessfully webhook event)."
  },
  {
   "t": "22:49",
   "cap": "cleanup",
   "capability": "delete created objects",
   "task": "Delete monitors and webhook",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "DELETE /v2/robots/[id]/monitors/{M1,M2} and /webhooks/[id] -> 200; GET lists -> 0 monitors, 0 webhooks"
  },
  {
   "t": "23:32",
   "cap": "cap-23",
   "capability": "Generate and revoke an API key",
   "task": "Create key, use it, delete it, confirm 401",
   "route": "browser",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "Dashboard > API: created key 'agentdrives' (used for all API calls); delete-api-key > 'Yes, delete API key' -> list empty; GET /v2/robots with the same key -> 401 {statusCode:401,messageCode:unauthorized}",
   "notes": "Key lifecycle is dashboard-only; no API/CLI for keys.",
   "quality": {
    "verify_route": "yes"
   }
  },
  {
   "t": "24:58",
   "cap": "delete",
   "capability": "delete account",
   "task": "Delete the free account and its data",
   "route": "browser",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "Profile > 'If you would like to delete your account, click here' > type 'delete' > 'Yes, delete my account' -> logged out to auth.browse.ai/u/login; logging in again with the same email/password -> 'Wrong email or password'.",
   "notes": "Web UI only (help article: free plan self-serve; paid plans and workspace owners via support chat). No API delete."
  },
  {
   "t": "24:58",
   "cap": "cancel",
   "capability": "cancel plan",
   "task": "Cancel paid plan",
   "route": "none",
   "documented": true,
   "result": "skipped",
   "verified": false,
   "evidence": "No paid plan was started. Help article 'How to manage your Browse AI subscription' describes cancel/pause in the dashboard; no billing API."
  },
  {
   "t": "24:58",
   "cap": "cap-04",
   "capability": "Capture a full-page or element screenshot",
   "task": "",
   "route": "none",
   "documented": true,
   "result": "skipped",
   "verified": false,
   "evidence": "Table Studio-trained robot has no screenshot field; screenshots are trained in Robot Studio / the extension (point-and-click). Not attempted for time; no API to add a capture to a robot."
  },
  {
   "t": "24:58",
   "cap": "cap-12",
   "capability": "Use a prebuilt robot template (250+ sites) instead of training from scratch",
   "task": "",
   "route": "none",
   "documented": true,
   "result": "skipped",
   "verified": false,
   "evidence": "Prebuilt robot gallery is web-UI only; not attempted for time."
  },
  {
   "t": "24:58",
   "cap": "cap-13",
   "capability": "Add an AI-written formula column to transform/clean a captured field",
   "task": "",
   "route": "none",
   "documented": true,
   "result": "skipped",
   "verified": false,
   "evidence": "Formula columns are web-UI only (Table Studio); not attempted for time."
  },
  {
   "t": "24:58",
   "cap": "cap-14",
   "capability": "Copy a column schema from an existing robot/table when training a new one",
   "task": "",
   "route": "none",
   "documented": true,
   "result": "skipped",
   "verified": false,
   "evidence": "Copying a column schema is web-UI only; not attempted for time."
  },
  {
   "t": "24:58",
   "cap": "cap-17",
   "capability": "Scrape across pages and subpages via workflows/automations (deep scraping)",
   "task": "",
   "route": "none",
   "documented": true,
   "result": "skipped",
   "verified": false,
   "evidence": "Workflows (deep scraping) are web-UI only; not attempted for time."
  },
  {
   "t": "24:58",
   "cap": "cap-18",
   "capability": "Sync captured data to Google Sheets, Airtable, Amazon S3, or via Zapier/Make/Pabbly (7,000+ apps)",
   "task": "",
   "route": "none",
   "documented": true,
   "result": "skipped",
   "verified": false,
   "evidence": "Integrations need third-party accounts (Google Sheets, Airtable, Zapier) we do not have."
  },
  {
   "t": "24:58",
   "cap": "cap-20",
   "capability": "Set a geographic proxy location for an extraction run",
   "task": "",
   "route": "none",
   "documented": true,
   "result": "skipped",
   "verified": false,
   "evidence": "Proxy country is a robot setting in the UI (robot shows 'Germany'); the robot's API inputParameters expose no geo field. Not attempted further."
  },
  {
   "t": "24:58",
   "cap": "cap-21",
   "capability": "Invite and manage team users on an account",
   "task": "",
   "route": "none",
   "documented": true,
   "result": "skipped",
   "verified": false,
   "evidence": "Inviting team users not attempted: would send an invite email; skipped for time."
  },
  {
   "t": "24:58",
   "cap": "cap-24",
   "capability": "Book managed/premium data extraction service (enterprise onboarding and custom pipelines)",
   "task": "",
   "route": "none",
   "documented": true,
   "result": "skipped",
   "verified": false,
   "evidence": "Managed service is a sales call booking; we do not contact sales."
  }
 ],
 "stale": false,
 "icon": "/logos/browse.png",
 "monitored": false,
 "verdict": "Gets in on its own and does real work: L3 · Does the work. Sign-up, API key creation and robot training all happen in a browser with no bot check, then our agent ran everything through the documented REST API. It built a robot from a page and a one-line instruction, read the result back, and could run, monitor and bulk-run headless from there. Pagination failed and screenshots and change alerts went untried. At checkout the plan page showed a cost breakdown and confirm button but reached no card form, so our agent stayed on the free plan and deleted the account afterward with no human needed.",
 "page": "https://agentdrives.com/tools/browse?via=api"
}