AgentBeacon

Scores any website on how legible it is to AI agents, and tells the owner what to fix. Scoring version 1.

Try it

Audit example.com

Same, quick mode (no rendering)

Usage

GET /audit?url=https://example.com
ParameterMeaning
urlRequired. The page to audit. A missing scheme is treated as https.
quicktrue skips the rendering step. Much faster, but extractability comes back as unavailable.
fieldsComma list of categories, checks, redirects to trim the response. The score, grade, urls, timestamp, scoring version and unavailable list are always returned.

What it checks

Every check is worth a fixed number of points within its category. A check we could not run (the site blocked us, a service was down, a prerequisite was missing) is excluded from the maths rather than counted as a failure, and its category is listed in unavailable.

discoverability (25% of the score)

Can an agent find your content in the first place.

CheckWhat it looks forWeight
robots-txtrobots.txt present and parseable3
robots-ai-agentsWhich AI agents your robots.txt allows (reported, never scored)not scored
sitemapXML sitemap present4
sitemap-freshSitemap has entries and looks maintained2
feedRSS or Atom feed advertised in the page head2

structure (30% of the score)

Is your content shaped so a machine can read it.

CheckWhat it looks forWeight
llms-txtllms.txt present at the site root8
llms-full-txtllms-full.txt present2
llms-txt-qualityllms.txt follows the spec and its links resolve5
json-ldValid JSON-LD structured data6
json-ld-typesStructured data uses core schema.org types4
heading-outlineOne h1 and no skipped heading levels5

extractability (30% of the score)

Does readable content survive when something that is not a browser reads the page.

CheckWhat it looks forWeight
readabilityReadable article content can be extracted8
extract-wordsExtracted content is substantial4
title-matchExtracted title matches the page title3
raw-vs-renderedContent exists without JavaScript15

identity (15% of the score)

Does an agent learn who you are.

CheckWhat it looks forWeight
title-tagPage has a title tag3
meta-descriptionPage has a meta description3
canonicalCanonical URL declared2
og-basicsOpen Graph title, description and image3
langLanguage declared on the html element2
contactContact or about route discoverable2

Response

{
  "url": "https://example.com",
  "finalUrl": "https://www.example.com/",
  "redirects": ["https://example.com/ -> https://www.example.com/"],
  "timestamp": "2026-07-22T09:00:00.000Z",
  "scoringVersion": "1",
  "score": 62,
  "grade": "C",
  "categories": { "discoverability": 80, "structure": 45, "extractability": 70, "identity": 55 },
  "unavailable": [],
  "checks": [
    {
      "id": "llms-txt",
      "category": "structure",
      "status": "fail",
      "weight": 8,
      "detail": "No llms.txt at this site.",
      "fix": "Add a plain-text llms.txt file at your site root..."
    }
  ],
  "cached": false
}

Check status is one of pass (full credit), warn (half), fail (none), info (reported, never scored), skip (a prerequisite was missing) or unavailable (we could not find out). Grades: A from 90, B from 75, C from 60, D from 40, F below.

Errors

Every error has the same shape with a stable code:

{ "error": "Site unreachable", "code": "unreachable", "hint": "Could not load that page, so there is nothing to score." }

Codes: invalid_url, private_url, unreachable, rate_limited, queue_full, invalid_fields, internal.

Limits

/health · /status