CrawlCheck Outcomes API
The Outcomes API from CrawlCheck — 2 operation(s) for outcomes.
Operations 2
GET
/api/v1/outcomes
What agents reported after acting on a domain: counts by outcome, action, agent…
#
The Outcomes API from CrawlCheck — 2 operation(s) for outcomes.
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-outcomes-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 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