acurl documentation
acurl fetches a URL once per agent profile, compares every response with a real Chrome visit and tells you which AI agents and crawlers can read the page, and what to fix when they can't.
Installation
acurl is a single static binary for macOS, Linux and Windows (amd64 and arm64).
| Method | Command |
|---|---|
| Homebrew | brew install tragent-io/tap/acurl |
| Shell script | curl -fsSL https://acurl.dev/install.sh | sh |
| Go 1.26+ | go install github.com/tragent-io/acurl/cmd/acurl@latest |
| npm | npx @tragent/acurl <url> or npm i -g @tragent/acurl |
| Docker | docker run --rm ghcr.io/tragent-io/acurl <url> |
| Binaries | GitHub Releases, with checksums, SBOMs and cosign signatures |
Check the install with acurl --version. Shell completions: acurl completion zsh > "${fpath[1]}/_acurl" (see completion).
Quick start
Point acurl at any page. A scheme is optional: https:// is assumed.
$ acurl shop.example/products/wool-runner
Fetching https://shop.example/products/wool-runner with 22 profiles...
PROFILE STATUS TIME RESULT DETAILS
Chrome (Browser) 200 412ms allowed Wool Runner | Example Store
ChatGPT-User 403 51ms challenged challenge: Cloudflare
Claude-User 200 388ms allowed OK
OAI-SearchBot 200 97ms cloaked 31% similar to browser
GPTBot 200 365ms robots-disallowed robots.txt: disallowed
...
AI readiness 71/100 (C)
✗ AI assistants can fetch the page 16.7/25 ChatGPT-User (challenged)
✓ Content is in the HTML without JavaScript 15.0/15
...
How to improve
1. AI assistants can fetch the page
Allow ChatGPT-User, Claude-User and Perplexity-User in your WAF or bot-management rules...
The exit code is 1 because an agent was challenged. Change that with --fail-on.
Reading the output
| Column | Meaning |
|---|---|
| PROFILE | The agent acurl pretended to be. Chrome (Browser) is the baseline everything is compared with. |
| STATUS | Final HTTP status after redirects. - for robots.txt-only tokens, ERR for network failures. |
| TIME / SIZE | Total request time and body size (capped by --max-body). |
| RESULT | The verdict for this agent. |
| DETAILS | Why: the WAF vendor, similarity to the browser, robots.txt and meta directives, product price differences, redirects or the error. |
Below the table: the AI readiness score with each check, and a fix for every failed check.
Usage patterns
Check only the agents you care about
acurl --category ai-assistant,ai-search shop.example # categories keep the browser baseline
acurl --agents "Chrome (Browser),ChatGPT-User,Claude-User" shop.example
acurl profiles list # every profile and its category
See exactly what an agent missed
acurl --diff OAI-SearchBot shop.example/products/1 # visible-text diff vs the browser, on stderr
acurl -f html -o report.html shop.example/products/1 # shareable report with diffs
Raw output for scripts
acurl -q -f json shop.example | jq '.results[] | select(.classification != "allowed") | .profile'
acurl -q -f json shop.example | jq '.score.value'
acurl -q -f csv shop.example > agents.csv
Robots and llms.txt without fetching the page
acurl robots shop.example/products/1
acurl robots -f json shop.example | jq '.agents[] | select(.allowed | not) | .token'
Whole site
acurl batch urls.txt # one URL per line, # comments allowed
acurl batch --sitemap auto:shop.example --limit 100 # sitemaps listed in robots.txt
cat urls.txt | acurl batch -f junit -o acurl.xml
Staging, logins and regions
acurl -H "Cookie: country=US" -H "Authorization: Basic dXNlcjpwYXNz" staging.shop.example
acurl --proxy socks5://127.0.0.1:1080 shop.example # check from another network
acurl -k https://localhost:8443 # self-signed certificates
Isolate the user agent
acurl --tls chrome shop.example # bots use Chrome's TLS fingerprint too: only the UA differs
acurl -I shop.example # HEAD requests: status and headers only
Verdicts
Each result gets exactly one verdict, checked in this order:
| Verdict | When | Fails by default |
|---|---|---|
| error | The request failed (DNS, TLS, timeout, reset) | yes, exit 2 |
| challenged | A known WAF challenge or block page: Cloudflare, Akamai, DataDome, PerimeterX, Imperva, Kasada, AWS WAF, Sucuri or a CAPTCHA on an error page | yes |
| rate-limited | HTTP 429. Retry-After is parsed as seconds or a date. | no |
| blocked | Any 4xx or 5xx status | yes |
| robots-disallowed | robots.txt disallows the agent's token for this URL | no |
| cloaked | Allowed, but the visible text is less than 50% similar to the browser's (--cloak-threshold) | no |
| allowed | Everything else |
Agent profiles
A profile is a user agent string, optional headers and the robots.txt token the agent obeys. The catalog has 22 profiles in six categories:
| Category | Profiles |
|---|---|
browser | Chrome (Browser), the baseline |
ai-assistant | ChatGPT-User, Claude-User, Perplexity-User, MistralAI-User, DuckAssistBot |
ai-search | OAI-SearchBot, Claude-SearchBot, PerplexityBot, Amazonbot |
ai-training | GPTBot, ClaudeBot, Claude-Web, anthropic-ai, Meta-ExternalAgent, Bytespider, CCBot, Google-Extended*, Applebot-Extended* |
search | Googlebot, Bingbot, Applebot |
other | curl (Baseline) |
* robots.txt-only tokens: checked against robots.txt, never fetched.
Browser profiles use Chrome's TLS, HTTP/2 and client hints. Bot profiles send only their own headers over Go's TLS stack, like most real crawlers. Bring your own catalog with --profiles my-profiles.yaml:
profiles:
- name: "InternalBot"
category: other
user_agent: "InternalBot/2.0 (+https://example.com/bot)"
robots_key: "InternalBot"
headers:
X-Team: "growth"
AI readiness score
A 0-100 score from weighted checks that only use what was observed in the run. Checks that don't apply (no product on the page, no agents of that category) are skipped and the rest re-weighted. Blocking training crawlers costs nothing: that is a business decision.
| Check | Weight |
|---|---|
| AI assistants can fetch the page | 25 |
| AI search crawlers can fetch the page | 20 |
| Content is in the HTML without JavaScript | 15 |
| No bot challenges for AI agents | 10 |
| AI agents see the same content as browsers | 10 |
| Product structured data is present | 10 |
| AI agents see the same price and availability | 10 |
Grades: A 90+, B 80+, C 65+, D 50+, F below. If the browser baseline itself is blocked, the page is not scored: the site is blocking your network, not the agents.
Exit codes and --fail-on
| Code | Meaning |
|---|---|
0 | Nothing matched the --fail-on policy |
1 | Something matched (for example an assistant was blocked) |
2 | A request failed, or acurl was used incorrectly |
The default is --fail-on blocked,challenged,error. Combine blocked, challenged, rate-limited, cloaked, robots, error and score<N, or use none.
acurl --fail-on blocked,challenged,cloaked,score<80 shop.example
Output formats
-f | Use it for |
|---|---|
table | Terminals (default). --no-color for plain text. |
json | Scripts. Every field, including score checks, directives and product data. |
markdown | Pull request comments and issues |
html | A self-contained report with visible-text diffs |
sarif | GitHub code scanning |
junit | Test reporters in any CI |
csv | Spreadsheets: one row per URL and agent |
Save JSON once and render it again later without re-fetching: acurl report run.json -f html -o run.html.
CI and GitHub Actions
- uses: tragent-io/acurl@v1
with:
urls: |
https://staging.shop.example/
https://staging.shop.example/products/best-seller
fail-on: blocked,challenged,score<80
The action installs acurl, writes a job summary, and uploads SARIF to code scanning when the job has security-events: write. Without the action:
go install github.com/tragent-io/acurl/cmd/acurl@latest
acurl batch urls.txt -f sarif -o acurl.sarif --fail-on blocked,challenged
Results from cloud runners can differ from your laptop's: many WAFs score datacenter IP ranges. If the browser baseline is challenged, the runner is being blocked, not the agents.
robots.txt and llms.txt
acurl robots fetches only robots.txt and llms.txt, and reports per agent:
- allow or disallow using Google's robots.txt matcher, with RFC 9309 failure rules (4xx allows all, 5xx or an unreachable server means full disallow)
Content-Signaldirectives such assearch=yes, ai-train=no- sitemaps listed in robots.txt
/llms.txtand/llms-full.txt: presence, title, sections, links and format problems
The main command also reads X-Robots-Tag and <meta name="robots">, including agent-specific tags like <meta name="GPTBot" content="noindex">.
JavaScript rendering
Most AI agents do not run JavaScript. acurl flags client-rendered shells (an empty app root, a "please enable JavaScript" notice, almost no text). With --render, it loads the page in a local headless Chrome and reports how much visible text only exists after scripts run:
$ acurl --render shop.example
JavaScript rendering
64% of the visible text only appears after JavaScript runs (812 -> 2254 chars).
Agents that do not run JavaScript miss it.
Rendering needs Chrome or Chromium installed. On Ubuntu 23.10+, Chrome's sandbox needs
sudo sysctl -w kernel.apparmor_restrict_unprivileged_userns=0. Inside a container,
set ACURL_CHROME_NO_SANDBOX=1 instead.
Watching for changes
acurl watch shop.example --interval 1h \
--webhook https://hooks.slack.com/services/... --webhook-format slack
# from cron: run once, compare with the last run, alert on changes
acurl watch shop.example --interval 0 --state /var/lib/acurl/state.json --webhook https://ops.example/hook
Reports every change in an agent's verdict and score moves of at least --min-score-delta points.
Web Bot Auth signing
Sign bot-profile requests with HTTP Message Signatures (RFC 9421, Ed25519), as proposed by Web Bot Auth. Use it to test your verifier or your own agent:
acurl keygen -o mybot.key # prints the key directory JSON to publish
acurl --sign mybot.key --signature-agent https://bot.example shop.example
Requests carry Signature-Agent, Signature-Input (covering @authority and signature-agent, with created, expires, nonce and tag="web-bot-auth") and Signature. Signing is verified against the RFC 9421 Ed25519 test vector.
AI assistants (MCP)
claude mcp add acurl -- acurl mcp
For Claude Desktop or Cursor, add {"mcpServers": {"acurl": {"command": "acurl", "args": ["mcp"]}}}. Tools: check_url, readiness_score, robots_audit, list_profiles. Private and internal addresses are blocked unless you start it with --allow-private.
Web UI and API
acurl serve # http://127.0.0.1:8080
curl -s -X POST localhost:8080/api/check -d '{"url":"shop.example","categories":["ai-assistant"]}'
| Endpoint | Description |
|---|---|
POST /api/check | Run a check, returns the JSON report |
GET /api/check/stream | Server-sent events: start, progress, report |
GET /api/robots?url= | robots.txt audit |
GET /api/profiles | Profile catalog |
POST /api/report?format= | Render a JSON report as html, markdown, csv, sarif or junit |
Configuration
acurl init writes a commented .acurl.yaml. Any flag can be set by its long name. Precedence: flags, then ACURL_* environment variables, then the config file.
category: [ai-assistant, ai-search]
fail-on: blocked,challenged,score<75
timeout: 20s
header:
- "Cookie: country=US"
acurl looks for ./.acurl.yaml, then ~/.config/acurl/config.yaml, or the file given with --config. Unknown keys are an error, so typos never pass silently.
Go library
import "github.com/tragent-io/acurl/pkg/acurl"
c, err := acurl.New(acurl.Options{BlockPrivate: true})
if err != nil { return err }
rep, err := c.Check(ctx, "https://shop.example/products/1")
if err != nil { return err }
fmt.Println(rep.Score.Value, rep.Summary.Blocked)
Command reference
Generated from the CLI itself with acurl reference, so it always matches the installed version.
acurl
Show how AI agents see a URL compared to a real browser
acurl <url> [flags]
acurl fetches a URL with multiple user agent profiles (a real browser, AI agents, search bots) and shows how each one is treated.
| Flag | Default | Description |
|---|---|---|
-a, --agents list | only use these profiles (comma-separated) | |
--category list | only use profiles in these categories: ai-assistant, ai-search, ai-training, search, other (the browser baseline is always kept) | |
--cloak-threshold number | 0.5 | visible-text similarity below which a response counts as cloaked (0 disables) |
-c, --concurrency int | 5 | maximum concurrent requests |
--diff string | print a visible-text diff between the browser baseline and this profile | |
--fail-on string | blocked,challenged,error | exit 1 when any of these occur: blocked, challenged, rate-limited, cloaked, robots, error, score<N, or none |
-f, --format string | table | output format: table, json, markdown, csv, junit, sarif, html |
-I, --head | send HEAD requests (status and headers only) | |
-H, --header string, repeatable | extra header "Name: value" (repeatable) | |
--http string | force HTTP version: "1.1" or "2" | |
-k, --insecure | skip TLS certificate verification | |
--max-body int | 5242880 | maximum response body bytes to read per profile |
--no-color | disable colored output | |
--no-robots | skip robots.txt checks | |
-o, --output string | write the report to a file instead of stdout | |
--profiles string | custom profiles YAML file | |
--proxy string | proxy URL (http://, https:// or socks5://) | |
--render | also render the page in headless Chrome to measure how much text needs JavaScript | |
--render-wait duration | 2s | how long scripts may run before the rendered page is captured |
-X, --request string | GET | HTTP method to use |
--retries int | 1 | retries after network or gateway errors (exponential backoff with jitter) |
--sign string | sign bot-profile requests with this Ed25519 key (Web Bot Auth, see acurl keygen) | |
--signature-agent string | Signature-Agent URL where your key directory is published | |
-t, --timeout duration | 30s | per-request timeout |
--tls string | go | TLS fingerprint for bot profiles: "go" (like real crawlers) or "chrome" (only the user agent differs) |
Examples
acurl https://shop.example/products/1
acurl --category ai-assistant,ai-search shop.example
acurl --agents GPTBot,ClaudeBot --diff GPTBot shop.example
acurl -f json -o report.json --fail-on blocked,score<80 shop.example
acurl --render shop.example # measure JavaScript-only content
acurl batch
Check many URLs from a file, CSV or stdin
acurl batch [file] [flags]
batch checks every URL in a file (one per line, # comments allowed), a CSV file (the "url" column, or the first column), or stdin when the file is "-" or omitted.
| Flag | Default | Description |
|---|---|---|
-a, --agents list | only use these profiles (comma-separated) | |
--category list | only use profiles in these categories: ai-assistant, ai-search, ai-training, search, other (the browser baseline is always kept) | |
--cloak-threshold number | 0.5 | visible-text similarity below which a response counts as cloaked (0 disables) |
-c, --concurrency int | 5 | maximum concurrent requests |
--csv | treat the input as CSV (automatic for .csv files) | |
--delay duration | 500ms | minimum time between checks of URLs on the same host |
--fail-on string | blocked,challenged,error | exit 1 when any of these occur: blocked, challenged, rate-limited, cloaked, robots, error, score<N, or none |
-f, --format string | table | output format: table, json, markdown, csv, junit, sarif, html |
-I, --head | send HEAD requests (status and headers only) | |
-H, --header string, repeatable | extra header "Name: value" (repeatable) | |
--http string | force HTTP version: "1.1" or "2" | |
-k, --insecure | skip TLS certificate verification | |
--limit int | 50 | maximum URLs to check (0 = no limit) |
--max-body int | 5242880 | maximum response body bytes to read per profile |
--no-color | disable colored output | |
--no-robots | skip robots.txt checks | |
-o, --output string | write the report to a file instead of stdout | |
-p, --parallel int | 2 | URLs to check at the same time |
--profiles string | custom profiles YAML file | |
--proxy string | proxy URL (http://, https:// or socks5://) | |
-X, --request string | GET | HTTP method to use |
--retries int | 1 | retries after network or gateway errors (exponential backoff with jitter) |
--sign string | sign bot-profile requests with this Ed25519 key (Web Bot Auth, see acurl keygen) | |
--signature-agent string | Signature-Agent URL where your key directory is published | |
--sitemap string | read URLs from a sitemap URL, or "auto:<site>" to use the sitemaps listed in robots.txt | |
-t, --timeout duration | 30s | per-request timeout |
--tls string | go | TLS fingerprint for bot profiles: "go" (like real crawlers) or "chrome" (only the user agent differs) |
Examples
acurl batch urls.txt
acurl batch products.csv -f json -o report.json
cat urls.txt | acurl batch
acurl batch --sitemap https://shop.example/sitemap.xml --limit 20
acurl batch --sitemap auto:shop.example
acurl completion bash
Generate the autocompletion script for bash
acurl completion bash
Generate the autocompletion script for the bash shell. This script depends on the 'bash-completion' package. If it is not installed already, you can install it via your OS's package manager. To load completions in your current shell session: source <(acurl completion bash) To load completions for every new session, execute once: #### Linux: acurl completion bash > /etc/bash_completion.d/acurl #### macOS: acurl completion bash > $(brew --prefix)/etc/bash_completion.d/acurl You will need to start a new shell for this setup to take effect.
| Flag | Default | Description |
|---|---|---|
--no-descriptions | disable completion descriptions |
acurl completion fish
Generate the autocompletion script for fish
acurl completion fish [flags]
Generate the autocompletion script for the fish shell. To load completions in your current shell session: acurl completion fish | source To load completions for every new session, execute once: acurl completion fish > ~/.config/fish/completions/acurl.fish You will need to start a new shell for this setup to take effect.
| Flag | Default | Description |
|---|---|---|
--no-descriptions | disable completion descriptions |
acurl completion powershell
Generate the autocompletion script for powershell
acurl completion powershell [flags]
Generate the autocompletion script for powershell. To load completions in your current shell session: acurl completion powershell | Out-String | Invoke-Expression To load completions for every new session, add the output of the above command to your powershell profile.
| Flag | Default | Description |
|---|---|---|
--no-descriptions | disable completion descriptions |
acurl completion zsh
Generate the autocompletion script for zsh
acurl completion zsh [flags]
Generate the autocompletion script for the zsh shell. If shell completion is not already enabled in your environment you will need to enable it. You can execute the following once: echo "autoload -U compinit; compinit" >> ~/.zshrc To load completions in your current shell session: source <(acurl completion zsh) To load completions for every new session, execute once: #### Linux: acurl completion zsh > "${fpath[1]}/_acurl" #### macOS: acurl completion zsh > $(brew --prefix)/share/zsh/site-functions/_acurl You will need to start a new shell for this setup to take effect.
| Flag | Default | Description |
|---|---|---|
--no-descriptions | disable completion descriptions |
acurl init
Create a .acurl.yaml config file in the current directory
acurl init [flags]
| Flag | Default | Description |
|---|---|---|
--force | overwrite an existing file |
Examples
acurl init
acurl init --force
acurl keygen
Generate an Ed25519 key for signing requests (Web Bot Auth)
acurl keygen [flags]
keygen creates an Ed25519 private key for --sign and prints its key ID and the key directory JSON to publish at /.well-known/http-message-signatures-directory. Pass an existing key with --key to print its directory without generating one.
| Flag | Default | Description |
|---|---|---|
--force | overwrite an existing key file | |
--key string | print the directory for an existing key instead of generating one | |
-o, --output string | acurl-signing.key | where to write the new private key |
Examples
acurl keygen -o mybot.key
acurl keygen --key mybot.key > http-message-signatures-directory
acurl mcp
Run acurl as an MCP server for AI assistants (stdio)
acurl mcp [flags]
mcp runs a Model Context Protocol server on stdin/stdout so assistants such as Claude Desktop, Claude Code and Cursor can call acurl's checks as tools: check_url, readiness_score, robots_audit and list_profiles. Add it to Claude Code with: claude mcp add acurl -- acurl mcp
| Flag | Default | Description |
|---|---|---|
-a, --agents list | only use these profiles (comma-separated) | |
--allow-private | allow checking private and internal addresses | |
--category list | only use profiles in these categories: ai-assistant, ai-search, ai-training, search, other (the browser baseline is always kept) | |
-c, --concurrency int | 5 | maximum concurrent requests |
-I, --head | send HEAD requests (status and headers only) | |
-H, --header string, repeatable | extra header "Name: value" (repeatable) | |
--http string | force HTTP version: "1.1" or "2" | |
-k, --insecure | skip TLS certificate verification | |
--max-body int | 5242880 | maximum response body bytes to read per profile |
--no-color | disable colored output | |
--profiles string | custom profiles YAML file | |
--proxy string | proxy URL (http://, https:// or socks5://) | |
-X, --request string | GET | HTTP method to use |
--retries int | 1 | retries after network or gateway errors (exponential backoff with jitter) |
--sign string | sign bot-profile requests with this Ed25519 key (Web Bot Auth, see acurl keygen) | |
--signature-agent string | Signature-Agent URL where your key directory is published | |
-t, --timeout duration | 30s | per-request timeout |
--tls string | go | TLS fingerprint for bot profiles: "go" (like real crawlers) or "chrome" (only the user agent differs) |
Examples
claude mcp add acurl -- acurl mcp
acurl mcp --timeout 20s
acurl profiles list
List the available agent profiles
acurl profiles list [flags]
| Flag | Default | Description |
|---|---|---|
--category list | only list these categories | |
-f, --format string | table | output format: table or json |
Examples
acurl profiles list
acurl profiles list --category ai-assistant -f json
acurl profiles show
Show one profile as YAML
acurl profiles show <name>
Examples
acurl profiles show GPTBot
acurl report
Render a saved JSON report in another format
acurl report <report.json> [flags]
report reads a JSON report written by "acurl -f json" or "acurl batch -f json" and renders it as table, markdown, csv, junit, sarif or html, without fetching anything. Use "-" to read from stdin.
| Flag | Default | Description |
|---|---|---|
-f, --format string | html | output format: table, json, markdown, csv, junit, sarif, html |
--no-color | disable colored output | |
-o, --output string | write to a file instead of stdout |
Examples
acurl -f json -o run.json https://shop.example
acurl report run.json -f html -o run.html
acurl robots
Audit which agents robots.txt allows for a URL
acurl robots <url> [flags]
robots fetches robots.txt once and reports, for every agent profile with a robots.txt token, whether it may fetch the URL, along with Content-Signal directives, sitemaps and the site's llms.txt files. The page itself is not fetched.
| Flag | Default | Description |
|---|---|---|
-a, --agents list | only use these profiles (comma-separated) | |
--category list | only use profiles in these categories: ai-assistant, ai-search, ai-training, search, other (the browser baseline is always kept) | |
-c, --concurrency int | 5 | maximum concurrent requests |
-f, --format string | table | output format: table or json |
-I, --head | send HEAD requests (status and headers only) | |
-H, --header string, repeatable | extra header "Name: value" (repeatable) | |
--http string | force HTTP version: "1.1" or "2" | |
-k, --insecure | skip TLS certificate verification | |
--max-body int | 5242880 | maximum response body bytes to read per profile |
--no-color | disable colored output | |
--profiles string | custom profiles YAML file | |
--proxy string | proxy URL (http://, https:// or socks5://) | |
-X, --request string | GET | HTTP method to use |
--retries int | 1 | retries after network or gateway errors (exponential backoff with jitter) |
--sign string | sign bot-profile requests with this Ed25519 key (Web Bot Auth, see acurl keygen) | |
--signature-agent string | Signature-Agent URL where your key directory is published | |
-t, --timeout duration | 30s | per-request timeout |
--tls string | go | TLS fingerprint for bot profiles: "go" (like real crawlers) or "chrome" (only the user agent differs) |
Examples
acurl robots shop.example
acurl robots --category ai-training -f json shop.example/products/1
acurl serve
Run the acurl web UI and JSON API locally
acurl serve [flags]
serve starts a local web UI for running checks in the browser, plus the JSON API it uses (POST /api/check, GET /api/robots, GET /api/profiles). Requests to private and internal addresses are blocked unless --allow-private is set, because anyone who can reach the server can make it fetch URLs.
| Flag | Default | Description |
|---|---|---|
--addr string | 127.0.0.1:8080 | address to listen on |
-a, --agents list | only use these profiles (comma-separated) | |
--allow-private | allow checking private and internal addresses | |
--category list | only use profiles in these categories: ai-assistant, ai-search, ai-training, search, other (the browser baseline is always kept) | |
-c, --concurrency int | 5 | maximum concurrent requests |
-I, --head | send HEAD requests (status and headers only) | |
-H, --header string, repeatable | extra header "Name: value" (repeatable) | |
--http string | force HTTP version: "1.1" or "2" | |
-k, --insecure | skip TLS certificate verification | |
--max-body int | 5242880 | maximum response body bytes to read per profile |
--no-color | disable colored output | |
--profiles string | custom profiles YAML file | |
--proxy string | proxy URL (http://, https:// or socks5://) | |
--render | allow headless Chrome rendering from the UI | |
-X, --request string | GET | HTTP method to use |
--retries int | 1 | retries after network or gateway errors (exponential backoff with jitter) |
--sign string | sign bot-profile requests with this Ed25519 key (Web Bot Auth, see acurl keygen) | |
--signature-agent string | Signature-Agent URL where your key directory is published | |
-t, --timeout duration | 30s | per-request timeout |
--tls string | go | TLS fingerprint for bot profiles: "go" (like real crawlers) or "chrome" (only the user agent differs) |
Examples
acurl serve
acurl serve --addr 0.0.0.0:8080 --render
acurl watch
Re-check URLs and report when agent access changes
acurl watch <url>... [flags]
watch checks URLs repeatedly and prints every change in how an agent is treated, or a score change of --min-score-delta points or more. With --interval 0 it runs once and compares with the --state file, which suits cron.
| Flag | Default | Description |
|---|---|---|
-a, --agents list | only use these profiles (comma-separated) | |
--category list | only use profiles in these categories: ai-assistant, ai-search, ai-training, search, other (the browser baseline is always kept) | |
-c, --concurrency int | 5 | maximum concurrent requests |
-I, --head | send HEAD requests (status and headers only) | |
-H, --header string, repeatable | extra header "Name: value" (repeatable) | |
--http string | force HTTP version: "1.1" or "2" | |
-k, --insecure | skip TLS certificate verification | |
--interval duration | 1h0m0s | time between checks (0 = check once) |
--max-body int | 5242880 | maximum response body bytes to read per profile |
--min-score-delta int | 5 | report score changes of at least this many points |
--no-color | disable colored output | |
--no-robots | skip robots.txt checks | |
--profiles string | custom profiles YAML file | |
--proxy string | proxy URL (http://, https:// or socks5://) | |
-X, --request string | GET | HTTP method to use |
--retries int | 1 | retries after network or gateway errors (exponential backoff with jitter) |
--sign string | sign bot-profile requests with this Ed25519 key (Web Bot Auth, see acurl keygen) | |
--signature-agent string | Signature-Agent URL where your key directory is published | |
--state string | file that keeps the last results between runs | |
-t, --timeout duration | 30s | per-request timeout |
--tls string | go | TLS fingerprint for bot profiles: "go" (like real crawlers) or "chrome" (only the user agent differs) |
--webhook string | POST changes to this URL | |
--webhook-format string | json | webhook body: "json" or "slack" |
Examples
acurl watch https://shop.example --interval 1h --webhook https://hooks.slack.com/... --webhook-format slack
acurl watch https://shop.example --interval 0 --state acurl-state.json # from cron
Global flags
These flags work with every command.
acurl [command] [flags]
| Flag | Default | Description |
|---|---|---|
--config string | config file (default ./.acurl.yaml or the user config dir) | |
-q, --quiet | only print the report | |
-v, --verbose | log every request to stderr |
acurl is a free, open-source tool by tragent.io. Found a mistake in these docs? Edit this page.