Every AI answer,
with a receipt.
Paste a brief your AI drafted. Proof Kit looks up every case it cites in CourtListener and tells you which ones exist. You get a signed receipt your partner, client or the court can check without asking us.
- Open receipt spec
- Ed25519 + public hash chain
- Source: CourtListener
- Research record DOI 10.5281/zenodo.22848827
sig gN-7XztHZP4GRO5MZ0zZ…pEDA
digest 64997144dd1234f4…7fdc24
log #33 → d23cc14c…e55e
Live demo
Paste a paragraph from an AI draft.
Every US case citation is resolved against CourtListener. You get a verdict per citation and a signed receipt.json.
Why Proof Kit
A lookup you can show a judge.
Most AI checkers ask a second model whether the first one was right. That gives you a confidence score. A judge asking where a case came from wants a source and a record of the check.
Fake cases show up immediately
If a citation points to nothing, or to a different case than the brief names, you see it with a link to the record.
Signed, tamper-evident
Each check comes with receipt.json, signed with Ed25519. Edit a single character and the signature stops matching.
Public hash chain
Every receipt is added to a public log. A deleted or rewritten entry breaks the chain, so nobody can quietly change the past, us included.
Verify without us
Ten lines of Node or Python, or the page in your browser. It works without an account and never calls our servers.
A record for your file
File the receipt with the matter. It records what was checked, when, and against which source. Helpful if you have logging duties under EU AI Act Art. 12.
Faster than rereading
A 30-page brief takes about as long as it takes to paste it. Run it before filing, not after the other side does.
How it works
From draft to signed receipt in three steps.
Paste or call the API
Send AI-written text to the web checker or POST /api/v1/check. We extract US reporter citations (U.S., S. Ct., F.3d, F. Supp., state reporters).
Each citation is resolved
Looked up in CourtListener; the case name is compared token by token. Verdicts: verified, wrong case, not found, ambiguous, unverifiable.
You get a signed receipt
The result is signed and its digest appended to a public hash chain. A partner, client or court can verify it without trusting us.
{
"body": {
"spec": "sapir-receipt/1",
"kind": "citation-check",
"ts": "2026-10-28T20:51:04.775Z",
"input_sha256": "e8115555b9505b63…d061b211c69",
"checker": "CourtListener citation resolver (courtlistener.com/c/), name-token match >= 0.5",
"results": [
{ "cite": "410 U.S. 113", "name": "Roe v. Wade", "verdict": "verified",
"source": "https://www.courtlistener.com/opinion/108713/roe-v-wade/" },
{ "cite": "925 F.3d 1339", "name": "Varghese v. China Southern Airlines Co.", "verdict": "not_found",
"note": "No case at this citation in CourtListener. Likely fabricated." }
],
"summary": { "total": 2, "verified": 1, "flagged": 1 },
"key": { "alg": "Ed25519", "x": "RMJOfCYzDOsYHFAMA5W5VPmnYN51jh7_sgDPzijAzu0" }
},
"sig": "gN-7XztHZP4GRO5MZ0zZTKAuat8V…JAegI0In4lE3gGpEDA",
"digest": "64997144dd1234f4…2e987fdc24",
"log": { "n": 33, "hash": "d23cc14ceead753a…52e95f85e55e" }
}Shortened for display. Real receipts include full hashes and every note.
curl -X POST https://proof.sapir861.com/api/v1/check \
-H "content-type: application/json" \
-d '{"text":"See Roe v. Wade, 410 U.S. 113 (1973)."}'import { readFileSync } from "node:fs"; // node verify.mjs receipt.json (Node 20+)
const r = JSON.parse(readFileSync(process.argv[2] || "receipt.json", "utf8"));
const canon = o => o === null || typeof o !== "object" ? JSON.stringify(o) : Array.isArray(o) ? "[" + o.map(canon).join(",") + "]"
: "{" + Object.keys(o).sort().filter(k => o[k] !== undefined).map(k => JSON.stringify(k) + ":" + canon(o[k])).join(",") + "}";
const msg = new TextEncoder().encode(canon(r.body));
const hex = Buffer.from(await crypto.subtle.digest("SHA-256", msg)).toString("hex");
const pub = (await (await fetch("https://proof.sapir861.com/.well-known/proofkit-pubkey")).json()).jwk;
const key = await crypto.subtle.importKey("jwk", pub, { name: "Ed25519" }, false, ["verify"]);
const ok = await crypto.subtle.verify({ name: "Ed25519" }, key, Buffer.from(r.sig, "base64url"), msg);
console.log(ok && hex === r.digest && pub.x === r.body.key.x ? "VALID" : "INVALID");# pip install cryptography ; python verify.py receipt.json
import json, sys, base64, hashlib, urllib.request
from cryptography.hazmat.primitives.asymmetric.ed25519 import Ed25519PublicKey
r = json.load(open(sys.argv[1] if len(sys.argv) > 1 else "receipt.json", encoding="utf-8"))
b64 = lambda s: base64.urlsafe_b64decode(s + "=" * (-len(s) % 4))
msg = json.dumps(r["body"], sort_keys=True, separators=(",", ":"), ensure_ascii=False).encode()
pub = json.load(urllib.request.urlopen("https://proof.sapir861.com/.well-known/proofkit-pubkey"))["jwk"]
try:
Ed25519PublicKey.from_public_bytes(b64(pub["x"])).verify(b64(r["sig"]), msg)
ok = hashlib.sha256(msg).hexdigest() == r["digest"] and pub["x"] == r["body"]["key"]["x"]
except Exception: ok = False
print("VALID" if ok else "INVALID")No install: open https://proof.sapir861.com/verify and paste receipt.json.
Verification runs locally in your browser (WebCrypto Ed25519). Nothing is uploaded.Public key: /.well-known/proofkit-pubkey
Use cases
Live for case law. Prices and arithmetic are next.
Legal citations
For firms and legal-tech teams that let AI draft. Public trackers list more than 2,000 court decisions about AI-invented cases; sanctions have reached six figures.
Try free →Prices vs. source document
Did the AI quote the right price, date or figure from your PDF or CSV? Each claim will be matched to the cell it came from.
Join the waitlist →Arithmetic in AI answers
We recompute totals, percentages and unit conversions in the answer and show where the AI got it wrong.
Request beta access →Pricing
Pay for a period. Cancel by not renewing.
Pay online and your API key arrives within a minute. We never charge your card again unless you renew.
Pro
₪149 per month₪1,490 for 12 months
- API key right after payment
- 5,000 checks / month
- Receipt archive
- Email support
Team
₪759 per month₪7,590 for 12 months
- 30,000 checks / month
- Audit export (CSV + receipts)
- Onboarding call
- Priority support
Pilot
₪4,590 · 30 days
- 30 days on your documents
- Report of every flagged citation
- If we find no errors in your AI drafts, you pay nothing
Charged in ILS via PayPlus · invoice/receipt included · Prepaid · no auto-renewal · 14-day refund
Questions or invoice for a company? We reply within 24 hours on business days.
FAQ
Questions lawyers ask us
What exactly is checked?
Whether each US case citation exists in CourtListener and whether the case name matches. We do not judge whether a case supports your argument.
Do you store my text?
No. Text is processed in memory. Only its SHA-256 hash goes into the receipt, and only the receipt digest goes into the public log.
How can a third party verify a receipt?
Use the 10-line script above or paste the receipt at /verify. Both check the Ed25519 signature against our published key on your machine. Nothing is sent to us.
What about Westlaw / Lexis citations?
There is no open database to check them against, so we mark them unverifiable. We never pass them silently.
Is this proven?
Partly. In our public test it confirmed 5 of 5 real cases and caught 3 of 3 fabricated ones. That is a small sample. A larger independent evaluation is running, and the method is published with a DOI.
What it does and doesn't do. The checker tells you whether a citation exists in CourtListener and whether the case name matches. It does not judge whether the case supports your argument. Coverage is US case law available in CourtListener; Westlaw/Lexis-only cites are marked unverifiable. Independent evaluation across more models and larger datasets is in progress.
Check your next AI draft before you file it.
Free for 100 citations a month. No account needed.