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).

MethodCommand
Homebrewbrew install tragent-io/tap/acurl
Shell scriptcurl -fsSL https://acurl.dev/install.sh | sh
Go 1.26+go install github.com/tragent-io/acurl/cmd/acurl@latest
npmnpx @tragent/acurl <url> or npm i -g @tragent/acurl
Dockerdocker run --rm ghcr.io/tragent-io/acurl <url>
BinariesGitHub 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

ColumnMeaning
PROFILEThe agent acurl pretended to be. Chrome (Browser) is the baseline everything is compared with.
STATUSFinal HTTP status after redirects. - for robots.txt-only tokens, ERR for network failures.
TIME / SIZETotal request time and body size (capped by --max-body).
RESULTThe verdict for this agent.
DETAILSWhy: 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:

VerdictWhenFails by default
errorThe request failed (DNS, TLS, timeout, reset)yes, exit 2
challengedA known WAF challenge or block page: Cloudflare, Akamai, DataDome, PerimeterX, Imperva, Kasada, AWS WAF, Sucuri or a CAPTCHA on an error pageyes
rate-limitedHTTP 429. Retry-After is parsed as seconds or a date.no
blockedAny 4xx or 5xx statusyes
robots-disallowedrobots.txt disallows the agent's token for this URLno
cloakedAllowed, but the visible text is less than 50% similar to the browser's (--cloak-threshold)no
allowedEverything 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:

CategoryProfiles
browserChrome (Browser), the baseline
ai-assistantChatGPT-User, Claude-User, Perplexity-User, MistralAI-User, DuckAssistBot
ai-searchOAI-SearchBot, Claude-SearchBot, PerplexityBot, Amazonbot
ai-trainingGPTBot, ClaudeBot, Claude-Web, anthropic-ai, Meta-ExternalAgent, Bytespider, CCBot, Google-Extended*, Applebot-Extended*
searchGooglebot, Bingbot, Applebot
othercurl (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.

CheckWeight
AI assistants can fetch the page25
AI search crawlers can fetch the page20
Content is in the HTML without JavaScript15
No bot challenges for AI agents10
AI agents see the same content as browsers10
Product structured data is present10
AI agents see the same price and availability10

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

CodeMeaning
0Nothing matched the --fail-on policy
1Something matched (for example an assistant was blocked)
2A 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

-fUse it for
tableTerminals (default). --no-color for plain text.
jsonScripts. Every field, including score checks, directives and product data.
markdownPull request comments and issues
htmlA self-contained report with visible-text diffs
sarifGitHub code scanning
junitTest reporters in any CI
csvSpreadsheets: 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:

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"]}'
EndpointDescription
POST /api/checkRun a check, returns the JSON report
GET /api/check/streamServer-sent events: start, progress, report
GET /api/robots?url=robots.txt audit
GET /api/profilesProfile 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.

FlagDefaultDescription
-a, --agents listonly use these profiles (comma-separated)
--category listonly use profiles in these categories: ai-assistant, ai-search, ai-training, search, other (the browser baseline is always kept)
--cloak-threshold number0.5visible-text similarity below which a response counts as cloaked (0 disables)
-c, --concurrency int5maximum concurrent requests
--diff stringprint a visible-text diff between the browser baseline and this profile
--fail-on stringblocked,challenged,errorexit 1 when any of these occur: blocked, challenged, rate-limited, cloaked, robots, error, score<N, or none
-f, --format stringtableoutput format: table, json, markdown, csv, junit, sarif, html
-I, --headsend HEAD requests (status and headers only)
-H, --header string, repeatableextra header "Name: value" (repeatable)
--http stringforce HTTP version: "1.1" or "2"
-k, --insecureskip TLS certificate verification
--max-body int5242880maximum response body bytes to read per profile
--no-colordisable colored output
--no-robotsskip robots.txt checks
-o, --output stringwrite the report to a file instead of stdout
--profiles stringcustom profiles YAML file
--proxy stringproxy URL (http://, https:// or socks5://)
--renderalso render the page in headless Chrome to measure how much text needs JavaScript
--render-wait duration2show long scripts may run before the rendered page is captured
-X, --request stringGETHTTP method to use
--retries int1retries after network or gateway errors (exponential backoff with jitter)
--sign stringsign bot-profile requests with this Ed25519 key (Web Bot Auth, see acurl keygen)
--signature-agent stringSignature-Agent URL where your key directory is published
-t, --timeout duration30sper-request timeout
--tls stringgoTLS 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.

FlagDefaultDescription
-a, --agents listonly use these profiles (comma-separated)
--category listonly use profiles in these categories: ai-assistant, ai-search, ai-training, search, other (the browser baseline is always kept)
--cloak-threshold number0.5visible-text similarity below which a response counts as cloaked (0 disables)
-c, --concurrency int5maximum concurrent requests
--csvtreat the input as CSV (automatic for .csv files)
--delay duration500msminimum time between checks of URLs on the same host
--fail-on stringblocked,challenged,errorexit 1 when any of these occur: blocked, challenged, rate-limited, cloaked, robots, error, score<N, or none
-f, --format stringtableoutput format: table, json, markdown, csv, junit, sarif, html
-I, --headsend HEAD requests (status and headers only)
-H, --header string, repeatableextra header "Name: value" (repeatable)
--http stringforce HTTP version: "1.1" or "2"
-k, --insecureskip TLS certificate verification
--limit int50maximum URLs to check (0 = no limit)
--max-body int5242880maximum response body bytes to read per profile
--no-colordisable colored output
--no-robotsskip robots.txt checks
-o, --output stringwrite the report to a file instead of stdout
-p, --parallel int2URLs to check at the same time
--profiles stringcustom profiles YAML file
--proxy stringproxy URL (http://, https:// or socks5://)
-X, --request stringGETHTTP method to use
--retries int1retries after network or gateway errors (exponential backoff with jitter)
--sign stringsign bot-profile requests with this Ed25519 key (Web Bot Auth, see acurl keygen)
--signature-agent stringSignature-Agent URL where your key directory is published
--sitemap stringread URLs from a sitemap URL, or "auto:<site>" to use the sitemaps listed in robots.txt
-t, --timeout duration30sper-request timeout
--tls stringgoTLS 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.

FlagDefaultDescription
--no-descriptionsdisable 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.

FlagDefaultDescription
--no-descriptionsdisable 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.

FlagDefaultDescription
--no-descriptionsdisable 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.

FlagDefaultDescription
--no-descriptionsdisable completion descriptions

acurl init

Create a .acurl.yaml config file in the current directory

acurl init [flags]
FlagDefaultDescription
--forceoverwrite 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.

FlagDefaultDescription
--forceoverwrite an existing key file
--key stringprint the directory for an existing key instead of generating one
-o, --output stringacurl-signing.keywhere 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

FlagDefaultDescription
-a, --agents listonly use these profiles (comma-separated)
--allow-privateallow checking private and internal addresses
--category listonly use profiles in these categories: ai-assistant, ai-search, ai-training, search, other (the browser baseline is always kept)
-c, --concurrency int5maximum concurrent requests
-I, --headsend HEAD requests (status and headers only)
-H, --header string, repeatableextra header "Name: value" (repeatable)
--http stringforce HTTP version: "1.1" or "2"
-k, --insecureskip TLS certificate verification
--max-body int5242880maximum response body bytes to read per profile
--no-colordisable colored output
--profiles stringcustom profiles YAML file
--proxy stringproxy URL (http://, https:// or socks5://)
-X, --request stringGETHTTP method to use
--retries int1retries after network or gateway errors (exponential backoff with jitter)
--sign stringsign bot-profile requests with this Ed25519 key (Web Bot Auth, see acurl keygen)
--signature-agent stringSignature-Agent URL where your key directory is published
-t, --timeout duration30sper-request timeout
--tls stringgoTLS 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]
FlagDefaultDescription
--category listonly list these categories
-f, --format stringtableoutput 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.

FlagDefaultDescription
-f, --format stringhtmloutput format: table, json, markdown, csv, junit, sarif, html
--no-colordisable colored output
-o, --output stringwrite 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.

FlagDefaultDescription
-a, --agents listonly use these profiles (comma-separated)
--category listonly use profiles in these categories: ai-assistant, ai-search, ai-training, search, other (the browser baseline is always kept)
-c, --concurrency int5maximum concurrent requests
-f, --format stringtableoutput format: table or json
-I, --headsend HEAD requests (status and headers only)
-H, --header string, repeatableextra header "Name: value" (repeatable)
--http stringforce HTTP version: "1.1" or "2"
-k, --insecureskip TLS certificate verification
--max-body int5242880maximum response body bytes to read per profile
--no-colordisable colored output
--profiles stringcustom profiles YAML file
--proxy stringproxy URL (http://, https:// or socks5://)
-X, --request stringGETHTTP method to use
--retries int1retries after network or gateway errors (exponential backoff with jitter)
--sign stringsign bot-profile requests with this Ed25519 key (Web Bot Auth, see acurl keygen)
--signature-agent stringSignature-Agent URL where your key directory is published
-t, --timeout duration30sper-request timeout
--tls stringgoTLS 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.

FlagDefaultDescription
--addr string127.0.0.1:8080address to listen on
-a, --agents listonly use these profiles (comma-separated)
--allow-privateallow checking private and internal addresses
--category listonly use profiles in these categories: ai-assistant, ai-search, ai-training, search, other (the browser baseline is always kept)
-c, --concurrency int5maximum concurrent requests
-I, --headsend HEAD requests (status and headers only)
-H, --header string, repeatableextra header "Name: value" (repeatable)
--http stringforce HTTP version: "1.1" or "2"
-k, --insecureskip TLS certificate verification
--max-body int5242880maximum response body bytes to read per profile
--no-colordisable colored output
--profiles stringcustom profiles YAML file
--proxy stringproxy URL (http://, https:// or socks5://)
--renderallow headless Chrome rendering from the UI
-X, --request stringGETHTTP method to use
--retries int1retries after network or gateway errors (exponential backoff with jitter)
--sign stringsign bot-profile requests with this Ed25519 key (Web Bot Auth, see acurl keygen)
--signature-agent stringSignature-Agent URL where your key directory is published
-t, --timeout duration30sper-request timeout
--tls stringgoTLS 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.

FlagDefaultDescription
-a, --agents listonly use these profiles (comma-separated)
--category listonly use profiles in these categories: ai-assistant, ai-search, ai-training, search, other (the browser baseline is always kept)
-c, --concurrency int5maximum concurrent requests
-I, --headsend HEAD requests (status and headers only)
-H, --header string, repeatableextra header "Name: value" (repeatable)
--http stringforce HTTP version: "1.1" or "2"
-k, --insecureskip TLS certificate verification
--interval duration1h0m0stime between checks (0 = check once)
--max-body int5242880maximum response body bytes to read per profile
--min-score-delta int5report score changes of at least this many points
--no-colordisable colored output
--no-robotsskip robots.txt checks
--profiles stringcustom profiles YAML file
--proxy stringproxy URL (http://, https:// or socks5://)
-X, --request stringGETHTTP method to use
--retries int1retries after network or gateway errors (exponential backoff with jitter)
--sign stringsign bot-profile requests with this Ed25519 key (Web Bot Auth, see acurl keygen)
--signature-agent stringSignature-Agent URL where your key directory is published
--state stringfile that keeps the last results between runs
-t, --timeout duration30sper-request timeout
--tls stringgoTLS fingerprint for bot profiles: "go" (like real crawlers) or "chrome" (only the user agent differs)
--webhook stringPOST changes to this URL
--webhook-format stringjsonwebhook 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]
FlagDefaultDescription
--config stringconfig file (default ./.acurl.yaml or the user config dir)
-q, --quietonly print the report
-v, --verboselog every request to stderr

acurl is a free, open-source tool by tragent.io. Found a mistake in these docs? Edit this page.