All payments made in the preview are in test mode. Read more

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.

GET/quick-check?url=free · no key
bash
curl "https://answer-engine-ready.lovable.app/api/public/v1/quick-check?url=example.com"
bash — POST
curl -X POST https://answer-engine-ready.lovable.app/api/public/v1/quick-check \
  -H "Content-Type: application/json" \
  -d '{"url":"https://example.com"}'
TypeScript
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);
200 response (truncated)
{
  "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 carries Retry-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:

bash
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"}'
TypeScript
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);
Python
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.

audit1 credit
get_auditfree
list_auditsfree
generate_llms_txt1 credit
validate_llms_txtfree
validate_llms_urlfree
usagefree

Rate limit: 30 requests per minute per key (per account for MCP).

Audits

POST/audits1 credit

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

bash
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"}'
201 response (truncated)
{
  "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…"
  }
}
GET/audits/{id}free

Read a saved audit from your account.

bash
curl https://answer-engine-ready.lovable.app/api/public/v1/audits/AUDIT_ID \
  -H "Authorization: Bearer $LLMREADY_API_KEY"
GET/audits?domain=&limit=free

Your audits, newest first. Filter by domain to track a site over time.

bash
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 Actions
# .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 80

llms.txt

POST/llms-txt/generate1 credit

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

bash
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
POST/llms-txt/validatefree

Validate against the llmstxt.org proposal. Send content to check text, or url to fetch and check a live file.

bash — 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)
bash — live site
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"}'
GET/usagefree
bash
curl 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.

401missing_api_key · invalid_api_keyNo key, a malformed key, or a revoked key.
402pro_requiredThe key's account isn't on Pro.
400invalid_request · invalid_url · invalid_jsonThe body or URL didn't validate. The message says which field.
404not_foundNo audit with that id on your account.
413too_largellms.txt content over 400 KB.
422site_unreachable · fetch_failedWe couldn't fetch the site — it blocked us, timed out or isn't HTML.
429rate_limited · quota_exceededMore 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.
503busy · usage_unavailableThe free quick check is at capacity or metering is briefly down. Honor Retry-After.
500audit_failed · internal_errorSomething 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 401 with a WWW-Authenticate challenge, which MCP clients use to open the sign-in screen. They use your Pro credits.
https://answer-engine-ready.lovable.app/mcp
  • ChatGPT

    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 Code
claude mcp add --transport http llmready https://answer-engine-ready.lovable.app/mcp
Codex CLI
codex mcp add llmready --url https://answer-engine-ready.lovable.app/mcp
Cursor — ~/.cursor/mcp.json
{
  "mcpServers": {
    "llmready": {
      "url": "https://answer-engine-ready.lovable.app/mcp"
    }
  }
}
VS Code — .vscode/mcp.json
{
  "servers": {
    "llmready": {
      "type": "http",
      "url": "https://answer-engine-ready.lovable.app/mcp"
    }
  }
}
bash — call quick_check over MCP without signing in
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.