{"openapi":"3.0.0","info":{"title":"ZeroClick Readiness","description":"Score how ready a storefront or API is to sell to AI agents. Stored reports are public. The public free-scan route has browser, IP and budget limits and is disabled by default. Operator scans, share-link creation and run listings need an operator credential — see /auth.md.","version":"1.0.0"},"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"A readiness operator token (rop_…). Required only to scan, to mint a share link, or to list a domain's runs — reports are public. ZeroClick API keys and dashboard sessions are not accepted here. See /auth.md."}},"schemas":{}},"paths":{"/api/v1/rubric":{"get":{"summary":"The ruler in use","description":"The rubric version, config hash and pillar weights currently in use. Scores compare only within one config hash.","responses":{"200":{"description":"Default Response"}}}},"/api/v1/spec":{"get":{"summary":"The full published rubric","description":"Pillars, weights, every check, and what is deliberately not scored. Public — a score you cannot audit against its ruler is not a measurement.","responses":{"200":{"description":"Default Response"}}}},"/api/v1/domains/{domain}/lookup":{"post":{"summary":"Whether a domain has a listed report, and where","description":"The homepage's answer on submit. `listed: true` carries the latest listed report; `listed: false` means the reader may ask for one via readiness-requests. Matches the stored host with or without www. Rate-limited per client.","parameters":[{"schema":{"type":"string"},"in":"path","name":"domain","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/domains/{domain}/readiness-requests":{"post":{"summary":"Ask for a domain's readiness report","description":"Stores an email address to send the report to once an operator has scanned the domain. Does not start a scan, and answers 202 whether or not the domain has ever been seen — it is not a way to enumerate the index.","parameters":[{"schema":{"type":"string"},"in":"path","name":"domain","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/domains/{domain}/free-scan":{"post":{"security":[],"parameters":[{"schema":{"type":"string"},"in":"path","name":"domain","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/free-scans/{id}":{"get":{"security":[],"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/paid-scans/config":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/api/v1/scans/{id}":{"get":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/checkouts/{id}":{"get":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/checkouts":{"post":{"summary":"Start a card checkout for a report or four-competitor comparison","description":"Send {product, url or runId, expectedPrice}. The displayed storefront price is checked against the actual payment challenge before opening checkout. Returns a stable purchase page and a card checkout URL, or a free cached report.","responses":{"200":{"description":"Default Response"}}}},"/api/v1/runs/{id}":{"get":{"summary":"A stored report","description":"Fetch a stored report by id, with the rubric version and config hash that produced it, its provenance and its evidence chain root.","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/runs/{id}/markdown":{"get":{"summary":"A stored report as Markdown","description":"Render a stored readiness report as portable Markdown, including the evidence chain root. Identical bytes to the pretty path /r/{id}.md.","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/runs/{id}/events":{"get":{"summary":"A stored run as analysis rows (NDJSON)","description":"One JSON object per line, full tool inputs and per-stage cost. This is the hash-chained artifact: hash the raw line bytes exactly as served, never a re-serialization; see /verify.md.","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/runs/{id}/session":{"get":{"summary":"The agent's transcript for a stored run","description":"The buying-agent transcript a person reads, served verbatim as plain text. On a run that reused a stored session this is the transcript of the run that originally collected it. 404 when no transcript was stored.","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/runs/{id}/judge":{"get":{"summary":"The outcome grader's exact evidence","description":"The full judged input, the raw grader response and the parsed per-check verdicts for a stored run. Bound to its transcript by a digest prefix. 404 when no judge receipt was stored.","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/runs/{id}/peers":{"get":{"summary":"The competitor panel for a stored run","description":"Competitors discovered for this run's domain, each scored at STATIC depth — surface probes only, no agent session and no judge. Their Outcome and Trust pillars are therefore unmeasured rather than zero: nobody drove an agent at them. Answers an empty list, never 404, so a reader can tell 'no competitors' from 'this endpoint is missing'.","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/runs/{id}/frames":{"get":{"summary":"What the agent saw (conditional)","description":"The screenshots the buying agent captured, as data URIs. CONDITIONAL: most runs store no frames, and this route answers 404 for those — a normal answer, not a failure.","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/comparisons/{id}":{"get":{"summary":"A composed comparison","description":"The target and each chosen competitor, every one of them a full deep run read from the database. `ready` is false while a competitor is still being scanned, and `pending` names which ones in the domains the comparison was created with.","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/comparisons/{id}/peers":{"get":{"summary":"A comparison's competitors, as the report page reads them","description":"The same shape as a run's own peers route, so a composed comparison renders through the ordinary report page. Every peer here is a full deep run.","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/accounts/{slug}/latest-readiness":{"get":{"summary":"The latest readiness report for a GTM account","description":"Resolves a public GTM account slug to its latest completed composed comparison, or to its latest user-initiated scan when no comparison exists. The returned artifact URL is immutable; `/s/{slug}` is the stable rendered view.","parameters":[{"schema":{"type":"string"},"in":"path","name":"slug","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/accounts/{slug}/readiness-requests":{"post":{"summary":"Ask for an account's first readiness report","description":"Stores an email address to notify when the account's first readiness report is ready. This endpoint does not start a scan.","parameters":[{"schema":{"type":"string"},"in":"path","name":"slug","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/partners/{domain}/readiness":{"get":{"summary":"A seller's newest readiness score (ZeroClick api only)","description":"The newest listed report for a domain, with or without www, whatever rubric graded it: grade and score, a one-sentence `headline`, per-pillar scores, the buying funnel by stage, and the agent's own verdict when a session ran. `stale` is true when the current rubric differs from the one that produced the score. Needs a readiness partner token; 404 when the domain has no listed report.","parameters":[{"schema":{"type":"string"},"in":"path","name":"domain","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/scans":{"post":{"summary":"Buy an additional report or four-competitor comparison","description":"Signed ZeroClick payment proxy only. JSON {product:\"scan\",url} buys one extra report ($3); {product:\"comparison\",runId} adds four full competitor scans to an existing report ($2). A 202 accepts and charges once. A refusal starts no work; whether a payment already attached to the request is refunded depends on the payment rail, so keep the request id if one was taken. Poll statusUrl until ready or failed. Failed accepted jobs require manual support; do not purchase again automatically.","responses":{"200":{"description":"Default Response"}}}}},"security":[{"bearerAuth":[]}],"servers":[{"url":"http://readiness.zeroclick.ai"}]}