CrawlCheck Outcomes API

The Outcomes API from CrawlCheck — 2 operation(s) for outcomes.

GitHub OpenAPI

Operations 2

GET /api/v1/outcomes What agents reported after acting on a domain: counts by outcome, action, agent… #
GET /api/outcomes What the owner's connected sources counted either side of a receipt's anchor… #

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-outcomes-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-outcomes-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: Crawlcheck Io Outcomes 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 Outcomes 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: Outcomes
paths:
  /api/v1/outcomes:
    get:
      operationId: agentOutcomesV1
      summary: 'What agents reported after acting on a domain: counts by outcome, action, agent…'
      parameters:
      - name: domain
        in: query
        required: true
        schema:
          type: string
      responses:
        '200':
          description: crawlcheck-agent-outcomes
          content:
            application/json:
              examples:
                worked:
                  summary: Shape of the answer after the single example report above; values are not a measurement.
                  value:
                    kind: crawlcheck-agent-outcomes
                    v: 1
                    domain: example.com
                    window_days: 30
                    n: 1
                    ok: 0
                    blocked: 1
                    challenged: 0
                    error: 0
                    disagree: 1
                    reporters: 1
                    by_action:
                      fetch: 1
                    by_agent:
                      my-agent/1.0: 1
                    by_status:
                      '403': 1
                    days:
                    - day: '2026-10-03'
                      n: 1
                      ok: 0
                      blocked: 1
                      challenged: 0
                      disagree: 1
                    recent: []
                    success_rate: 0
              schema:
                type:
                - object
                - 'null'
                properties:
                  kind:
                    type:
                    - string
                    - 'null'
                  v:
                    type:
                    - number
                    - 'null'
                  domain:
                    type:
                    - string
                    - 'null'
                  window_days:
                    type:
                    - number
                    - 'null'
                  n:
                    type:
                    - number
                    - 'null'
                  ok:
                    type:
                    - number
                    - 'null'
                  blocked:
                    type:
                    - number
                    - 'null'
                  challenged:
                    type:
                    - number
                    - 'null'
                  error:
                    type:
                    - number
                    - 'null'
                  disagree:
                    type:
                    - number
                    - 'null'
                  reporters:
                    type:
                    - number
                    - 'null'
                  by_action:
                    type:
                    - object
                    - 'null'
                    properties:
                      fetch:
                        type:
                        - number
                        - 'null'
                    additionalProperties: true
                  by_agent:
                    type:
                    - object
                    - 'null'
                    properties:
                      my-agent/1.0:
                        type:
                        - number
                        - 'null'
                    additionalProperties: true
                  by_status:
                    type:
                    - object
                    - 'null'
                    properties:
                      '403':
                        type:
                        - number
                        - 'null'
                    additionalProperties: true
                  days:
                    type:
                    - array
                    - 'null'
                    items:
                      type:
                      - object
                      - 'null'
                      properties:
                        day:
                          type:
                          - string
                          - 'null'
                        n:
                          type:
                          - number
                          - 'null'
                        ok:
                          type:
                          - number
                          - 'null'
                        blocked:
                          type:
                          - number
                          - 'null'
                        challenged:
                          type:
                          - number
                          - 'null'
                        disagree:
                          type:
                          - number
                          - 'null'
                      additionalProperties: true
                  recent:
                    type:
                    - array
                    - 'null'
                    items: {}
                  success_rate:
                    type:
                    - number
                    - 'null'
                additionalProperties: true
                x-schema-source: worked-example
      x-codeSamples:
      - lang: Shell
        label: curl
        source: curl -s 'https://crawlcheck.io/api/v1/outcomes?domain=example.com&days=30'
      security: []
      x-auth: public; no credential read
      tags:
      - Outcomes
    servers:
    - url: https://crawlcheck.io
  /api/outcomes:
    get:
      operationId: fixOutcomes
      summary: What the owner's connected sources counted either side of a receipt's anchor…
      parameters:
      - name: receipt
        in: query
        schema:
          type: string
        description: A receipt id (rc1:…). Or give domain= for the domain's newest receipt
      - name: domain
        in: query
        schema:
          type: string
      - name: days
        in: query
        schema:
          type: integer
          minimum: 7
          maximum: 90
          default: 28
        description: The window either side of the anchor day
      - name: fresh
        in: query
        schema:
          type: string
          enum:
          - '1'
        description: Recompute instead of the six-hour cache
      responses:
        '200':
          description: crawlcheck-fix-outcomes
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FixOutcomesV1'
              examples:
                worked:
                  summary: 'A licence covering the domain, or the owner. Produced by the real Worker code in the build harness: two real scans of the domain dated 60 and 30 days apart, their receipt, and seeded outcome sources (Search Console, Business Profile, the site''s crawler log, the beacon''s last 18 days, eight enquiries through the form). Search clicks went from 10 to 12 a day; the response says that is a coincidence in time and nothing more.'
                  value:
                    ok: true
                    kind: crawlcheck-fix-outcomes
                    v: 1
                    generated_at: '2026-10-01T17:37:29.407Z'
                    receipt:
                      id: rc1:a2d4b9d57617d9885730177feb57dee43ea7bd704cba22763c548a3ccb7e6c68
                      domain: treeservicedenverllc.com
                      verdict: unchanged
                      findings_cleared: []
                      url: https://crawlcheck.io/api/receipt?id=rc1%3Aa2d4b9d57617d9885730177feb57dee43ea7bd704cba22763c548a3ccb7e6c68
                      anchor:
                        at: '2026-09-01T17:36:54.754Z'
                        day: '2026-09-01'
                        basis: 'the day of the after record (receipt after.scanned_at): the moment the change went live was not observed, so the first measurement of it is the anchor'
                    window:
                      days: 28
                      before:
                        from: '2026-08-04'
                        to: '2026-08-31'
                      after:
                        from: '2026-09-01'
                        to: '2026-09-28'
                        days_elapsed: 28
                        complete: true
                    connected: 10
                    usable: 8
                    series:
                    - key: search_clicks
                      label: Search clicks
                      source: Google Search Console, read by the observer's own account
                      mode: daily
                      connected: true
                      note: Google finalises a day about two days late and reports no row for a day with no impressions.
                      before:
                        from: '2026-08-04'
                        to: '2026-08-31'
                        days: 28
                        measured: 28
                        sum: 280
                        per_day: 10
                      after:
                        from: '2026-09-01'
                        to: '2026-09-28'
                        days: 28
                        measured: 28
                        sum: 336
                        per_day: 12
                      delta_per_day: 2
                      pct: 20
                      usable: true
                      why: per-day mean of the measured days on each side
                    - key: search_impressions
                      label: Search impressions
                      source: Google Search Console, read by the observer's own account
                      mode: daily
                      connected: true
                      note: Google finalises a day about two days late and reports no row for a day with no impressions.
                      before:
                        from: '2026-08-04'
                        to: '2026-08-31'
                        days: 28
                        measured: 28
                        sum: 7000
                        per_day: 250
                      after:
                        from: '2026-09-01'
                        to: '2026-09-28'
                        days: 28
                        measured: 28
                        sum: 8400
                        per_day: 300
                      delta_per_day: 50
                      pct: 20
                      usable: true
                      why: per-day mean of the measured days on each side
                    - key: profile_actions
                      label: Business Profile actions (calls, directions, website clicks)
                      source: Google Business Profile, website field matches this domain
                      mode: daily
                      connected: true
                      note: Google finalises Business Profile days about five days late.
                      before:
                        from: '2026-08-04'
                        to: '2026-08-31'
                        days: 28
                        measured: 28
                        sum: 84
                        per_day: 3
                      after:
                        from: '2026-09-01'
                        to: '2026-09-28'
                        days: 28
                        measured: 24
                        sum: 96
                        per_day: 4
                      delta_per_day: 1
                      pct: 33.3
                      usable: true
                      why: per-day mean of the measured days on each side
                    - key: profile_impressions
                      label: Business Profile impressions
                      source: Google Business Profile, website field matches this domain
                      mode: daily
                      connected: true
                      before:
                        from: '2026-08-04'
                        to: '2026-08-31'
                        days: 28
                        measured: 28
                        sum: 1120
                        per_day: 40
                      after:
                        from: '2026-09-01'
                        to: '2026-09-28'
                        days: 28
                        measured: 24
                        sum: 960
                        per_day: 40
                      delta_per_day: 0
                      pct: 0
                      usable: true
                      why: per-day mean of the measured days on each side
                    - key: ai_crawler_fetches
                      label: Verified fetches by AI crawlers (training, answer and assistant agents)
                      source: the site's own server log via /api/observe, each fetch verified against the operator's published IP ranges
                      mode: daily
                      connected: true
                      note: A day with no record is a day the reporter posted nothing; quiet days are absent, not zero.
                      before:
                        from: '2026-08-04'
                        to: '2026-08-31'
                        days: 28
                        measured: 13
                        sum: 91
                        per_day: 7
                      after:
                        from: '2026-09-01'
                        to: '2026-09-28'
                        days: 28
                        measured: 28
                        sum: 196
                        per_day: 7
                      delta_per_day: 0
                      pct: 0
                      usable: true
                      why: per-day mean of the measured days on each side
                    - key: assistant_fetches
                      label: Verified fetches by chat assistants answering someone right then (-User agents)
                      source: the site's own server log via /api/observe, each fetch verified against the operator's published IP ranges
                      mode: daily
                      connected: true
                      note: A day with no record is a day the reporter posted nothing; quiet days are absent, not zero.
                      before:
                        from: '2026-08-04'
                        to: '2026-08-31'
                        days: 28
                        measured: 13
                        sum: 26
                        per_day: 2
                      after:
                        from: '2026-09-01'
                        to: '2026-09-28'
                        days: 28
                        measured: 28
                        sum: 56
                        per_day: 2
                      delta_per_day: 0
                      pct: 0
                      usable: true
                      why: per-day mean of the measured days on each side
                    - key: search_crawler_fetches
                      label: Verified fetches by search engine crawlers
                      source: the site's own server log via /api/observe, each fetch verified against the operator's published IP ranges
                      mode: daily
                      connected: true
                      note: A day with no record is a day the reporter posted nothing; quiet days are absent, not zero.
                      before:
                        from: '2026-08-04'
                        to: '2026-08-31'
                        days: 28
                        measured: 13
                        sum: 117
                        per_day: 9
                      after:
                        from: '2026-09-01'
                        to: '2026-09-28'
                        days: 28
                        measured: 28
                        sum: 252
                        per_day: 9
                      delta_per_day: 0
                      pct: 0
                      usable: true
                      why: per-day mean of the measured days on each side
                    - key: arrivals
                      label: Visitors arriving (all sources)
                      source: the site's first-party beacon (referral store, 28 days) on treeservicedenverllc.com
                      mode: daily
                      connected: true
                      note: The beacon keeps 28 days; days before 2026-09-02 are unmeasured here.
                      before:
                        from: '2026-08-04'
                        to: '2026-08-31'
                        days: 28
                        measured: 0
                        sum: 0
                        per_day: null
                      after:
                        from: '2026-09-01'
                        to: '2026-09-28'
                        days: 28
                        measured: 18
                        sum: 720
                        per_day: 40
                      delta_per_day: null
                      pct: null
                      usable: false
                      why: needs 7 measured days on each side; this has 0 before and 18 after
                    - key: answer_engine_arrivals
                      label: Visitors an answer engine sent
                      source: the site's first-party beacon (referral store, 28 days) on treeservicedenverllc.com
                      mode: daily
                      connected: true
                      note: The beacon keeps 28 days; days before 2026-09-02 are unmeasured here.
                      before:
                        from: '2026-08-04'
                        to: '2026-08-31'
                        days: 28
                        measured: 0
                        sum: 0
                        per_day: null
                      after:
                        from: '2026-09-01'
                        to: '2026-09-28'
                        days: 28
                        measured: 18
                        sum: 72
                        per_day: 4
                      delta_per_day: null
                      pct: null
                      usable: false
                      why: needs 7 measured days on each side; this has 0 before and 18 after
                    - key: leads_webhook
                      label: Enquiries through the form
                      source: the CrawlCheck form on the site (f.js)
                      mode: events
                      connected: true
                      before:
                        from: '2026-08-04'
                        to: '2026-08-31'
                        days: 28
                        measured: 28
                        sum: 3
                        per_day: 0.11
                      after:
                        from: '2026-09-01'
                        to: '2026-09-28'
                        days: 28
                        measured: 28
                        sum: 5
                        per_day: 0.18
                      delta_per_day: 0.07
                      pct: 63.6
                      usable: true
                      why: per-day rate over each whole window
                    not_measured:
                    - key: citations
                      why: no connected source reports whether an answer engine named the site; a verified fetch by a -User agent (assistant_fetches) and a visitor an answer engine sent (answer_engine_arrivals) are the nearest measured facts
                    summary: 'Search clicks: 10 → 12 per day (+20%); Search impressions: 250 → 300 per day (+20%); Business Profile actions (calls, directions, website clicks): 3 → 4 per day (+33.3%); Business Profile impressions: 40 → 40 per day (0%); Verified fetches by AI crawlers (training, answer and assistant agents): 7 → 7 per day (0%); Verified fetches by chat assistants answering someone right then (-User agents): 2 → 2 per day (0%); Verified fetches by search engine crawlers: 9 → 9 per day (0%); Enquiries through the form: 0.11 → 0.18 per day (+63.6%)'
                    reading: Each row is one named source read day by day for 28 days either side of the anchor. before and after are the two windows; per_day is what is compared, so an after window still filling is not read as a drop. A missing day is missing, never zero, and a window under 7 measured days is reported as thin…
                    not_proof: 'This is a coincidence in time: what the connected sources counted before and after a dated, verified change. It does not show the change caused any of it. A season, an algorithm update, a competitor, or the site''s own advertising moves every series at once; only a control (the same site''s untouched…'
                    how_to_cite: 'Say what this says: “in the 28 days after the fix verified on 2026-09-01, <series> went from <before.per_day> to <after.per_day> per day, measured by <source>”. Do not say the fix produced it.'
        '403':
          description: not the domain's owner
        '404':
          description: no receipt
      x-codeSamples:
      - lang: Shell
        label: curl
        source: "curl -s \\\n  -H \"x-crawlcheck-key: $CRAWLCHECK_KEY\" \\\n  'https://crawlcheck.io/api/outcomes?receipt=rc1%3Aa2d4b9d57617d9885730177feb57dee43ea7bd704cba22763c548a3ccb7e6c68'"
      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:
      - Outcomes
    servers:
    - url: https://crawlcheck.io
components:
  schemas:
    OutcomeSideV1:
      type: object
      required:
      - days
      - measured
      - sum
      - per_day
      properties:
        from:
          type:
          - string
          - 'null'
          x-stability: provisional
        to:
          type:
          - string
          - 'null'
          x-stability: provisional
        days:
          type: integer
          x-stability: provisional
        measured:
          type: integer
          x-stability: provisional
        sum:
          type: number
          x-stability: provisional
        per_day:
          type:
          - number
          - 'null'
          x-stability: provisional
      x-stability: provisional
    FixOutcomesV1:
      type: object
      required:
      - kind
      - v
      - receipt
      - window
      - connected
      - usable
      - series
      - not_proof
      description: What the owner's connected outcome sources counted either side of a receipt's anchor day (GET /api/outcomes). One series per named source; per-day values compared; a series with no source is connected:false with how_to_connect; a window under 7 measured days is usable:false with why. Never a claim of cause.
      properties:
        ok:
          type: boolean
          x-stability: provisional
        kind:
          const: crawlcheck-fix-outcomes
          x-stability: provisional
        v:
          const: 1
          x-stability: provisional
        generated_at:
          type: string
          x-stability: provisional
        cached:
          type: boolean
          x-stability: provisional
        receipt:
          type: object
          required:
          - id
          - domain
          - anchor
          properties:
            id:
              type: string
              pattern: ^rc1:[0-9a-f]{64}$
              x-stability: provisional
            domain:
              type: string
              x-stability: provisional
            verdict:
              type:
              - string
              - 'null'
              x-stability: provisional
            findings_cleared:
              type: array
              items:
                type: string
              x-stability: provisional
            url:
              type: string
              x-stability: provisional
            anchor:
              type: object
              required:
              - day
              - basis
              properties:
                at:
                  type: string
                  x-stability: provisional
                day:
                  type: string
                  format: date
                  x-stability: provisional
                basis:
                  type: string
                  x-stability: provisional
              x-stability: provisional
          x-stability: provisional
        window:
          type: object
          required:
          - days
          - before
          - after
          properties:
            days:
              type: integer
              minimum: 7
              maximum: 90
              x-stability: provisional
            before:
              type: object
              properties:
                from:
                  type:
                  - string
                  - 'null'
                  x-stability: provisional
                to:
                  type:
                  - string
                  - 'null'
                  x-stability: provisional
              x-stability: provisional
            after:
              type: object
              properties:
                from:
                  type:
                  - string
                  - 'null'
                  x-stability: provisional
                to:
                  type:
                  - string
                  - 'null'
                  x-stability: provisional
                days_elapsed:
                  type: integer
                  x-stability: provisional
                complete:
                  type: boolean
                  x-stability: provisional
              x-stability: provisional
          x-stability: provisional
        connected:
          type: integer
          x-stability: provisional
        usable:
          type: integer
          x-stability: provisional
        series:
          type: array
          items:
            type: object
            required:
            - key
            - label
            - source
            - mode
            - connected
            - usable
            - why
            properties:
              key:
                type: string
                x-stability: provisional
              label:
                type: string
                x-stability: provisional
              source:
                type: string
                x-stability: provisional
              mode:
                enum:
                - daily
                - events
                x-stability: provisional
              connected:
                type: boolean
                x-stability: provisional
              note:
                type: string
                x-stability: provisional
              how_to_connect:
                type:
                - string
                - 'null'
                x-stability: provisional
              before:
                anyOf:
                - $ref: '#/components/schemas/OutcomeSideV1'
                - type: 'null'
                x-stability: provisional
              after:
                anyOf:
                - $ref: '#/components/schemas/OutcomeSideV1'
                - type: 'null'
                x-stability: provisional
              delta_per_day:
                type:
                - number
                - 'null'
                x-stability: provisional
              pct:
                type:
                - number
                - 'null'
                x-stability: provisional
              usable:
                type: boolean
                x-stability: provisional
              why:
                type: string
                x-stability: provisional
          x-stability: provisional
        not_measured:
          type: array
          items:
            type: object
            properties:
              key:
                type: string
                x-stability: provisional
              why:
                type: string
                x-stability: provisional
          x-stability: provisional
        summary:
          type: string
          x-stability: provisional
        reading:
          type: string
          x-stability: provisional
        not_proof:
          type: string
          x-stability: provisional
        how_to_cite:
          type: string
          x-stability: provisional
      x-stability: provisional
  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