---
title: "The result object · API docs · CheckAnySite"
description: "One scan’s answers for a site: a section for each check, and every finding with its evidence or source."
url: "https://docs.checkanysite.com/api/result"
---

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`:

```json 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.

- `domain` string

  The site’s domain, as we read it ("example.com").
- `checks` array of one of: ai, readiness, popularity, tech, dns, trust, summary, history

  The checks this result holds: those asked that the scan answered.
- `scanId` string

  The scan that made this result.
- `scannedAt` date-time

  When the scan read the site.
- `complete` boolean

  False while slow sources (`pending`) are still being read.
- `pending` array of string

  The slow sources still being read, if any.
- `limited` object or null

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

  The address the scan ended at, after redirects.
- `resultUrl` string

  The result on our site, with every section and its evidence.
- `versions` object

  The signature list and score formula the result was made with (/changelog).
- `ai` object or null

  AI website builder traces (check `ai`).
- `readiness` object 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.
- `popularity` object or null

  Popularity from public ranked lists (check `popularity`).
- `tech` object or null

  The technology it runs on (check `tech`).
- `dns` object or null

  Its DNS records (check `dns`).
- `trust` object or null

  Trust signals (check `trust`).
- `score` object or null

  How established it looks, out of 100 (check `trust`, with the signals).
- `summary` object or null

  What it is and who is behind it (check `summary`).
- `history` object or null

  Its domain’s history (check `history`).
- `notes` array of string

  Limits of this scan, in plain words.

## `limited`

- `reason` one 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).
- `message` string

  What that means, in plain words.

## `versions`

- `signatures` string

  The signature list’s version.
- `score` string

  The score formula’s version.

## `ai`

- `level` one of: high, medium, none

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

  Each builder whose traces we found; empty when none.
- `builders[].id` string

  Our id for the builder ("lovable").
- `builders[].name` string

  The builder’s name ("Lovable").
- `builders[].kind` one of: ai, general

  `ai` for AI builders, `general` for other site builders.
- `builders[].url` string

  The builder’s own site.
- `builders[].strength` one of: signature, combination

  `signature`: one trace of its own; `combination`: weaker traces that count only together.
- `builders[].combination` string or null

  For a combination, what its traces mean together.
- `builders[].evidence` array of object

  Where each trace was seen, with the exact line.
- `builders[].evidence[].where` string

  Where we saw it: "index.html, line 14", "response header", "address".
- `builders[].evidence[].snippet` string

  The element, header or excerpt as it appears.
- `builders[].evidence[].match` string

  The part of the snippet that matched.
- `builders[].evidence[].masked` boolean

  True when email addresses and phone numbers in the snippet are masked.
- `patterns` array of object

  Design patterns common on AI-built pages; they never set the level on their own.
- `patterns[].id` string

  Our id for the pattern.
- `patterns[].name` string

  The pattern’s name.
- `patterns[].note` string

  Why it is weak evidence on its own.
- `patterns[].evidence` array of object

  Where it was seen.
- `patterns[].evidence[].where` string

  Where we saw it: "index.html, line 14", "response header", "address".
- `patterns[].evidence[].snippet` string

  The element, header or excerpt as it appears.
- `patterns[].evidence[].match` string

  The part of the snippet that matched.
- `patterns[].evidence[].masked` boolean

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

## `readiness`

- `answer` string

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

  What it lets AI crawlers do, in a sentence: the site’s choice, never scored.
- `score` integer or null

  Out of 100; null when too little could be checked to say.
- `version` string

  The readiness formula’s version (/changelog).
- `checkedAt` date-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.
- `level` object or null

  The highest level it reaches; null when it reaches none.
- `level.id` string

  The level’s id ("readable").
- `level.name` string

  Its name ("Readable").
- `level.meaning` string

  What reaching it means, in a sentence.
- `levels` array of object

  Every level, lowest first; one counts once its checks and every level before it are met.
- `levels[].id` string

  `findable`, `readable`, `ai-friendly` or `agent-ready`; new levels may appear.
- `levels[].name` string

  The level’s name.
- `levels[].reached` boolean

  True when the site reaches it.
- `next` object or null

  The first level not reached and what it needs; null once every level is.
- `next.id` string

  The level’s id.
- `next.name` string

  Its name.
- `next.needs` array of string

  The keys of the checks it still needs, as `checks` lists them.
- `comparison` string or null

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

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

  Each check that counts, as the score reads it.
- `checks[].key` string

  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[].group` one of: find, read, agents

  `find` (can AI find its pages?), `read` (can AI read it?) or `agents` (can agents use it?).
- `checks[].label` string

  The check’s name ("Structured data").
- `checks[].state` one of: found, partial, none, info, unknown

  `found`, `partial`, `none`, `info` or `unknown` (we couldn’t check it).
- `checks[].value` string

  What we found, in words.
- `checks[].evidence` array of object

  Where it was seen, with the exact line.
- `checks[].evidence[].where` string

  Where we saw it: "index.html, line 14", "response header", "address".
- `checks[].evidence[].snippet` string

  The element, header or excerpt as it appears.
- `checks[].evidence[].match` string

  The part of the snippet that matched.
- `checks[].evidence[].masked` boolean

  True when email addresses and phone numbers in the snippet are masked.
- `checks[].points` integer

  The points it earns.
- `checks[].max` integer

  The most it can earn.
- `checks[].met` boolean

  True when it earns its full points.
- `checks[].unchecked` boolean

  True when we couldn’t check it, or it is still checking: it is left out of the score.
- `checks[].optional` boolean

  True for what few sites have yet; it is worth few points.
- `checks[].fix` object or null

  What to do about it; null when it is met or couldn’t be checked.
- `checks[].fix.gain` integer

  The points fixing it would add to the score.
- `checks[].fix.why` string

  Why it matters.
- `checks[].fix.todo` string

  What to do, in a line.
- `checks[].fix.prompt` string

  A prompt for an AI coding assistant to fix it, with the site’s address and what we found.
- `fixPrompt` string 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.
- `crawlers` array of object

  Every AI crawler we know, as the site’s robots.txt treats it; never scored.
- `crawlers[].name` string

  The crawler, as its maker writes it ("GPTBot").
- `crawlers[].company` string or null

  The AI company it belongs to, for those we follow.
- `crawlers[].role` one of: training, answers

  What it fetches pages for: `training` models, or `answers` (AI assistants and AI search).
- `crawlers[].access` one of: out, some, in

  `out` of the whole site, kept from `some` paths, or let `in`.
- `crawlers[].line` integer or null

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

## `popularity`

- `band` string

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

  The best rank behind the band; null when no list ranks the site.
- `ranks` array of object

  Each list we read, with the site’s rank on it.
- `ranks[].list` string

  The list’s name ("Chrome UX Report").
- `ranks[].rank` integer or null

  The rank, or null when the list doesn’t rank the site.
- `ranks[].isBucket` boolean

  True when the rank is the edge of a bucket, not an exact position.
- `ranks[].rankedAs` string or null

  The parent name the list ranks, when not the site itself.
- `ranks[].asOf` string

  When the list was produced, as it states it.
- `ranks[].measures` string

  What the list counts.
- `ranks[].url` string

  Where the list is published.
- `ranks[].license` object or null

  The list’s license, when its terms ask for attribution: keep it when you republish.
- `ranks[].license.name` string

  The license’s name ("CC BY 3.0").
- `ranks[].license.url` string

  The license’s text.

## `tech`

- `technologies` array of object

  Each technology the site shows, with its evidence.
- `technologies[].id` string

  Our id for the technology.
- `technologies[].name` string

  Its name ("Next.js").
- `technologies[].category` string

  Such as "framework", "cms", "analytics", "hosting".
- `technologies[].evidence` array of object

  Where it was seen, with the exact line.
- `technologies[].evidence[].where` string

  Where we saw it: "index.html, line 14", "response header", "address".
- `technologies[].evidence[].snippet` string

  The element, header or excerpt as it appears.
- `technologies[].evidence[].match` string

  The part of the snippet that matched.
- `technologies[].evidence[].masked` boolean

  True when email addresses and phone numbers in the snippet are masked.
- `network` object or null

  A network, never a place: many networks answer from everywhere.
- `network.asn` integer

  The autonomous system number, such as 13335.
- `network.name` string

  The organisation announcing the address ("Cloudflare, Inc.").
- `network.prefix` string or null

  The routed block holding the address ("104.16.16.0/20").
- `network.source` string

  Who answered.
- `network.checkedAt` date-time

  When we asked.

## `dns`

- `read` boolean

  False when the lookup failed: then there are no records to give.
- `records` array of object

  Each record we read.
- `records[].name` string

  The name asked about: the domain, its www host, or a policy entry such as `_dmarc`.
- `records[].type` one 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[].value` string

  The record’s value, as the resolver gave it.
- `dnssec` boolean or null

  Whether the resolver validated the answer with DNSSEC; null when that didn’t answer.
- `incomplete` array of string

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

  The resolver that answered.
- `checkedAt` date-time or null

  When we asked.
- `network` object or null

  The network announcing the site’s address, never a place.
- `network.asn` integer

  The autonomous system number, such as 13335.
- `network.name` string

  The organisation announcing the address ("Cloudflare, Inc.").
- `network.prefix` string or null

  The routed block holding the address ("104.16.16.0/20").
- `network.source` string

  Who answered.
- `network.checkedAt` date-time

  When we asked.

## `trust`

- `checks` array of object

  Each signal we looked for, found or not.
- `checks[].key` string

  A stable key such as `privacyPolicy` or `domainAge`; new keys may appear.
- `checks[].label` string

  The signal’s name ("Privacy policy").
- `checks[].state` one 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[].value` string

  What we found, in words.
- `checks[].kind` one of: measured, sourced, interpreted

  `measured` by us, `sourced` from a named source, or `interpreted` from what we read.
- `checks[].source` string

  Where it came from: our scan or a named source.
- `checks[].evidence` array of object

  Where it was seen, when the page or a record shows it.
- `checks[].evidence[].where` string

  Where we saw it: "index.html, line 14", "response header", "address".
- `checks[].evidence[].snippet` string

  The element, header or excerpt as it appears.
- `checks[].evidence[].match` string

  The part of the snippet that matched.
- `checks[].evidence[].masked` boolean

  True when email addresses and phone numbers in the snippet are masked.
- `checks[].pending` boolean

  True while a slow source is still being read.

## `score`

- `total` integer or null

  Out of 100; null when too little could be read to score fairly.
- `band` string

  The band the total falls in.
- `withheld` boolean

  True when too little could be read; `total` is null then.
- `version` string

  The score formula’s version (/changelog).
- `parts` array of object

  The parts the total is made of, each with its points.
- `parts[].key` string

  The part, such as `transparency`, `trackRecord`, `popularity`, `security` or `consistency`.
- `parts[].label` string

  The part’s name.
- `parts[].points` number

  The points it earned.
- `parts[].max` number

  The most it could earn from what we could check.
- `parts[].reasons` array of string

  Why points were given or withheld, one short phrase each.
- `parts[].checked` boolean

  False when none of its inputs could be checked.
- `missing` array of string

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

## `summary`

- `title` string or null

  The page’s own title.
- `description` string or null

  The page’s own description.
- `siteName` string or null

  The name the site gives itself.
- `language` string or null

  The page’s language code ("en").
- `kind` object or null

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

  Our id for the kind ("shop").
- `kind.label` string

  Its name.
- `kind.confidence` one of: high, medium

  How sure the reading is.
- `summary` object or null

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

  Two or three sentences: what the site is and offers, as the page presents it.
- `summary.category` string

  What kind of site the model read it as.
- `summary.offerings` array of string

  What it offers, in short phrases.
- `summary.audience` string or null

  Who it is for, when the page says.
- `summary.model` string

  The model that wrote it.
- `summary.writtenAt` date-time

  When it was written.
- `identity` object or null

  Who is behind the site, by independent sources.
- `identity.names` array of object

  Each name a source gives for who is behind the site.
- `identity.names[].name` string

  The name as the source gives it.
- `identity.names[].source` string

  Where it comes from: `structured data`, `copyright line`, `Wikidata` or `certificate`.
- `identity.agreeing` array of string

  The sources whose names agree, when at least two do.
- `wikidata` array of object

  The Wikidata items that name the domain as their official website.
- `wikidata[].id` string

  The item’s id ("Q52").
- `wikidata[].label` string

  Its label.
- `wikidata[].description` string or null

  Its short description.
- `wikidata[].types` array of string

  What it is an instance of, in English ("search engine").
- `wikidata[].inceptionYear` integer or null

  The year it was founded or launched.
- `wikidata[].url` string

  Its page on Wikidata.
- `social` array of object

  The profiles the home page links.
- `social[].network` string

  The network ("github", "linkedin").
- `social[].handle` string

  The account as its address names it ("acme", "company/acme").
- `social[].url` string

  The profile’s address.
- `aiPolicy` object or null

  What the site says about AI crawlers using its content.
- `aiPolicy.trainingBlocked` array of string

  AI training crawlers robots.txt keeps out of the whole site.
- `aiPolicy.trainingPartly` array of string

  Training crawlers it gives rules for some paths only.
- `aiPolicy.assistantsBlocked` array of string

  AI assistants (fetching pages for a person) it keeps out of the whole site.
- `aiPolicy.everyoneBlocked` boolean

  True when every crawler is kept out, AI ones included.
- `aiPolicy.contentSignal` string or null

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

  True when a `noai` robots tag or header is set.
- `llmsTxt` object or null

  The site’s llms.txt (llmstxt.org), when it has one.
- `llmsTxt.url` string

  Where it is.
- `llmsTxt.title` string

  Its title.
- `llmsTxt.summary` string or null

  The summary it writes for AI assistants.
- `iconUrl` string or null

  Our copy of the site’s icon.

## `history`

- `registration` object or null

  The domain registry’s record; null when it couldn’t be read.
- `registration.registeredAt` date-time or null

  When the domain was registered; null when the registry doesn’t say.
- `registration.lastChangedAt` date-time or null

  When the record last changed.
- `registration.registrar` string or null

  The registrar, as the registry names it.
- `registration.recordFor` string or null

  The registered name, when the record is for a parent name.
- `registration.source` string

  The registry server that answered (RDAP or WHOIS).
- `registration.checkedAt` date-time

  When we asked.
- `firstCertificate` object or null

  Certificate Transparency: when a certificate for the domain was first issued.
- `firstCertificate.firstSeen` date-time or null

  The earliest certificate’s start date; null when there were too many to read.
- `firstCertificate.count` integer or null

  How many certificates the logs list, when read in full.
- `firstCertificate.source` string

  The log search that answered.
- `firstCertificate.checkedAt` date-time

  When we asked.
- `archive` object or null

  The Internet Archive’s record of the site.
- `archive.firstCapture` date-time or null

  The web archive’s first capture of the site.
- `archive.firstCaptureUrl` string or null

  A link to that capture, to look at.
- `archive.captureYears` array of integer

  The years with at least one capture, oldest first.
- `archive.source` string

  The archive that answered.
- `archive.checkedAt` date-time

  When we asked.
