For autonomous agents
Verify a legal citation. Pay a cent. No account.
Veridictum tells you whether a US legal citation is real โ and, more usefully, whether it is a plausible-looking fabrication. Agents pay per call over x402: HTTP 402 plus a signed USDC payment. Payment is the authentication. There is no API key, no signup and no rate limit.
What it verifies
A citation is extracted with regular expressions โ never a language model โ and then looked up in three tiers: a cache of previously confirmed results, a local corpus of court opinions, and finally the CourtListener API. The verdict is the outcome of that lookup.
No language model sits anywhere in the verification path. That is the whole point: the same citation submitted twice returns the same verdict, and no model can talk the engine out of one. An answer here is reproducible rather than generated.
What it does not do: judge whether a real case supports the proposition it was cited for. It verifies existence and identity, not reasoning.
The three verdicts
status: "verified" ยท verified: true
The citation resolves to a real case. If a case name was submitted, it
matched the case found โ name_match: "confirmed".
status: "suspicious" ยท name_match: "mismatch"
The fabrication signature. The volume, reporter and page resolve to a real case โ but to a different case than the name given. That is what an invented citation looks like: a real-looking reporter slot borrowed for a case that does not exist.
This is the most valuable answer this service returns. A
not_found might be a typo or a gap in
coverage; a mismatch is a specific, checkable claim that the citation
and the name do not belong to each other.
status: "not_found" ยท verified: false
No case matches the citation.
verified: false is a finding, not an error.
Retrying it costs another payment and returns the same answer.
Supplying the case name is what enables mismatch detection. A bare
citation like 384 U.S. 436 can only be
confirmed to exist, and comes back with
name_match: "not_checked".
Price, networks and the caching rule
| Route | Price | Notes |
|---|---|---|
| POST /api/v1/agent/verify | $0.01 | One citation. |
| POST /api/v1/agent/verify/bulk | $0.10 | Up to 50 citations, one flat price for the call. Fifty citations cost the same as two. |
MCP tool verify_citation_paid |
$0.01 |
Same answer over MCP at https://veridictum.legal/mcp/agent.
|
Payable on either chain, in USDC:
-
Base โ
eip155:8453 -
Solana โ
solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp
Both are advertised in the 402; pick either. The receiving address for each
is in the accepts list of the
Payment-Required header โ never hardcode one
from this page.
The caching rule, because it affects what a retry buys you
Only verified results are ever cached. A
suspicious or
not_found answer is re-checked on every call
โ so a paid retry of a suspicious citation buys a genuinely fresh lookup
rather than a stored one. A confirmed citation does not need re-checking,
and a fabricated one must never be remembered as an answer.
Request and response
Request:
POST /api/v1/agent/verify
Content-Type: application/json
PAYMENT-SIGNATURE: <base64url of the signed x402 payload>
{"citation": "Miranda v. Arizona, 384 U.S. 436 (1966)"}
Response โ identical to the free, keyed route's envelope:
200 OK
PAYMENT-RESPONSE: <base64url settlement receipt: success, tx, network, payer>
X-Veridictum-Surface: agent
{
"citation": "Miranda v. Arizona, 384 U.S. 436 (1966)",
"status": "verified",
"verified": true,
"case_name": "Miranda v. Arizona",
"court": "Supreme Court of the United States",
"date_filed": "1966-06-13",
"courtlistener_url": "https://www.courtlistener.com/opinion/107252/miranda-v-arizona/",
"courtlistener_id": "107252",
"confidence": "high",
"tier": 1,
"message": "Citation verified",
"source": "local_corpus",
"cached": true,
"api_call_made": false,
"name_match": "confirmed"
}
The bulk route takes and returns:
POST /api/v1/agent/verify/bulk
{"citations": ["384 U.S. 436", "Varghese v. China Southern Airlines Co., 925 F.3d 1339 (11th Cir. 2019)"]}
{
"success": true,
"total_citations": 2,
"verified_count": 1,
"not_found_count": 1,
"suspicious_count": 0,
"results": [ /* one envelope per citation, in order */ ],
"verification_time_ms": 412,
"hallucination_risk": "MEDIUM"
}
hallucination_risk is
LOW when every citation verified,
MEDIUM at one or two not found, and
HIGH at three or more.
The 402 flow, in five lines
- POST the route with no payment header. You get 402.
- The requirements are in the
Payment-Requiredresponse header, base64url-encoded JSON โ not in the body, which is{}. - Decode it, pick one entry from
accepts(one per network), and sign a payment for that exact amount to that exactpayTo. - POST the same request again with the signed payload in the
PAYMENT-SIGNATUREheader. - You get 200 and the verdict, plus a settlement receipt in the
PAYMENT-RESPONSEheader.
Any x402 client library does steps 2 to 4 for you. Nothing is charged for the unpaid 402, and nothing is settled if the handler fails โ the payment settles after a successful answer, not before.
Over MCP
The same verification is a paid MCP tool,
verify_citation_paid, at
https://veridictum.legal/mcp/agent (streamable HTTP), at
$0.01 per call. The payment rides in the tool call's
_meta under
x402/payment; the settlement receipt comes back
in the result's _meta under
x402/payment-response. An unpaid call returns
the payment requirements instead of a verdict.
Use https://veridictum.legal/mcp/agent, not
https://veridictum.legal/mcp.
They are two different MCP servers.
https://veridictum.legal/mcp carries the free
tools and requires an OAuth bearer token โ it will answer
401 to a caller that has a wallet and no account, before
it will even list its tools.
https://veridictum.legal/mcp/agent carries the paid tool and
requires no token at all: the payment is the authentication.
The paid endpoint exists for agents that have a wallet and no account. If
you have a Veridictum account and an interactive client, the free tools at
https://veridictum.legal/mcp are the ones you want.
Verify the numbers yourself
Accuracy claims about citation verification are easy to make and rarely checked. These two are checkable, and the recipe is below โ you do not have to take the figure on trust, and you should not.
1305 / 1318
The landmark audit
1318 citations drawn from 288 landmark cases, verified end to end on 2026-08-31. The 13 that did not verify are each named and accounted for โ corpus damage, one parser defect left open deliberately, and two genuine corpus gaps โ rather than absorbed into a percentage.
6 / 6
Mata v. Avianca
The 2023 federal filing that got a lawyer sanctioned cited six cases generated by ChatGPT. All six were fabricated. Veridictum flags all 6 โ the case that made this problem famous is the obvious thing to test against, so it is tested against.
How to re-run it. Submit any citation to the paid route
with its case name attached, and compare the
courtlistener_url in the response against
CourtListener
directly. Every verified answer carries the opinion it resolved to, so any
verdict here can be checked against a source we do not control. To reproduce
the mismatch behaviour, submit a real reporter citation with the wrong case
name and confirm the reply is
suspicious /
mismatch rather than
verified.
How the figures were arrived at is written up in
docs/METHOD.md (the audit, the eight parser
defects it found, and why the test strings are taken from the corpus rather
than written by hand) and
docs/REPORTER_COVERAGE.md (reporter coverage,
and the four occasions on which something adjacent to the question was
measured and reported as the question). Both live in the project repository.
One caveat stated plainly, because it is the honest version of the claim: this verifies that a citation exists and that its name matches the case it points to. It does not verify that the case supports the argument it was cited for. Substance still needs a lawyer.
Also
- /llms.txt โ the short machine-readable version of this page.
- A free, API-key-authenticated surface exists at
/api/v1/public/*with the same envelope, for callers that would rather hold a key than a wallet. - Terms of Service โ section 11 covers API, MCP and pay-per-call use. There is no SLA: a settled call buys that call, not capacity, priority or future availability.
- Privacy Policy โ an x402 call carries no account. We record the settlement (timestamp, route, network, payer wallet, amount, transaction hash) and nothing about the caller.