How do I audit a website from the command line?
Getting a complete, machine-readable audit with one curl command — and pulling out just the parts you need with jq.
One request, no key, no install: curl -s "https://outrings.com/api/v1/summary?url=example.com". Add | jq to read it, swap summary for a category name to narrow it, and add failedOnly=1 when you only want the problems.
The one-liner
curl -s "https://outrings.com/api/v1/summary?url=example.com" | jqThe scheme is optional, ?url= and ?domain= both work, and GET and POST behave identically. There is nothing to authenticate and nothing to install beyond jq, which is only there to make the JSON readable.
Getting less back
A full report is around 124 KB. Most of the time you want a fraction of that, and it is cheaper to ask for less than to filter afterwards.
| Command | Size | Use when |
|---|---|---|
/api/v1/score?url=… | ~1.7 KB | You need the number only |
/api/v1/security?url=… | ~2–8 KB | The question is about one area |
/api/v1/summary?url=… | ~8.5 KB | Score plus what to fix. Best default. |
/api/v1/full?url=…&format=compact&failedOnly=1 | ~42 KB | Everything wrong, no prose |
/api/v1/full?url=… | ~124 KB | You want the raw evidence too |
Pulling out the parts that matter
Four fields carry most of the value. This shape is a good default:
curl -s "https://outrings.com/api/v1/security?url=example.com" \
| jq '{score, verdict,
findings: [.problems[] | {severity, title, found}],
ranked: [.priorityActions[] | {pointsIfFixed, effort, action}],
notCovered,
undetermined: [.undetermined[]?.id]}'Note the last two. notCovered is what this service never examines; undetermined is what it tried and could not determine. Dropping them gives you a tidier output that quietly implies everything else passed.
Useful recipes
Just the score, for a shell variable
score=$(curl -s "https://outrings.com/api/v1/score?url=example.com" | jq -r '.score')
echo "$score"Only critical and high findings
curl -s "https://outrings.com/api/v1/summary?url=example.com&minSeverity=high" \
| jq -r '.priorityActions[] | "\(.severity)\t\(.title)"'Fail a script when the score drops below a threshold
#!/usr/bin/env bash
set -euo pipefail
threshold=80
score=$(curl -sf "https://outrings.com/api/v1/score?url=$1" | jq -r '.score')
if (( $(echo "$score < $threshold" | bc -l) )); then
echo "FAIL: $1 scored $score, below $threshold" >&2
exit 1
fi
echo "OK: $1 scored $score"The whole report as Markdown, for reading or pasting into a chat
curl -s "https://outrings.com/api/v1/llm?url=example.com"Things worth knowing before you script it
- Use
curl -sfin scripts. Without-f, curl exits zero on a 502 and your script happily parses an error body. - Results are cached for ten minutes. Repeating a URL inside that window is free and does not consume quota. Add
&refresh=1only when you genuinely need a fresh run. - Rate limits are 40 audits an hour, 200 a day per client. Exceeding them returns
429withRetry-After. - Errors are JSON. Non-2xx responses return
{"ok": false, "error": "…"}. Unreachable targets give 502; private or reserved addresses give 403. - Timing. A fast audit is one to eight seconds. Set a generous client timeout — 30 seconds is comfortable.
What our audit reports about this
Every item below is measured directly, not inferred. Run it against your own site and the result names the exact rule or header responsible.
- Every category available as its own endpoint, so a narrow question costs a few kilobytes rather than the whole report.
- Response shaping —
failedOnly,minSeverity,format=compact— applied at the source rather than by filtering afterwards. - Consistent JSON error bodies with meaningful status codes, so a script can distinguish unreachable from forbidden from rate-limited.
- A Markdown rendering of the whole report at
/api/v1/llmfor reading or pasting into an assistant.
For agents and scripts, the same measurement is at
/api/v1/summary?url=yoursite.com —
see the API documentation.
Related questions
Do I need to install anything?
No. curl is present on macOS, Linux and modern Windows. jq is optional and only formats the output — the API works identically without it.
Is there a rate limit?
Forty audits per hour and two hundred per day per client. Each audit makes dozens of requests to the target site, so the limit exists to stop the service being used as a scanning proxy. Cached repeats do not count.
Can I audit a site I do not own?
Yes — it sends ordinary HTTP requests and reads public responses, exactly as a browser does. It is not a vulnerability scanner and does not probe for weaknesses.
How do I get the raw evidence rather than the verdicts?
Use /api/v1/full without format=compact. Every check carries the observed value it was decided from, which is what compact mode strips to save space.
Read next
How do I add a website check to my CI pipeline?
Blocking a deploy when it would break your headers, certificate, indexability or accessibility — with copy-paste config for GitHub Actions and GitLab.
ReadHow do I audit hundreds of websites at once?
Running a portfolio, a client list or a research sample through a measurement API without abusing anyone — including the sites you are measuring.
ReadHow do I monitor a website for regressions automatically?
Catching the silent breakages — an expired certificate, a stripped header, a robots.txt that started blocking Google — before anyone reports them.
ReadHow do I give an AI agent a website tool?
Two ways to let an assistant measure websites — connect an MCP server, or define a tool yourself — with working code for both.
Read