answer-audit
v1.0.0
Published
Grade how ready a website is to be found, parsed, and cited by AI answer engines (ChatGPT, Perplexity, Gemini, Claude). 0-100 score with prioritized fixes.
Maintainers
Readme
answer-audit
Grade how ready a website is to be found, parsed, and cited by AI answer engines — ChatGPT, Perplexity, Gemini, and Claude. One command, ~30 seconds, no API keys, no account: a 0-100 score with the prioritized fixes that move it.

Quickstart
npx answer-audit yourbrand.comanswer-audit v1.0.0
Audited https://yourbrand.com/
Score: 72/100 (C)
AI Crawler Access 21/30 ██████████░░░░
Structured Data 18/25 ██████████░░░░
Content Extractability 20/25 ███████████░░░
Answerability & Trust 13/20 █████████░░░░░
FAIL A2 GPTBot is blocked in robots.txt
FAIL A8 No llms.txt found at /llms.txt
WARN B5 Schema is missing: Product offers.availability
Top fixes
1. Allow GPTBot in robots.txt (User-agent: GPTBot / Allow: /) so ChatGPT can read your pages
2. Add an llms.txt file describing your brand and key pages for AI engines
3. Complete your schema: add Product offers.availabilityWhy
AI answer engines are becoming a major traffic source, but traditional SEO tools ignore the signals they depend on: AI crawler permissions in robots.txt, llms.txt, answer-friendly structured data, and server-rendered extractable content. answer-audit is the 30-second diagnostic for exactly those signals.
Flags
| Flag | Description |
|---|---|
| --json | Machine-readable JSON to stdout |
| --md <file> | Write a shareable Markdown report |
| --min-score <n> | Exit with code 2 when the score is below n (CI gate) |
| --timeout <ms> | Fetch timeout, default 15000 |
| --quiet | Print only the score line |
| --no-color | Disable colors (also respects NO_COLOR) |
| --version | Print the version |
Exit codes: 0 success, 1 fetch/runtime error, 2 score below --min-score.
The checks
Weighted categories: AI Crawler Access 30, Structured Data 25, Content Extractability 25, Answerability & Trust 20. Each check scores pass = 1, warn = 0.5, fail = 0. Grades: A ≥ 90, B ≥ 80, C ≥ 70, D ≥ 60, F below.
| ID | Category | Check | |---|---|---| | A1 | AI Crawler Access | robots.txt exists | | A2 | AI Crawler Access | GPTBot allowed | | A3 | AI Crawler Access | ClaudeBot allowed | | A4 | AI Crawler Access | PerplexityBot allowed | | A5 | AI Crawler Access | Google-Extended allowed | | A6 | AI Crawler Access | CCBot allowed | | A7 | AI Crawler Access | No blanket disallow | | A8 | AI Crawler Access | llms.txt present | | A9 | AI Crawler Access | llms.txt valid | | A10 | AI Crawler Access | Sitemap discoverable | | B1 | Structured Data | JSON-LD present | | B2 | Structured Data | No JSON-LD syntax errors | | B3 | Structured Data | Site identity schema | | B4 | Structured Data | Page-type schema | | B5 | Structured Data | Schema completeness | | C1 | Content Extractability | Title tag | | C2 | Content Extractability | Meta description | | C3 | Content Extractability | Single H1 | | C4 | Content Extractability | Heading hierarchy | | C5 | Content Extractability | Canonical | | C6 | Content Extractability | Text ratio | | C7 | Content Extractability | Semantic landmarks | | C8 | Content Extractability | Image alt coverage | | C9 | Content Extractability | html lang attribute | | D1 | Answerability & Trust | FAQ content | | D2 | Answerability & Trust | Visible dates | | D3 | Answerability & Trust | Attribution | | D4 | Answerability & Trust | Contact/About discoverable | | D5 | Answerability & Trust | HTTPS |
JSON output
{
"url": "yourbrand.com",
"finalUrl": "https://yourbrand.com/",
"fetchedAt": "2026-07-04T12:00:00.000Z",
"score": 72,
"grade": "C",
"categories": [
{ "id": "crawler-access", "label": "AI Crawler Access", "score": 21, "max": 30 }
],
"checks": [
{
"id": "A2",
"category": "crawler-access",
"status": "fail",
"message": "GPTBot is blocked in robots.txt",
"fix": "Allow GPTBot in robots.txt (User-agent: GPTBot / Allow: /) so ChatGPT can read your pages"
}
],
"topFixes": ["..."]
}CI usage
Fail the build when AI-readiness regresses:
- name: AEO gate
run: npx answer-audit https://yourbrand.com --min-score 80 --quietLibrary usage
import { audit } from "answer-audit";
const result = await audit("yourbrand.com");
console.log(result.score, result.grade, result.topFixes);Scope (v1)
Audits the given URL plus site-level files (/robots.txt, /llms.txt, /sitemap.xml). It does not query LLMs, track rankings, render JavaScript (it flags likely client-side rendering instead), or crawl multiple pages. No telemetry of any kind.
Contributing
Issues and PRs welcome. Each check lives in src/checks/ and registers itself in src/checks/index.ts; adding a check means one object with a run(ctx) function and a pair of unit tests. npm test must stay green. The checks table above is generated from the registry with npm run gen:checks.
License
MIT © Arthur Carlson
