CrawlCheck Reports API
The Reports API from CrawlCheck — 1 operation(s) for reports.
The Reports API from CrawlCheck — 1 operation(s) for reports.
Every API here is available over the APIs.io API and to AI agents over MCP.
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
find_apisBrowse and filter every API in the catalog.get_api_artifactsOne API's artifacts, grouped by type.get_openapiThe primary OpenAPI for this API.find_similar_apisAPIs that look like this one.apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.resolveTurn a domain, URL or GitHub org into the provider it belongs to.find_cohortsEvery scored population of providers in the catalog.curl "https://apis.io/api/v1/apis/crawlcheck-io:crawlcheck-io-reports-api"
curl "https://apis.io/api/v1/apis?limit=25"
Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.
Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.
A second provider on the same verified email joins the account you already have.
openapi: 3.2.0
info:
title: Crawlcheck Io Reports API
version: '1'
contact:
name: CrawlCheck
url: https://crawlcheck.io/policy
email: hello@crawlcheck.io
license:
name: Terms
url: https://crawlcheck.io/policy
x-core-contract:
promise: 'These operations are the core contract. They stay at /api/v1 and keep answering for at least 180 days after any /api/v2 is announced; their stable fields change only in a new major version, and their provisional fields only after 30 days'' notice, per /docs/api/compatibility. Verifying what they return needs none of these calls: crawlcheck-verify.mjs checks a document on your machine against the published keys (/.well-known/http-message-signatures-directory) and the rotation record, read once with --online or saved for --keys. Everything else documented here is useful but secondary, and may change with the notice its fields'' tags promise.'
operations:
- method: GET
path: /api/v1/resolve
operationId: resolveDomainV1
- method: POST
path: /api/v1/resolve
operationId: resolveBatchV1
- method: POST
path: /api/v1/preflight
operationId: preflightV1
- method: GET
path: /api/v1/decisions/{sha256}
operationId: decisionCheckV1
- method: GET
path: /api/v1/revocations
operationId: revocations
- method: GET
path: /api/v1/visitor
operationId: visitorResolveV1
- method: POST
path: /api/v1/visitor
operationId: visitorResolveBatchV1
- method: GET
path: /api/v1/mcp/scan
operationId: mcpScanUrl
- method: POST
path: /api/v1/mcp/lock/check
operationId: mcpLockCheck
list: https://crawlcheck.io/api/v1/core
description: 'Operations tagged Reports across 2 of this provider''s published API definitions: crawlcheck-io-openapi.json, crawlcheck-io-openapi.yml. Each path carries the servers of the definition it was published in.'
servers:
- url: https://crawlcheck.io
tags:
- name: Reports
paths:
/api/v1/reports/{id}:
get:
operationId: getReportV1
summary: A stored report as PublicReportV1 (licence or read-scoped API key)
parameters:
- name: id
in: path
required: true
schema:
type: string
- name: x-crawlcheck-key
in: header
required: true
schema:
type: string
responses:
'200':
description: PublicReportV1
content:
application/json:
schema:
$ref: '#/components/schemas/PublicReportV1'
examples:
worked:
summary: The stored report, same shape as a v1 scan. Produced by the production Worker code against a stored copy of a real record; ids, keys and tokens are placeholders.
value:
schema: https://crawlcheck.io/api/v1/schema#PublicReportV1
version: '1.0'
id: qfk9rgfwyg
domain: crawlcheck.io
path: /
scanned_host: crawlcheck.io
scanned_at: '2026-10-01T00:20:26.380Z'
score_version: 26
grade: A
overall: 98
grade_detail:
capped: false
cap: null
cap_reason: null
sections:
- {}
findings: []
findings_withheld: null
score_ledger:
score: 98
letter: A
cap: null
capped: false
held_at_reach: false
matches_record: true
rows: []
rows_withheld: 3
combined: {}
next_letter: {}
method: 'Points per row: the score recomputed with that one row passing, minus the score…'
root_causes: []
findings_summary: null
provenance:
v: 1
observer: crawlcheck-worker
observer_build: 6cfcf7ce-8085-465a-8512-f0f20b9667b3
observer_tag: e601314400977abe
vantage: {}
rulepack: sv26
audit_version: 4
meg_v: 3
scope: full
observed_at: '2026-10-01T00:20:26.380Z'
stored_at: '2026-10-01T00:20:41.321Z'
artifacts: manifest:b0779b26a1e4c773344541a287e961f901ba26ae918333baf571aff331b32eae
findings: 0
decisions: 0
manifest_signature: {}
confidence:
v: 1
sections_scored: {}
identities_answered: {}
fetches_kept: {}
stage_failures: 0
non_observations: 6
non_observations_attempted: 2
vantages: 1
refused: false
note: counts and ratios only - there is no composite confidence number, because the p…
bitemporal:
v: 1
recorded_at: '2026-10-01T00:20:26.380Z'
axes: {}
facts: []
non_observations:
- {}
checks:
- {}
agentview:
- {}
nap:
phones: []
addresses: []
citations: []
verified: []
hours: []
conflicts: {}
lineage: {}
fact_lineage:
v: 1
scored: false
facts: []
disagree: []
single_source: []
subject: {}
read: {}
headroom:
gain: 2
failing: 3
history:
- {}
proof:
digest: 66f29854593df99bde371941b15765ef34061fbdae05a9f1e802ec6a8afa5fdf
algorithm: sha256 over the canonical measurement subject described at https://crawlcheck.i…
anchored: daily, OpenTimestamps to Bitcoin
verify: https://crawlcheck.io/proof
links:
report: https://crawlcheck.io/r/qfk9rgfwyg
graph: https://crawlcheck.io/api/graph/qfk9rgfwyg
raw: https://crawlcheck.io/r/qfk9rgfwyg.raw.json
schema: https://crawlcheck.io/api/v1/schema
docs: https://crawlcheck.io/docs/api#api-v-scan
'401':
description: 'ErrorV1: unauthorised'
'404':
description: 'ErrorV1: not_found'
x-codeSamples:
- lang: Shell
label: curl
source: "curl -s \\\n -H \"x-crawlcheck-key: $CRAWLCHECK_KEY\" \\\n 'https://crawlcheck.io/api/v1/reports/qfk9rgfwyg'"
security:
- licenceKey: []
- bearer: []
x-auth: 'a licence key (x-crawlcheck-key or Authorization: Bearer) or the signed-in /manage session; 401 or 403 otherwise'
tags:
- Reports
servers:
- url: https://crawlcheck.io
components:
schemas:
PublicReportV1:
type: object
additionalProperties: false
required:
- schema
- version
- id
- domain
- scanned_at
- grade
- overall
- sections
- findings
- proof
properties:
schema:
type: string
x-stability: stable
version:
const: '1.0'
x-stability: stable
id:
type:
- string
- 'null'
x-stability: stable
domain:
type:
- string
- 'null'
x-stability: stable
path:
type:
- string
- 'null'
x-stability: stable
scanned_host:
type:
- string
- 'null'
x-stability: stable
scanned_at:
type:
- string
- 'null'
x-stability: stable
score_version:
type:
- number
- 'null'
x-stability: stable
grade:
type:
- string
- 'null'
x-stability: stable
overall:
type:
- number
- 'null'
x-stability: stable
grade_detail:
type: object
properties:
capped:
type: boolean
x-stability: stable
cap:
type:
- string
- 'null'
x-stability: stable
cap_reason:
type:
- string
- 'null'
x-stability: stable
x-stability: stable
sections:
type: array
items:
type: object
properties:
id:
type:
- string
- 'null'
x-stability: stable
title:
type:
- string
- 'null'
x-stability: stable
score:
type:
- number
- 'null'
description: null means not measured, never zero
x-stability: stable
x-stability: stable
findings:
type: array
items:
type: object
properties:
code:
type:
- string
- 'null'
x-stability: stable
path:
type:
- string
- 'null'
x-stability: stable
severity:
type:
- number
- 'null'
x-stability: stable
title:
type:
- string
- 'null'
x-stability: stable
detail:
type:
- string
- 'null'
x-stability: stable
meaning:
type:
- string
- 'null'
x-stability: stable
evidence:
type:
- string
- 'null'
maxLength: 500
x-stability: stable
fid:
type:
- string
- 'null'
x-stability: stable
decision_id:
type:
- string
- 'null'
x-stability: stable
graph:
type:
- string
- 'null'
x-stability: stable
locked:
type: boolean
description: 'true on an unlicensed read for every finding but the top one: title, severity and path are present, the rest is withheld'
x-stability: stable
fingerprint:
type:
- string
- 'null'
description: code|path; stable across scans of the same domain; null on a locked finding
x-stability: stable
state:
type:
- string
- 'null'
enum:
- new
- persisted
- worsened
- improved
- regressed
- resolved
- rule-changed
- null
description: lifecycle on this scan; null when the domain has no stored history
x-stability: provisional
first_seen:
type:
- string
- 'null'
x-stability: provisional
scans_seen:
type:
- number
- 'null'
x-stability: provisional
recurrences:
type:
- number
- 'null'
x-stability: provisional
valid_time:
type:
- object
- 'null'
description: 'bitemporal: when the condition held on the site (valid_from / valid_to as after-by intervals between observations; null ends are unknown or still open) and when CrawlCheck recorded it (recorded_at, superseded_at)'
x-stability: provisional
x-stability: stable
findings_withheld:
type:
- string
- 'null'
description: 'Set on an unlicensed read: every finding is listed by title, severity and path; detail, evidence and code beyond the top one are withheld'
x-stability: stable
findings_summary:
type:
- object
- 'null'
properties:
total:
type:
- number
- 'null'
x-stability: stable
serious:
type:
- number
- 'null'
x-stability: stable
by_severity:
type:
- object
- 'null'
x-stability: provisional
x-stability: stable
provenance:
type:
- object
- 'null'
description: Observer build, vantage, rule version, observed and stored times, sealed manifest
x-stability: provisional
root_causes:
type:
- array
- 'null'
description: 'Findings that share one cause or one fix, formed only from evidence in this record (e.g. robots.txt, the sitemap and llms.txt all answering with the site''s HTML page). With a licence: cause, fix, generators, evidence and members. An unlicensed v1 read is built from the locked record, so the list is empty there; /api/v1/machine-record shows a group the top finding belongs to, by kind and size'
x-stability: provisional
fix_impact:
type:
- array
- 'null'
description: 'One line per fix that would change this record (robots, sitemap, llms, entitymap, edge-bots, cache, page-code, chain, hsts, host-pair), best first: findings and rows it clears, the other fixes some of its rows also need, the score and letter after (the formula rerun), root causes it closes and certificate criteria it flips. Null on an unlicensed read; /api/impact has the names'
x-stability: provisional
score_ledger:
type:
- object
- 'null'
description: 'combined {all_rows_fixed, all_findings_cleared, both} and next_letter {target, reachable, ...} are recomputed, never summed. What each decision moved. rows[]: every failing scored row with points = the score recomputed with that row passing minus the score now (same formula, Reach + 15 ceiling included), points_section_average, and why a row moves nothing; withheld (rows_withheld) where the fix list is. Findings move no points: each finding''s score_effect states the letter cap it sets, whether it binds, and the letter without it.'
x-stability: provisional
confidence:
type:
- object
- 'null'
description: 'Counts and ratios behind the reading: sections_scored, identities_answered, fetches_kept, stage_failures, non_observations, vantages. No composite number, because the parts do not combine into one honestly'
x-stability: provisional
bitemporal:
type:
- object
- 'null'
description: 'Each stated fact with two times: when CrawlCheck observed it (observed_from, observed_last, removed_at) and when the site says it became true (valid time, null when the site does not say)'
x-stability: provisional
non_observations:
type:
- array
- 'null'
maxItems: 80
items:
type: object
properties:
subject:
type:
- string
- 'null'
x-stability: provisional
state:
type:
- string
- 'null'
x-stability: provisional
reason:
type:
- string
- 'null'
x-stability: provisional
attempted:
type:
- boolean
- 'null'
x-stability: provisional
description: What was not measured on this scan and why; an unmeasured subject is never scored as a pass or a fail
x-stability: provisional
fact_lineage:
type:
- object
- 'null'
description: 'Each value carries locators[] (one per source): bytes [start, end) in the page this scan received, line, col, scope (meta[og:title], script[ld+json]#0, title, page text) and match (value | property | normalised | partial), or {found:false, why}; check them with /api/locate. Each business fact (name, phone, address, email, founder) with every value the site stated and where it stated it, and whether the statements agree'
x-stability: provisional
checks:
type: array
items:
type: object
properties:
path:
type:
- string
- 'null'
x-stability: stable
status:
type:
- number
- 'null'
x-stability: stable
bytes:
type:
- number
- 'null'
x-stability: stable
x-stability: stable
agentview:
type: array
items:
type: object
properties:
label:
type:
- string
- 'null'
x-stability: provisional
status:
type:
- number
- 'null'
x-stability: provisional
words:
type:
- number
- 'null'
x-stability: provisional
x-stability: provisional
nap:
type:
- object
- 'null'
x-stability: internal
headroom:
type:
- object
- 'null'
properties:
gain:
type:
- number
- 'null'
x-stability: internal
failing:
type:
- number
- 'null'
x-stability: internal
x-stability: internal
history:
type: array
items:
type: object
properties:
at:
type:
- string
- 'null'
x-stability: stable
overall:
type:
- number
- 'null'
x-stability: stable
score_version:
type:
- number
- 'null'
x-stability: stable
x-stability: stable
proof:
type: object
properties:
digest:
type:
- string
- 'null'
x-stability: stable
algorithm:
type:
- string
- 'null'
x-stability: stable
anchored:
type:
- string
- 'null'
x-stability: stable
verify:
type:
- string
- 'null'
x-stability: stable
x-stability: stable
links:
type: object
x-stability: provisional
x-stability: stable
securitySchemes:
licenceKey:
type: apiKey
in: header
name: x-crawlcheck-key
description: 'Your licence key: cc_ followed by 32 hex characters. Sent on every keyed call.'
bearer:
type: http
scheme: bearer
description: The same licence key as a Bearer token. Accepted on /api/v1/* and /api/usage.
externalDocs:
url: https://crawlcheck.io/docs/api
description: Human-readable reference
x-refined-from:
- crawlcheck-io-openapi.json
- crawlcheck-io-openapi.yml