botworthy Scan my site

For agents

Before an agent visits a website for someone, it can ask us how that site went for ours: whether it was let in, which of 5 everyday tasks worked, and the exact steps that did. 198 sites so far.

Add Botworthy to your agent

Botworthy is an MCP server at https://botworthy.dev/mcp. There's no sign-up or key. It gives your agent three tools: check_site before it visits a website, request_scan for sites we haven't tested, and report_visit to tell us how a task went.

Claude Code

claude mcp add --transport http botworthy https://botworthy.dev/mcp

Claude and ChatGPT apps: add a custom connector with the URL https://botworthy.dev/mcp.

Cursor (~/.cursor/mcp.json) and other clients that take JSON config

{
  "mcpServers": {
    "botworthy": {
      "url": "https://botworthy.dev/mcp"
    }
  }
}

VS Code (.vscode/mcp.json)

{
  "servers": {
    "botworthy": {
      "type": "http",
      "url": "https://botworthy.dev/mcp"
    }
  }
}

The tools call the same HTTP API described below, with the same limits. If your agent doesn't speak MCP, use the API directly.

Look up a site

Every scanned site has a JSON file next to its page. Add .json to the page address:

curl https://botworthy.dev/allbirds.com.json

If you have a full URL rather than a bare domain, use the check endpoint. It strips the scheme, www. and the path, and falls back from a subdomain to its parent:

curl "https://botworthy.dev/api/check?site=https://www.allbirds.com/collections/mens"

It answers {"found": true, …} with the full result, or {"found": false, "queued": …} with how to request a scan. The whole list is at /sites.json.

What you get back

{
  "site": "allbirds.com",
  "page": "https://botworthy.dev/allbirds.com",
  "status": "ranked",
  "score": 90,
  "grade": "A",
  "scannedAt": "2026-11-02T21:11:14.960Z",
  "summary": "5 of 5 tasks done. Score 90/100, grade A.",
  "advice": [
    "A cookie banner appears on load. Declining it worked.",
    "Some controls have no accessible name, so look at the screen as well as the accessibility tree."
  ],
  "tasks": [
    {
      "id": "find-pricing",
      "title": "Find a price",
      "goal": "Find the price of this site's main product, service or plan. Record the exact price and where it was shown.",
      "outcome": "success",
      "points": 19,
      "reason": "Prices shown on the Shop All grid after dismissing the cookie banner",
      "evidence": "Men's Tree Runner NZ, Natural Black — $100 on /collections/shop-all-26",
      "startUrl": "https://allbirds.com",
      "finalUrl": "https://www.allbirds.com/collections/shop-all-26",
      "steps": [
        {
          "do": "Open allbirds.com",
          "ok": true,
          "action": "start",
          "url": "https://allbirds.com",
          "urlAfter": "https://www.allbirds.com/"
        },
        {
          "do": "Click “Decline”",
          "ok": true,
          "action": "click",
          "role": "button",
          "name": "Decline",
          "exact": true,
          "urlAfter": "https://www.allbirds.com/"
        },
        {
          "do": "Click “Shop All”",
          "ok": true,
          "action": "click",
          "role": "link",
          "name": "Shop All",
          "urlAfter": "https://www.allbirds.com/collections/shop-all-26"
        }
      ],
      "friction": [
        {
          "kind": "cookie_banner",
          "text": "Cookie consent alertdialog on load"
        }
      ],
      "replay": "https://botworthy.dev/r/allbirds.com/find-pricing.mp4"
    },
    "…4 more tasks"
  ],
  "caveats": [
    "A snapshot from the scan date. The site may have changed since.",
    "The scanning agent named itself in its user agent (Botworthy/0.1) and ran from a cloud server. An agent in a person's own browser may be treated differently."
  ],
  "methodology": "https://botworthy.dev/methodology",
  "source": "Botworthy (botworthy.dev)"
}

Request a scan

If a site isn't here yet, an agent can ask for it. No account or email needed:

curl -X POST https://botworthy.dev/api/agent/scan \
  -H "content-type: application/json" \
  -d '{"site": "example.com", "agent": "Your agent name"}'

You'll get 202 with the site's place in the queue, or 200 with a link if it's already been scanned. Scans run in batches by our own agent under the same rules as every other site, so expect days, not minutes. Don't wait on it in the middle of a task.

Report how a visit went

If your agent did one of our 5 tasks on a site, it can tell us how it went. Reports aren't published. A report on a site we haven't scanned also asks us to scan it, and reports that disagree with our result tell us the site needs a rescan. Either way, what we publish always comes from our own scan.

curl -X POST https://botworthy.dev/api/agent/report \
  -H "content-type: application/json" \
  -d @report.json
{
  "site": "example.com",
  "task": "find-pricing",
  "outcome": "success",
  "ranFrom": "user_browser",
  "agent": "Your agent name",
  "reason": "Prices are on the Plans page, monthly by default",
  "steps": [
    { "action": "open", "url": "https://example.com/" },
    { "action": "click", "role": "button", "name": "Accept cookies" },
    { "action": "click", "role": "link", "name": "Plans", "url": "https://example.com/plans" }
  ],
  "followedRules": { "noLogin": true, "noPersonalData": true, "noBotCheckBypass": true }
}

We drop query strings from URLs and cut long text. Please don't send anything about the person you're helping.

Limits

WhatLimit
Static files (/{site}.json, /sites.json)Cached, no limit. Once a day per site is plenty.
GET /api/check60 a minute per IP
POST /api/agent/scan3 a minute and 10 new sites a day per IP
POST /api/agent/report5 a minute and 30 a day per IP, one per site and task a day
New sites from all agents100 a day, then the queue closes until tomorrow

Over a limit you get 429 (or 503 when the day's queue is full) with a Retry-After header. Sites already scanned are never queued again by a request; they get rescanned on our schedule.

Good to know

Machine-readable

/llms.txt describes all of this for language models, /llms-full.txt adds every site, and /openapi.json is an OpenAPI 3.1 spec you can hand to an agent framework as a tool.