CrawlCheck Explain API
The Explain API from CrawlCheck — 1 operation(s) for explain.
The Explain API from CrawlCheck — 1 operation(s) for explain.
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-explain-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 Explain 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 Explain 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: Explain
paths:
/api/explain:
get:
operationId: explainFinding
summary: 'One finding explained: rule and revision, compared fetches, valid time, Merkle…'
parameters:
- name: id
in: query
schema:
type: string
- name: domain
in: query
schema:
type: string
- name: code
in: query
schema:
type: string
- name: path
in: query
schema:
type: string
responses:
'200':
description: explanation
content:
application/json:
examples:
worked:
summary: With only a domain, the top finding is explained. Captured from production on 2026-09-30 (MDT).
value:
ok: true
kind: crawlcheck-finding-explanation
version: '1.0'
subject:
domain: wikipedia.org
host: www.wikipedia.org
report_id: evuew4dyje
scanned_at: '2026-10-01T00:47:02.058Z'
finding:
fid: f1:c0040fbedf9413f7da88
decision_id: d1:e30ed813b0b16dd37c57
code: ROBOTS_RULES_SHADOWED
severity: 3
path: /robots.txt
title: robots.txt rules do not apply to named agents
detail: 1 named User-agent group (1 agent) do not repeat 428 of the Disallow rules the `*` group carries. A crawler obeys only …
meaning: A crawler reads only the User-agent group that matches it best and ignores every other group, including `*`. Naming an …
rule:
code: ROBOTS_RULES_SHADOWED
revision: 1
revision_note: null
score_version: 26
decided_in:
trace_id: 0fc371afddbba3d58a9555fb798968c6
span_id: 9bd0a15870b1043d
observed:
evidence:
shadowed_groups: 1
agents_affected: 1
search_engines_affected: 0
sample:
- {}
compared_fetches: null
support_scope: 'scan: the decision rests on the whole scan, not on named fetches'
corroboration:
status: not_applicable
reading: this finding does not depend on the requesting identity or network
trust:
freshness:
observed_at: '2026-10-01T00:47:02.058Z'
last_observed: '2026-10-01T00:47:02.058Z'
held_since: '2026-08-24T03:17:42.851Z'
state: persisted
confidence:
level: reproduced
means: 'seen again: repeated on CrawlCheck''s own network, or in more than one scan'
basis:
- seen in 51 scans since 2026-08-24
contradictions: []
score_effect:
decision_id: d1:e30ed813b0b16dd37c57
code: ROBOTS_RULES_SHADOWED
path: /robots.txt
severity: 3
level: medium
points: 0
cap: C
binding: false
letter_now: D
letter_without_it: D
same_level_others: 0
says: Would cap the letter at C, but the score (53) already reads D, so the letter is the same without it. Moves no points.
held:
state: persisted
first_seen: '2026-08-24T03:17:42.851Z'
scans_seen: 51
valid_time:
valid_from:
after: null
by: '2026-08-24T03:17:42.851Z'
valid_to: null
recorded_at: '2026-08-24T03:17:42.851Z'
superseded_at: null
superseded_by: null
earlier_intervals: 0
before_bt1: true
history: https://crawlcheck.io/api/findings?domain=wikipedia.org
proof:
in_signed_manifest: true
manifest_sha256: 9bc892a9b74d9a116e5cc5bd992a7f71a28679d1508e91bf1d8cad2397c5be4a
decision_root: bbf3a9f8f9eb7b8b9c52abbd85d3b11d3250d8e2b60699bee89218a31d60bd24
leaf: fcefc792db0371caa735052cbd0201e7adc42c3ee0546243876e33e0c22d9312
path:
- side: right
hash: fcefc792db0371caa735052cbd0201e7adc42c3ee0546243876e33e0c22d9312
- side: right
hash: 047bc9f5fdbb2e7c4c008d47856b12220e57733356f34b4c8495804f72d4f31b
how: leaf = sha256(canonical JSON of leaf_object); fold along path (side:right = sibling on the right) to the root; the root…
check:
verify: https://crawlcheck.io/api/verify?id=d1:e30ed813b0b16dd37c57
bundle: https://crawlcheck.io/api/bundle?id=evuew4dyje
offline_verifier: https://crawlcheck.io/crawlcheck-verify.mjs
access: public
schema:
type:
- object
- 'null'
properties:
ok:
type:
- boolean
- 'null'
kind:
type:
- string
- 'null'
version:
type:
- string
- 'null'
subject:
type:
- object
- 'null'
properties:
domain:
type:
- string
- 'null'
host:
type:
- string
- 'null'
report_id:
type:
- string
- 'null'
scanned_at:
type:
- string
- 'null'
additionalProperties: true
finding:
type:
- object
- 'null'
properties:
fid:
type:
- string
- 'null'
decision_id:
type:
- string
- 'null'
code:
type:
- string
- 'null'
severity:
type:
- number
- 'null'
path:
type:
- string
- 'null'
title:
type:
- string
- 'null'
detail: {}
meaning: {}
additionalProperties: true
rule:
type:
- object
- 'null'
properties:
code:
type:
- string
- 'null'
revision:
type:
- number
- 'null'
revision_note: {}
score_version:
type:
- number
- 'null'
decided_in:
type:
- object
- 'null'
properties:
trace_id:
type:
- string
- 'null'
span_id:
type:
- string
- 'null'
additionalProperties: true
additionalProperties: true
observed:
type:
- object
- 'null'
properties:
evidence:
type:
- object
- 'null'
properties:
shadowed_groups:
type:
- number
- 'null'
agents_affected:
type:
- number
- 'null'
search_engines_affected:
type:
- number
- 'null'
sample:
type:
- array
- 'null'
items:
type:
- object
- 'null'
properties: {}
additionalProperties: true
additionalProperties: true
compared_fetches: {}
support_scope:
type:
- string
- 'null'
additionalProperties: true
corroboration:
type:
- object
- 'null'
properties:
status:
type:
- string
- 'null'
reading:
type:
- string
- 'null'
additionalProperties: true
trust:
type:
- object
- 'null'
properties:
freshness:
type:
- object
- 'null'
properties:
observed_at:
type:
- string
- 'null'
last_observed:
type:
- string
- 'null'
held_since:
type:
- string
- 'null'
state:
type:
- string
- 'null'
additionalProperties: true
confidence:
type:
- object
- 'null'
properties:
level:
type:
- string
- 'null'
means:
type:
- string
- 'null'
basis:
type:
- array
- 'null'
items:
type:
- string
- 'null'
additionalProperties: true
contradictions:
type:
- array
- 'null'
items: {}
additionalProperties: true
score_effect:
type:
- object
- 'null'
properties:
decision_id:
type:
- string
- 'null'
code:
type:
- string
- 'null'
path:
type:
- string
- 'null'
severity:
type:
- number
- 'null'
level:
type:
- string
- 'null'
points:
type:
- number
- 'null'
cap:
type:
- string
- 'null'
binding:
type:
- boolean
- 'null'
letter_now:
type:
- string
- 'null'
letter_without_it:
type:
- string
- 'null'
same_level_others:
type:
- number
- 'null'
says:
type:
- string
- 'null'
additionalProperties: true
held:
type:
- object
- 'null'
properties:
state:
type:
- string
- 'null'
first_seen:
type:
- string
- 'null'
scans_seen:
type:
- number
- 'null'
valid_time:
type:
- object
- 'null'
properties:
valid_from:
type:
- object
- 'null'
properties:
after: {}
by:
type:
- string
- 'null'
additionalProperties: true
valid_to: {}
recorded_at:
type:
- string
- 'null'
superseded_at: {}
superseded_by: {}
earlier_intervals:
type:
- number
- 'null'
before_bt1:
type:
- boolean
- 'null'
additionalProperties: true
history:
type:
- string
- 'null'
additionalProperties: true
proof:
type:
- object
- 'null'
properties:
in_signed_manifest:
type:
- boolean
- 'null'
manifest_sha256:
type:
- string
- 'null'
decision_root:
type:
- string
- 'null'
leaf:
type:
- string
- 'null'
path:
type:
- array
- 'null'
items:
type:
- object
- 'null'
properties:
side:
type:
- string
- 'null'
hash:
type:
- string
- 'null'
additionalProperties: true
how: {}
additionalProperties: true
check:
type:
- object
- 'null'
properties:
verify:
type:
- string
- 'null'
bundle:
type:
- string
- 'null'
offline_verifier:
type:
- string
- 'null'
additionalProperties: true
access:
type:
- string
- 'null'
additionalProperties: true
x-schema-source: worked-example
'403':
description: 'locked: needs a licence for the domain'
'404':
description: no record or finding
x-codeSamples:
- lang: Shell
label: curl
source: "curl -s \\\n 'https://crawlcheck.io/api/explain?domain=wikipedia.org'"
security: []
x-auth: public; no credential read
tags:
- Explain
servers:
- url: https://crawlcheck.io
components:
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