CrawlCheck Reports API

The Reports API from CrawlCheck — 1 operation(s) for reports.

GitHub OpenAPI

Operations 1

GET /api/v1/reports/{id} A stored report as PublicReportV1 (licence or read-scoped API key) #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • 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.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/crawlcheck-io:crawlcheck-io-reports-api"
All apis
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.

Get an API 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 Specification

crawlcheck-io-reports-api-openapi.yml Raw ↑
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