Esc

API reference

The result object

One scan’s answers for a site: a section for each check, and every finding with its evidence or source.

Example

The following result asked for the ai check only, so its ai section is filled and the other sections are null:

SiteResult
{
  "domain": "wikipedia.org",
  "checks": [
    "ai"
  ],
  "scanId": "0b5a7a6e-1f7e-4d7c-9a4e-2f0d8b1c6a11",
  "scannedAt": "2026-11-10T09:30:06.000Z",
  "complete": true,
  "pending": [],
  "limited": null,
  "finalUrl": "https://www.wikipedia.org/",
  "resultUrl": "https://checkanysite.com/site/wikipedia.org?focus=ai",
  "versions": {
    "signatures": "0.6.1",
    "score": "1.1"
  },
  "ai": {
    "level": "none",
    "builders": [],
    "patterns": []
  },
  "readiness": null,
  "popularity": null,
  "tech": null,
  "dns": null,
  "trust": null,
  "score": null,
  "summary": null,
  "history": null,
  "notes": []
}

Fields

Every result has the following fields. A section is null when the request didn’t ask for its check. The fields of each section follow.

  • domainstring

    The site’s domain, as we read it ("example.com").

  • checksarray of one of: ai, readiness, popularity, tech, dns, trust, summary, history

    The checks this result holds: those asked that the scan answered.

  • scanIdstring

    The scan that made this result.

  • scannedAtdate-time

    When the scan read the site.

  • completeboolean

    False while slow sources (pending) are still being read.

  • pendingarray of string

    The slow sources still being read, if any.

  • limitedobject or null

    Set when the page itself couldn’t be read; the result then comes from outside records.

  • finalUrlstring

    The address the scan ended at, after redirects.

  • resultUrlstring

    The result on our site, with every section and its evidence.

  • versionsobject

    The signature list and score formula the result was made with (/changelog).

  • aiobject or null

    AI website builder traces (check ai).

  • readinessobject or null

    How ready it is for AI tools, out of 100 (check readiness). A result made before we checked AI access takes it from a newer check when there is one (its checkedAt says when), and is null otherwise.

  • popularityobject or null

    Popularity from public ranked lists (check popularity).

  • techobject or null

    The technology it runs on (check tech).

  • dnsobject or null

    Its DNS records (check dns).

  • trustobject or null

    Trust signals (check trust).

  • scoreobject or null

    How established it looks, out of 100 (check trust, with the signals).

  • summaryobject or null

    What it is and who is behind it (check summary).

  • historyobject or null

    Its domain’s history (check history).

  • notesarray of string

    Limits of this scan, in plain words.

limited

  • reasonone of: blocked, robots, private

    blocked (bot protection turned us away), robots (robots.txt keeps us out) or private (the site asks visitors to sign in).

  • messagestring

    What that means, in plain words.

versions

  • signaturesstring

    The signature list’s version.

  • scorestring

    The score formula’s version.

ai

  • levelone of: high, medium, none

    high: an AI builder’s own trace; medium: a combination of its weaker traces only; none: no traces found.

  • buildersarray of object

    Each builder whose traces we found; empty when none.

  • builders[].idstring

    Our id for the builder ("lovable").

  • builders[].namestring

    The builder’s name ("Lovable").

  • builders[].kindone of: ai, general

    ai for AI builders, general for other site builders.

  • builders[].urlstring

    The builder’s own site.

  • builders[].strengthone of: signature, combination

    signature: one trace of its own; combination: weaker traces that count only together.

  • builders[].combinationstring or null

    For a combination, what its traces mean together.

  • builders[].evidencearray of object

    Where each trace was seen, with the exact line.

  • builders[].evidence[].wherestring

    Where we saw it: "index.html, line 14", "response header", "address".

  • builders[].evidence[].snippetstring

    The element, header or excerpt as it appears.

  • builders[].evidence[].matchstring

    The part of the snippet that matched.

  • builders[].evidence[].maskedboolean

    True when email addresses and phone numbers in the snippet are masked.

  • patternsarray of object

    Design patterns common on AI-built pages; they never set the level on their own.

  • patterns[].idstring

    Our id for the pattern.

  • patterns[].namestring

    The pattern’s name.

  • patterns[].notestring

    Why it is weak evidence on its own.

  • patterns[].evidencearray of object

    Where it was seen.

  • patterns[].evidence[].wherestring

    Where we saw it: "index.html, line 14", "response header", "address".

  • patterns[].evidence[].snippetstring

    The element, header or excerpt as it appears.

  • patterns[].evidence[].matchstring

    The part of the snippet that matched.

  • patterns[].evidence[].maskedboolean

    True when email addresses and phone numbers in the snippet are masked.

readiness

  • answerstring

    The answer in a sentence ("Ready for AI: it scores 82 of 100.").

  • notestring

    What it lets AI crawlers do, in a sentence: the site’s choice, never scored.

  • scoreinteger or null

    Out of 100; null when too little could be checked to say.

  • versionstring

    The readiness formula’s version (/changelog).

  • checkedAtdate-time

    When AI access was checked: the scan’s own date, or for a result made before we checked AI access, the newer check that answers in its place.

  • levelobject or null

    The highest level it reaches; null when it reaches none.

  • level.idstring

    The level’s id ("readable").

  • level.namestring

    Its name ("Readable").

  • level.meaningstring

    What reaching it means, in a sentence.

  • levelsarray of object

    Every level, lowest first; one counts once its checks and every level before it are met.

  • levels[].idstring

    findable, readable, ai-friendly or agent-ready; new levels may appear.

  • levels[].namestring

    The level’s name.

  • levels[].reachedboolean

    True when the site reaches it.

  • nextobject or null

    The first level not reached and what it needs; null once every level is.

  • next.idstring

    The level’s id.

  • next.namestring

    Its name.

  • next.needsarray of string

    The keys of the checks it still needs, as checks lists them.

  • comparisonstring or null

    Where the score stands among the most visited sites we read, in a sentence; null without a score.

  • partialboolean

    True when some checks couldn’t be made or are still checking; the rest is scaled to 100.

  • checksarray of object

    Each check that counts, as the score reads it.

  • checks[].keystring

    A stable key: text, listing, facts, structured, sitemap, robots, agents (every file for AI agents at once: one found is enough), llms, links or markdown; new keys may appear.

  • checks[].groupone of: find, read, agents

    find (can AI find its pages?), read (can AI read it?) or agents (can agents use it?).

  • checks[].labelstring

    The check’s name ("Structured data").

  • checks[].stateone of: found, partial, none, info, unknown

    found, partial, none, info or unknown (we couldn’t check it).

  • checks[].valuestring

    What we found, in words.

  • checks[].evidencearray of object

    Where it was seen, with the exact line.

  • checks[].evidence[].wherestring

    Where we saw it: "index.html, line 14", "response header", "address".

  • checks[].evidence[].snippetstring

    The element, header or excerpt as it appears.

  • checks[].evidence[].matchstring

    The part of the snippet that matched.

  • checks[].evidence[].maskedboolean

    True when email addresses and phone numbers in the snippet are masked.

  • checks[].pointsinteger

    The points it earns.

  • checks[].maxinteger

    The most it can earn.

  • checks[].metboolean

    True when it earns its full points.

  • checks[].uncheckedboolean

    True when we couldn’t check it, or it is still checking: it is left out of the score.

  • checks[].optionalboolean

    True for what few sites have yet; it is worth few points.

  • checks[].fixobject or null

    What to do about it; null when it is met or couldn’t be checked.

  • checks[].fix.gaininteger

    The points fixing it would add to the score.

  • checks[].fix.whystring

    Why it matters.

  • checks[].fix.todostring

    What to do, in a line.

  • checks[].fix.promptstring

    A prompt for an AI coding assistant to fix it, with the site’s address and what we found.

  • fixPromptstring or null

    The fixes that aren’t optional, most points first, as one prompt for an AI coding assistant that ends with where to check again; the optional ones once only they are left. Null when there is nothing to fix.

  • crawlersarray of object

    Every AI crawler we know, as the site’s robots.txt treats it; never scored.

  • crawlers[].namestring

    The crawler, as its maker writes it ("GPTBot").

  • crawlers[].companystring or null

    The AI company it belongs to, for those we follow.

  • crawlers[].roleone of: training, answers

    What it fetches pages for: training models, or answers (AI assistants and AI search).

  • crawlers[].accessone of: out, some, in

    out of the whole site, kept from some paths, or let in.

  • crawlers[].lineinteger or null

    The robots.txt line of the group that decides it; null when no group names it.

popularity

  • bandstring

    The best band any list gives the site ("Top 100K"), or "Outside top 1M".

  • bestRankinteger or null

    The best rank behind the band; null when no list ranks the site.

  • ranksarray of object

    Each list we read, with the site’s rank on it.

  • ranks[].liststring

    The list’s name ("Chrome UX Report").

  • ranks[].rankinteger or null

    The rank, or null when the list doesn’t rank the site.

  • ranks[].isBucketboolean

    True when the rank is the edge of a bucket, not an exact position.

  • ranks[].rankedAsstring or null

    The parent name the list ranks, when not the site itself.

  • ranks[].asOfstring

    When the list was produced, as it states it.

  • ranks[].measuresstring

    What the list counts.

  • ranks[].urlstring

    Where the list is published.

  • ranks[].licenseobject or null

    The list’s license, when its terms ask for attribution: keep it when you republish.

  • ranks[].license.namestring

    The license’s name ("CC BY 3.0").

  • ranks[].license.urlstring

    The license’s text.

tech

  • technologiesarray of object

    Each technology the site shows, with its evidence.

  • technologies[].idstring

    Our id for the technology.

  • technologies[].namestring

    Its name ("Next.js").

  • technologies[].categorystring

    Such as "framework", "cms", "analytics", "hosting".

  • technologies[].evidencearray of object

    Where it was seen, with the exact line.

  • technologies[].evidence[].wherestring

    Where we saw it: "index.html, line 14", "response header", "address".

  • technologies[].evidence[].snippetstring

    The element, header or excerpt as it appears.

  • technologies[].evidence[].matchstring

    The part of the snippet that matched.

  • technologies[].evidence[].maskedboolean

    True when email addresses and phone numbers in the snippet are masked.

  • networkobject or null

    A network, never a place: many networks answer from everywhere.

  • network.asninteger

    The autonomous system number, such as 13335.

  • network.namestring

    The organisation announcing the address ("Cloudflare, Inc.").

  • network.prefixstring or null

    The routed block holding the address ("104.16.16.0/20").

  • network.sourcestring

    Who answered.

  • network.checkedAtdate-time

    When we asked.

dns

  • readboolean

    False when the lookup failed: then there are no records to give.

  • recordsarray of object

    Each record we read.

  • records[].namestring

    The name asked about: the domain, its www host, or a policy entry such as _dmarc.

  • records[].typeone of: A, AAAA, CNAME, MX, TXT, NS, CAA, SVCB, HTTPS

    The record type. SVCB and HTTPS come only from _agents, where a site names its AI agents.

  • records[].valuestring

    The record’s value, as the resolver gave it.

  • dnssecboolean or null

    Whether the resolver validated the answer with DNSSEC; null when that didn’t answer.

  • incompletearray of string

    The questions ("example.com TXT") that didn’t answer whole: a record missing from one of them may still exist.

  • sourcestring or null

    The resolver that answered.

  • checkedAtdate-time or null

    When we asked.

  • networkobject or null

    The network announcing the site’s address, never a place.

  • network.asninteger

    The autonomous system number, such as 13335.

  • network.namestring

    The organisation announcing the address ("Cloudflare, Inc.").

  • network.prefixstring or null

    The routed block holding the address ("104.16.16.0/20").

  • network.sourcestring

    Who answered.

  • network.checkedAtdate-time

    When we asked.

trust

  • checksarray of object

    Each signal we looked for, found or not.

  • checks[].keystring

    A stable key such as privacyPolicy or domainAge; new keys may appear.

  • checks[].labelstring

    The signal’s name ("Privacy policy").

  • checks[].stateone of: found, partial, none, info, unknown

    found, partial, none (not found; absence is never an accusation), info (a fact) or unknown (couldn’t check).

  • checks[].valuestring

    What we found, in words.

  • checks[].kindone of: measured, sourced, interpreted

    measured by us, sourced from a named source, or interpreted from what we read.

  • checks[].sourcestring

    Where it came from: our scan or a named source.

  • checks[].evidencearray of object

    Where it was seen, when the page or a record shows it.

  • checks[].evidence[].wherestring

    Where we saw it: "index.html, line 14", "response header", "address".

  • checks[].evidence[].snippetstring

    The element, header or excerpt as it appears.

  • checks[].evidence[].matchstring

    The part of the snippet that matched.

  • checks[].evidence[].maskedboolean

    True when email addresses and phone numbers in the snippet are masked.

  • checks[].pendingboolean

    True while a slow source is still being read.

score

  • totalinteger or null

    Out of 100; null when too little could be read to score fairly.

  • bandstring

    The band the total falls in.

  • withheldboolean

    True when too little could be read; total is null then.

  • versionstring

    The score formula’s version (/changelog).

  • partsarray of object

    The parts the total is made of, each with its points.

  • parts[].keystring

    The part, such as transparency, trackRecord, popularity, security or consistency.

  • parts[].labelstring

    The part’s name.

  • parts[].pointsnumber

    The points it earned.

  • parts[].maxnumber

    The most it could earn from what we could check.

  • parts[].reasonsarray of string

    Why points were given or withheld, one short phrase each.

  • parts[].checkedboolean

    False when none of its inputs could be checked.

  • missingarray of string

    Inputs we couldn’t check; the rest is scaled to 100.

summary

  • titlestring or null

    The page’s own title.

  • descriptionstring or null

    The page’s own description.

  • siteNamestring or null

    The name the site gives itself.

  • languagestring or null

    The page’s language code ("en").

  • kindobject or null

    The kind of site we read it as (a shop, a blog, an app…); null when unclear.

  • kind.idstring

    Our id for the kind ("shop").

  • kind.labelstring

    Its name.

  • kind.confidenceone of: high, medium

    How sure the reading is.

  • summaryobject or null

    An automatic summary whose quotes we checked against the page; null when there is none.

  • summary.textstring

    Two or three sentences: what the site is and offers, as the page presents it.

  • summary.categorystring

    What kind of site the model read it as.

  • summary.offeringsarray of string

    What it offers, in short phrases.

  • summary.audiencestring or null

    Who it is for, when the page says.

  • summary.modelstring

    The model that wrote it.

  • summary.writtenAtdate-time

    When it was written.

  • identityobject or null

    Who is behind the site, by independent sources.

  • identity.namesarray of object

    Each name a source gives for who is behind the site.

  • identity.names[].namestring

    The name as the source gives it.

  • identity.names[].sourcestring

    Where it comes from: structured data, copyright line, Wikidata or certificate.

  • identity.agreeingarray of string

    The sources whose names agree, when at least two do.

  • wikidataarray of object

    The Wikidata items that name the domain as their official website.

  • wikidata[].idstring

    The item’s id ("Q52").

  • wikidata[].labelstring

    Its label.

  • wikidata[].descriptionstring or null

    Its short description.

  • wikidata[].typesarray of string

    What it is an instance of, in English ("search engine").

  • wikidata[].inceptionYearinteger or null

    The year it was founded or launched.

  • wikidata[].urlstring

    Its page on Wikidata.

  • socialarray of object

    The profiles the home page links.

  • social[].networkstring

    The network ("github", "linkedin").

  • social[].handlestring

    The account as its address names it ("acme", "company/acme").

  • social[].urlstring

    The profile’s address.

  • aiPolicyobject or null

    What the site says about AI crawlers using its content.

  • aiPolicy.trainingBlockedarray of string

    AI training crawlers robots.txt keeps out of the whole site.

  • aiPolicy.trainingPartlyarray of string

    Training crawlers it gives rules for some paths only.

  • aiPolicy.assistantsBlockedarray of string

    AI assistants (fetching pages for a person) it keeps out of the whole site.

  • aiPolicy.everyoneBlockedboolean

    True when every crawler is kept out, AI ones included.

  • aiPolicy.contentSignalstring or null

    Its Content Signals line, as written ("search=yes, ai-train=no").

  • aiPolicy.noaiboolean

    True when a noai robots tag or header is set.

  • llmsTxtobject or null

    The site’s llms.txt (llmstxt.org), when it has one.

  • llmsTxt.urlstring

    Where it is.

  • llmsTxt.titlestring

    Its title.

  • llmsTxt.summarystring or null

    The summary it writes for AI assistants.

  • iconUrlstring or null

    Our copy of the site’s icon.

history

  • registrationobject or null

    The domain registry’s record; null when it couldn’t be read.

  • registration.registeredAtdate-time or null

    When the domain was registered; null when the registry doesn’t say.

  • registration.lastChangedAtdate-time or null

    When the record last changed.

  • registration.registrarstring or null

    The registrar, as the registry names it.

  • registration.recordForstring or null

    The registered name, when the record is for a parent name.

  • registration.sourcestring

    The registry server that answered (RDAP or WHOIS).

  • registration.checkedAtdate-time

    When we asked.

  • firstCertificateobject or null

    Certificate Transparency: when a certificate for the domain was first issued.

  • firstCertificate.firstSeendate-time or null

    The earliest certificate’s start date; null when there were too many to read.

  • firstCertificate.countinteger or null

    How many certificates the logs list, when read in full.

  • firstCertificate.sourcestring

    The log search that answered.

  • firstCertificate.checkedAtdate-time

    When we asked.

  • archiveobject or null

    The Internet Archive’s record of the site.

  • archive.firstCapturedate-time or null

    The web archive’s first capture of the site.

  • archive.firstCaptureUrlstring or null

    A link to that capture, to look at.

  • archive.captureYearsarray of integer

    The years with at least one capture, oldest first.

  • archive.sourcestring

    The archive that answered.

  • archive.checkedAtdate-time

    When we asked.