Developers and agents
LLMready API and MCP server
Run the same AI readiness audit as the web app from code, CI or an AI assistant. Score a URL, get the fixes, and generate or validate llms.txt — as JSON. Agents can start right away with the free quick check: no key, no sign-up.
Free quick check
One call, no API key and no account: get a site's AI search readiness score, grade, category scores, which AI crawlers its robots.txt allows or blocks, whether it has an llms.txt, and the top 3 fixes. It uses the same live crawl and scoring as a full audit, so the score matches — it just doesn't save a report.
/quick-check?url=free · no keycurl "https://answer-engine-ready.lovable.app/api/public/v1/quick-check?url=example.com"curl -X POST https://answer-engine-ready.lovable.app/api/public/v1/quick-check \
-H "Content-Type: application/json" \
-d '{"url":"https://example.com"}'const res = await fetch("https://answer-engine-ready.lovable.app/api/public/v1/quick-check?url=" + encodeURIComponent("example.com"));
const check = await res.json();
if (!res.ok) throw new Error(check.message); // 429: wait Retry-After seconds
console.log(check.score, check.grade, check.topFixes[0]?.fix);{
"url": "https://example.com/",
"finalUrl": "https://example.com/",
"domain": "example.com",
"score": 74,
"grade": "C",
"verified": false,
"measuredAt": "2026-10-30T09:12:44.120Z",
"cached": false,
"categories": [
{ "key": "bot_access", "label": "Bot access", "score": 92, "weight": 0.3 },
{ "key": "extractability", "label": "Content extractability", "score": 68, "weight": 0.25 },
{ "key": "metadata", "label": "Semantic metadata", "score": 61, "weight": 0.2 },
{ "key": "citation", "label": "Citation readiness", "score": 70, "weight": 0.25 }
],
"topFixes": [
{ "label": "Publish /llms.txt", "category": "citation", "impact": 6, "fix": "Add a Markdown index of your key pages at /llms.txt…" }
],
"bots": [ { "name": "GPTBot", "operator": "OpenAI", "purpose": "Model training", "status": "allowed" }, … ],
"llmsTxt": { "found": false, "url": "https://example.com/llms.txt", "valid": null },
"llmsFullTxt": { "found": false, "url": "https://example.com/llms-full.txt" },
"links": {
"fullAudit": "https://answer-engine-ready.lovable.app/scan?url=https%3A%2F%2Fexample.com%2F",
"docs": "https://answer-engine-ready.lovable.app/docs#quick-check"
},
"limits": { "perMinute": 10, "perDay": 100, "remainingToday": 99 },
"note": "A score measures how readable a site is for AI crawlers. It does not guarantee that any AI engine will cite the site."
}- Limits per IP: 10 checks a minute and 100 a rolling day. Responses carry
X-RateLimit-Remaining; a 429 carriesRetry-After. - Checking the same URL again within 10 minutes returns the last result with
"cached": true, so sites aren't crawled over and over. - Need every failing check, a shareable report page, the badge or a generated llms.txt? Send people to
links.fullAudit, or use the Pro API below. - In MCP clients the same check is the quick_check tool, also without signing in. Anonymous calls share this per-IP allowance; signed-in accounts get their own.
Try it
Runs the real endpoint from your browser and counts toward your IP's free limit.
Quick start
Base URL https://answer-engine-ready.lovable.app/api/public/v1. Create a key in your dashboard, export it as LLMREADY_API_KEY, and audit a URL:
curl -X POST https://answer-engine-ready.lovable.app/api/public/v1/audits \
-H "Authorization: Bearer $LLMREADY_API_KEY" \
-H "Content-Type: application/json" \
-d '{"url":"https://example.com"}'const res = await fetch("https://answer-engine-ready.lovable.app/api/public/v1/audits", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.LLMREADY_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({ url: "https://example.com" }),
});
if (!res.ok) throw new Error((await res.json()).message);
const audit = await res.json();
console.log(audit.score, audit.grade, audit.fixes[0]?.fix);import os, requests
res = requests.post(
"https://answer-engine-ready.lovable.app/api/public/v1/audits",
headers={"Authorization": f"Bearer {os.environ['LLMREADY_API_KEY']}"},
json={"url": "https://example.com"},
timeout=60,
)
res.raise_for_status()
audit = res.json()
print(audit["score"], audit["grade"], audit["links"]["report"])Authentication
Send your key as Authorization: Bearer lr_… (or x-api-key). Keys belong to your account, can be revoked anytime and are stored only as a hash — we can't show a key again after you create it.
The MCP server doesn't use keys. quick_check needs nothing; for the other tools your assistant signs you in with OAuth and acts as you.
Credits and limits
The API and MCP server are included with Pro (€19/month or €149/year): 1,000 credits per calendar month (UTC), shared between REST and MCP. Failed calls never use credits. Every response carries X-Credits-Remaining. The free quick check never uses credits.
| audit | 1 credit |
| get_audit | free |
| list_audits | free |
| generate_llms_txt | 1 credit |
| validate_llms_txt | free |
| validate_llms_url | free |
| usage | free |
Rate limit: 30 requests per minute per key (per account for MCP).
Audits
/audits1 creditCrawls the site live — homepage, robots.txt, /llms.txt, /llms-full.txt, sitemap and up to 8 key pages — and scores bot access, content extractability, semantic metadata and citation readiness. Usually 5–20 seconds. The audit is saved with a public report page and badge.
curl -X POST https://answer-engine-ready.lovable.app/api/public/v1/audits \
-H "Authorization: Bearer $LLMREADY_API_KEY" \
-H "Content-Type: application/json" \
-d '{"url":"https://example.com"}'{
"id": "7c1e…",
"url": "https://example.com/",
"domain": "example.com",
"score": 74,
"grade": "C",
"verified": false,
"measuredAt": "2026-10-28T09:12:44.120Z",
"categories": [
{ "key": "bot_access", "label": "Bot access", "score": 92, "weight": 0.3 },
{ "key": "extractability", "label": "Content extractability", "score": 68, "weight": 0.25 },
{ "key": "metadata", "label": "Semantic metadata", "score": 61, "weight": 0.2 },
{ "key": "citation", "label": "Citation readiness", "score": 70, "weight": 0.25 }
],
"fixes": [
{ "label": "Publish /llms.txt", "category": "citation", "impact": 6, "fix": "Add a Markdown index of your key pages at /llms.txt…" }
],
"failingChecks": [ … ],
"bots": [ { "name": "GPTBot", "operator": "OpenAI", "purpose": "Model training", "status": "allowed" }, … ],
"llmsTxt": { "found": false, "url": "https://example.com/llms.txt", "valid": null, "errors": 0, "warnings": 0 },
"llmsFullTxt": { "found": false, "url": "https://example.com/llms-full.txt" },
"links": {
"report": "https://answer-engine-ready.lovable.app/report/7c1e…",
"badge": "https://answer-engine-ready.lovable.app/badge/7c1e…",
"badgeEmbedHtml": "<a href=…><img src=… /></a>",
"scorecardImage": "https://answer-engine-ready.lovable.app/og/7c1e…"
}
}/audits/{id}freeRead a saved audit from your account.
curl https://answer-engine-ready.lovable.app/api/public/v1/audits/AUDIT_ID \
-H "Authorization: Bearer $LLMREADY_API_KEY"/audits?domain=&limit=freeYour audits, newest first. Filter by domain to track a site over time.
curl "https://answer-engine-ready.lovable.app/api/public/v1/audits?domain=example.com&limit=10" \
-H "Authorization: Bearer $LLMREADY_API_KEY"Use it as a CI gate
Fail a deploy when AI readiness drops — e.g. someone blocks GPTBot in robots.txt.
# .github/workflows/ai-readiness.yml — fail the build if the score drops below 80
- name: AI readiness gate
run: |
SCORE=$(curl -s -X POST https://answer-engine-ready.lovable.app/api/public/v1/audits \
-H "Authorization: Bearer ${{ secrets.LLMREADY_API_KEY }}" \
-H "Content-Type: application/json" \
-d '{"url":"https://your-site.com"}' | jq .score)
echo "AI readiness: $SCORE/100"
test "$SCORE" -ge 80llms.txt
/llms-txt/generate1 creditCrawls up to 14 key pages and returns a spec-compliant llms.txt, an llms-full.txt with page content as Markdown, and validation of the generated file.
curl -X POST https://answer-engine-ready.lovable.app/api/public/v1/llms-txt/generate \
-H "Authorization: Bearer $LLMREADY_API_KEY" \
-H "Content-Type: application/json" \
-d '{"url":"https://example.com"}' | jq -r .llmsTxt > llms.txt/llms-txt/validatefreeValidate against the llmstxt.org proposal. Send content to check text, or url to fetch and check a live file.
curl -X POST https://answer-engine-ready.lovable.app/api/public/v1/llms-txt/validate \
-H "Authorization: Bearer $LLMREADY_API_KEY" \
-H "Content-Type: application/json" \
--data-binary @<(jq -Rs '{content: .}' llms.txt)curl -X POST https://answer-engine-ready.lovable.app/api/public/v1/llms-txt/validate \
-H "Authorization: Bearer $LLMREADY_API_KEY" \
-H "Content-Type: application/json" \
-d '{"url":"https://example.com"}'/usagefreecurl https://answer-engine-ready.lovable.app/api/public/v1/usage \
-H "Authorization: Bearer $LLMREADY_API_KEY"Errors
Errors are JSON: { "error": "code", "message": "…" }. Codes are stable; messages are safe to show to users.
| 401 | missing_api_key · invalid_api_key | No key, a malformed key, or a revoked key. |
| 402 | pro_required | The key's account isn't on Pro. |
| 400 | invalid_request · invalid_url · invalid_json | The body or URL didn't validate. The message says which field. |
| 404 | not_found | No audit with that id on your account. |
| 413 | too_large | llms.txt content over 400 KB. |
| 422 | site_unreachable · fetch_failed | We couldn't fetch the site — it blocked us, timed out or isn't HTML. |
| 429 | rate_limited · quota_exceeded | More than 30 requests a minute, more than 10 quick checks a minute or 100 a day, or no credits left this month. Honor Retry-After. |
| 503 | busy · usage_unavailable | The free quick check is at capacity or metering is briefly down. Honor Retry-After. |
| 500 | audit_failed · internal_error | Something broke on our side. Safe to retry once. |
MCP server
Give ChatGPT, Claude, Cursor or any MCP client the same tools: quick_check, audit_url, get_audit, list_audits, generate_llms_txt, validate_llms_txt and get_usage.
- quick_check works without signing in — 10 checks a minute and 100 a day per IP, shared with the free REST quick check. Signed in, the same limits count per account.
- The other tools need your LLMready Pro account. Called without signing in, the server answers
401with aWWW-Authenticatechallenge, which MCP clients use to open the sign-in screen. They use your Pro credits.
https://answer-engine-ready.lovable.app/mcpChatGPT
Settings → Apps & connectors → Advanced → turn on developer mode, then Create → paste the server URL. Choose OAuth to use the Pro tools and sign in to LLMready when asked; quick_check also works with no authentication.
Claude (web and desktop)
Settings → Connectors → Add custom connector → paste the server URL → Connect. quick_check works right away; approve on the LLMready screen when Claude asks you to sign in for the Pro tools.
Claude Code
Run the command below. quick_check works right away; use /mcp inside Claude Code to sign in for the Pro tools.
Cursor
Add the JSON below to ~/.cursor/mcp.json (or Settings → MCP → Add). quick_check works right away; click Connect to sign in for the Pro tools.
claude mcp add --transport http llmready https://answer-engine-ready.lovable.app/mcpcodex mcp add llmready --url https://answer-engine-ready.lovable.app/mcp{
"mcpServers": {
"llmready": {
"url": "https://answer-engine-ready.lovable.app/mcp"
}
}
}{
"servers": {
"llmready": {
"type": "http",
"url": "https://answer-engine-ready.lovable.app/mcp"
}
}
}curl -X POST https://answer-engine-ready.lovable.app/mcp \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-H "MCP-Protocol-Version: 2025-11-25" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"quick_check","arguments":{"url":"example.com"}}}'Crawler log forwarding
Pro sites can forward AI crawler requests from their own servers so the dashboard shows real GPTBot, ClaudeBot and PerplexityBot visits. Each monitored site gets its own ingest key; send batches of up to 500 requests to https://answer-engine-ready.lovable.app/api/public/v1/crawler-hits. Ready-made snippets for Cloudflare Workers, Vercel/Next.js middleware, Express and nginx logs are in each site's Crawler activity tab.
Hits are matched on the user agent, which crawlers declare themselves — so treat counts as what your server saw, not verified identity.
Discovery for agents
Agents and MCP clients can find everything on this site without reading the docs. All of these are public, read-only and CORS-enabled.
- MCP server card
/mcp/server-card— Server ID, version, Streamable HTTP endpoint, protocol versions, and which tools work without sign-in. Also at /.well-known/mcp/server-card.json. - AI catalog
/.well-known/ai-catalog.json— Domain-level entry point listing the server card and the OpenAPI spec. - API catalog (RFC 9727)
/.well-known/api-catalog— Linkset of every API with its spec, docs and status. HEAD returns the api-catalog Link header. - OpenAPI 3.1 spec
/openapi.json— The REST API, including the free quick check. - OAuth protected resource metadata
/.well-known/oauth-protected-resource— Tells MCP clients where to sign in for the account tools. - API status
/api/public/v1/status— Liveness and current API and MCP versions. - llms.txt
/llms.txt— Markdown index of this site for language models; /llms-full.txt has the product facts in one file.
Notes for agents
- No key or sign-in? Use the free quick check first — over REST or as the quick_check MCP tool — and point people to links.fullAudit for the full report.
- Machine-readable docs: /openapi.json and /llms.txt.
- Prefer list_audits or get_audit before running a new audit for the same domain on the same day — reads are free.
- Return the report link to users; it's public and shareable, and the badge embed is in links.badgeEmbedHtml.
- A score measures how readable a site is for AI crawlers. It doesn't guarantee citations in any AI engine — don't promise that.