See your site the way AI agents see it.
Check how ChatGPT, Claude, Perplexity and 19 other agents treat any URL.
$
brew install tragent-io/tap/acurl
curl -fsSL https://acurl.dev/install.sh | sh
go install github.com/tragent-io/acurl/cmd/acurl@latest
npx @tragent/acurl https://yourstore.com
docker run --rm ghcr.io/tragent-io/acurl https://yourstore.com
$ acurl shop.example/products/wool-runnerFetching https://shop.example/products/wool-runner with 22 profiles... PROFILE STATUS TIME RESULT DETAILSChrome (Browser) 200 412ms allowed Wool Runner | Example StoreChatGPT-User 403 51ms challenged challenge: CloudflareClaude-User 200 388ms allowed OKPerplexity-User 200 402ms allowed product: price 89.00 vs browser 98.00OAI-SearchBot 200 97ms cloaked 31% similar to browserPerplexityBot 200 371ms allowed OKGPTBot 200 365ms robots-disallowed robots.txt: disallowedGoogle-Extended - - robots-disallowed robots.txt token (not fetched)Googlebot 200 390ms allowed OK AI readiness 71/100 (C) ✗ AI assistants can fetch the page 16.7/25 ChatGPT-User (challenged) ✗ AI search crawlers can fetch the page 10.0/20 OAI-SearchBot (cloaked) ✓ Content is in the HTML without JavaScript 15.0/15 ✓ Product structured data is present 10.0/10 How to improve 1. Allow ChatGPT-User, Claude-User and Perplexity-User in your WAF's verified-bot rules. 2. Serve OAI-SearchBot the same product content as browsers. Run with --diff OAI-SearchBot.
One verdict per agent.
| allowed | The agent got the same page as the browser. |
| blocked | An error status (403, 401, 404, 5xx) instead of the page. |
| challenged | A WAF or CAPTCHA challenge page. |
| rate-limited | A 429, with the Retry-After delay. |
| cloaked | The visible text differs substantially from what the browser got. |
| robots-disallowed | robots.txt tells this agent to stay out. |
| error | The request failed: DNS, TLS, timeout or connection reset. |
Scripts, CI and AI assistants.
$ acurl -f json shop.example/products/wool-runner { "url": "https://shop.example/products/wool-runner", "results": [ { "profile": "ChatGPT-User", "category": "ai-assistant", "status_code": 403, "duration_ms": 51, "bot_challenge": "Cloudflare", "classification": "challenged" }, { "profile": "Perplexity-User", "status_code": 200, "product": { "source": "json-ld", "price": "89.00", "currency": "USD" }, "product_issue": "price 89.00 vs browser 98.00", "classification": "allowed" } ], "summary": { "total": 22, "allowed": 16, "challenged": 1, "cloaked": 1 }, "score": { "value": 71, "grade": "C", "checks": [ { "id": "assistants-allowed", "points": 16.7, "weight": 25 } ] } }
name: AI agent access on: [pull_request] jobs: acurl: runs-on: ubuntu-latest permissions: security-events: write steps: - uses: tragent-io/acurl@v1 with: urls: | https://staging.shop.example/ https://staging.shop.example/products/best-seller fail-on: blocked,challenged,score<80
# Claude Code claude mcp add acurl -- acurl mcp # Claude Desktop, Cursor { "mcpServers": { "acurl": { "command": "acurl", "args": ["mcp"] } } }
Commands
| acurl <url> | Fetch a URL as every agent, classify each response and score the page. |
| acurl robots <url> | robots.txt verdict per agent, Content Signals, sitemaps and llms.txt. |
| acurl batch [file] | Check URL lists, CSV files, stdin or whole sitemaps. |
| acurl watch <url>... | Re-check on a schedule and alert on changes. |
| acurl report <file> | Render a saved JSON report as HTML, Markdown, SARIF, JUnit or CSV. |
| acurl serve | Local web UI and JSON API. |
| acurl mcp | MCP server for AI assistants. |
| acurl profiles list | show | Browse the agent profile catalog. |
| acurl keygen | Create an Ed25519 key for Web Bot Auth signing. |
| acurl init | Write a commented .acurl.yaml config file. |
| acurl completion | Shell completions for bash, zsh, fish and PowerShell. |