Verified claims, with the evidence attached
Every verdict this API returns carries the engine version that produced it and a fingerprint anyone can re-derive, and the error rate behind those verdicts is published rather than asserted. That is the whole pitch: you can check what we tell you without asking us.
Open, no key required
Reads over records that are already public. Nothing here needs an account and nothing here is metered. The ones marked browser send Access-Control-Allow-Origin and can be called from a page; the rest are server-side only, and saying which is which is the point of this page.
get/api/ledger.jsonbrowserThe published error rateThe Kaimen Ledger as data: what the committed corpus of judged mistakes holds, what the capture tier holds, finding-level precision (or the typed reason there is no rate yet), and the claims this evidence cannot currently support. Public, unauthenticated, cross-origin. Refusals are typed rather than implied: `capture.available: false` carries a reason and is never rendered as zero, and `precision.reported: false` means no rate was computed rather than a rate of zero.
curl -s "https://adcurare.com/api/ledger.json"get/api/audit/verifyFetch a published record by idThe canonical record for a published review, including the fingerprint that makes it citable. Public: a grade nobody outside can fetch is a grade nobody outside can check.
curl -s "https://adcurare.com/api/audit/verify?id=<id>"post/api/audit/verifyTamper-check a recordRe-derives the credential from the stored review and reports whether the record you hold is that review, unaltered. This is the endpoint behind "verify this grade yourself": the answer does not depend on trusting the caller, and `expected_fingerprint` comes back either way. Send the WHOLE record, including `subject` and `assessment` - those are the hashed content, and without them the only thing that can be compared is the fingerprint string, which is public. The response says which it did in `checked`.
curl -s -X POST "https://adcurare.com/api/audit/verify" \
-H "content-type: application/json" \
-d '{"record":{"record_id":"<record id>","fingerprint":"<the fingerprint you hold>","subject":{"title":"<title, as issued>","authors":"<authors, as issued>","doi":"<doi, or null>"},"assessment":{"<the assessment object, as issued>":"..."}}}'get/api/rigor/summarybrowserLook up a review by DOIWhether a DOI has a published review, and its verdict, so another surface can show "this paper was reviewed" without re-implementing the verdict logic. Answers `{ found: false }` rather than 404 for an unreviewed DOI: absence of a review is a fact about our coverage, not an error in the request.
curl -s "https://adcurare.com/api/rigor/summary?doi=<doi>"get/api/rigor/feedList published reviewsThe most recent published reviews as compact summaries (~1KB each). `include=result` returns the full analysis instead and is capped at a handful of rows, because one analysis is roughly 150KB. Uncached deliberately: unpublishing a record has to be instant, and a CDN entry a route handler created cannot be purged when it is.
curl -s "https://adcurare.com/api/rigor/feed"What a refusal means, and what it does not
Every endpoint here distinguishes we looked and there is nothing from we could not look, because a consumer that cannot tell them apart will read our silence as a clean bill of health. Branch on the field, not on the status code - the statuses collide where it matters and the fields do not.
found: falseNo review exists for that identifier. A fact about our coverage, not an error in your request - which is why it is a 200.available: falseA tier of the ledger could not be read. It carries the reason. It is never a count of zero, and you must not render it as one.reported: falseNo rate was computed - usually because too few findings have been judged to divide by. The counts come with it; the percentage does not.
Store the engine version with the verdict
Every response that carries a verdict carries the version of Kaimen Rigor that produced it. The same paper can hold different verdicts from two versions without either being wrong, so a verdict you have stored without its version is one neither of us can reproduce later. Keep the pair, and cite the pair.
A published record’s fingerprint is re-derivable from the record itself: post the whole record back to /api/audit/verify from your server and compare. Send subject and assessment with it: those are the hashed content, and an id and a fingerprint alone are both public, so on their own they check nothing about the document you hold. The reply’s checked field says which of the two it was able to do, and valid is absent entirely when you sent no document — treat that as unverified, never as a pass. That check does not depend on trusting us, which is the property it exists to have. It sends no CORS header, so it is not callable from a page yet.