Use caseFor AI product teams
Check AI-generated content before it ships or publishes.
A fact-checking API for AI-generated content: a chatbot’s answer, a summary, an article your pipeline publishes. It checks the factual statements against independent public sources, not against the model that produced them, and returns structured results. It checks public sources, not your own documents.
Your model’s answer“Python 3.12 was released on 2 October 2023. It removed the distutils package from the standard library. On the official benchmark suite it runs about 20% faster than Python 3.11.”
Two of the three statements hold. One does not.
FalsePython 3.12 averages roughly 4–5% faster than Python 3.11.
A model states a wrong figure as plainly as a right one. Lenz checks each statement against public sources the model never saw, so your code can hold the answer before a customer reads it.
- Independent public sourcesnot the model that produced the text
- Structured resultsverdict, score, sources, reasoning
- Warranted verdictson qualifying checks, on Pro and Scale
01Example
Three statements. One of them is wrong.
| Claim | Verdict | Lenz Score | Sources |
|---|---|---|---|
| Python 3.12 was released on October 2, 2023. | Truehigh confidence | 10/10 | python.orgmail.python.orgdiscuss.python.org+8 more |
| Python 3.12 removed the distutils package from the Python standard library. | Truehigh confidence | 10/10 | peps.python.orgdocs.python.orggithub.com+7 more |
| Python 3.12 runs about 20% faster than Python 3.11 on the official Python benchmark suite.Suggested rewritePython 3.12 runs about 4–5% faster than Python 3.11 on the official Python benchmark suite. | Falsehigh confidence | 1/10 | python.orgdiscuss.python.orgdocs.python.org+11 more |
Full verification · Checked 7 September 2026.
Open a row for the sources it used and the reasoning that weighed them.
A full verification returns the fields your code branches on — verdict, confidence, lenz_score, key_finding and sources — so the routing decision is yours to make in code: publish, hold, or send it to your reviewers.
02How it checks
Hallucination detection against public sources.
-
Text a model wrote goes in
An answer, a summary, an article: send Lenz the whole text. It pulls out the factual statements.
-
Each statement is checked against public sources
Models from multiple vendors check each one. On a full verification, models argue for and against each statement, three reviewers assess it, and the result ships with the trace.
-
The check sits outside the model
A model grading its own output is not an outside check. Lenz sits outside the model vendor and outside your own team, and the evidence it cites is public, so a customer or an auditor can follow it.
03Publishing
The same check, before an article publishes.
“The company was founded in Stockholm in 2006 and launched in the United States in July 2009.”
False Spotify launched in the United States on July 14, 2011. Open the check
Hold the article, or pass the suggested rewrite to an editor: “Spotify launched in the United States in July 2011.”
A pipeline that drafts articles, summaries or product descriptions can send each draft to Lenz before it publishes, and hold any draft with a statement that does not check out.
Lenz checks public sources, not your own documents.
A guardrail filters. Lenz investigates.
A fast guardrail
Compares the answer with the context the model was given, and passes or fails it. Built to filter at low latency.
LenzFull verification
Checks the answer against independent public sources the model was never given, to establish whether each statement is true, and shows how it got there.
Models from several vendors argue both sides and three reviewers weigh them. A split panel stays visible in the result.
The open evaluation: where frontier models disagree on real-world fact-checks
04The API
Assess to sort. Verify to establish.
The API: two different checks, one sequence.
Check LLM output with Python.
- 01An answer is draftedA support reply, a RAG answer, a summary: anything a model wrote that a customer is about to read.
- 02Extract the statements
POST /extract· up to 100 self-contained statements · no credits, 1,000 calls a day - 03Sort, then establish
POST /assess· verdict and confidence · sync, ~15 secondsPOST /verify· sources and reasoning · async, ~90 seconds, webhook - 04Your gate decidesYour thresholds and routing. Lenz never holds, edits or publishes your text.
- 05Ship, with the recordEvery source with its date, the arguments on both sides, the reasoning. Private to your account by default;
visibility: "unlisted"returns a link you can pass on.
# pip install lenz-io from lenz_io import Lenz client = Lenz(api_key="lenz_...") extracted = client.extract(text=model_output) # extract finds up to 100, most check-worthy first; # one assess call takes 20, so this checks the first 20 claims = [c.claim for c in extracted.claims][:20] rows = client.assess(claims=claims).claims if claims else [] # a failed row was not checked: never ship it as clean bad = ("False", "Mostly False", "Mixed") for c in rows: if c.status == "failed" or c.verdict in bad or c.confidence == "low": print("HOLD:", c.claim, c.verdict, c.confidence) # HOLD: Python 3.12 runs about 20% faster … False high
// npm install lenz-io import { Lenz } from "lenz-io"; const client = new Lenz({ apiKey: "lenz_..." }); const out = await client.extract({ text: modelOutput }); // extract finds up to 100, most check-worthy first; // one assess call takes 20, so this checks the first 20 const claims = (out.claims ?? []).map((c) => c.claim).slice(0, 20); const rows = claims.length ? (await client.assess({ claims })).claims : []; // a failed row was not checked: never ship it as clean const bad = ["False", "Mostly False", "Mixed"]; for (const c of rows) { if ( c.status === "failed" || bad.includes(c.verdict ?? "") || c.confidence === "low" ) console.log("HOLD:", c.claim, c.verdict, c.confidence); }
curl -X POST https://lenz.io/api/v1/extract \ -H "Authorization: Bearer $LENZ_API_KEY" \ -H "X-Lenz-API-Version: 2026-10-11" \ -H "Content-Type: application/json" \ -d '{"text": "Python 3.12 runs about 20% faster than 3.11. ..."}' # send the "claim" of each item in "claims" curl -X POST https://lenz.io/api/v1/assess \ -H "Authorization: Bearer $LENZ_API_KEY" \ -H "X-Lenz-API-Version: 2026-10-11" \ -H "Content-Type: application/json" \ -d '{"claims": ["Python 3.12 runs about 20% faster than 3.11."]}' # hold a row whose status is "failed" (not checked), # or whose verdict or confidence fails your gate
Inside Cursor and Claude Code with one command and your key; from a script in Python or TypeScript; or through the REST API. Webhooks replace the wait on /verify. TypeScript SDK: npm install lenz-io. The same examples, and the recorded responses, are on the developer page.
05RAG answers
Fact-checking RAG answers.
-
The facts in the answer
Retrieval narrows what the model says; it does not make it true. Lenz checks the factual statements in the answer against public sources. Faithfulness to your own retrieved documents is a different check, and not this one.
-
The citations in an answer
When an answer cites web pages or papers,
POST /citecheckchecks each citation against its source: a DOI that is not registered, a page that is gone, a quote the page does not contain, or a source that may not support the statement, returned with its passage for your gate to judge. A reference with no link and no DOI is not checked. -
A whole draft in one call
POST /reviewruns extract, assess and verify on a whole draft in one call, asynchronous with a webhook. It can also check the draft's citations: whether each source says what the draft attributes to it.
06What comes back
Verdict, score, sources, reasoning.
Branch on verdict and confidence from either endpoint; the rest exists only on a full verification.
| Field | Meaning | /assess | /verify |
|---|---|---|---|
| verdict | True, Mostly True, Mixed, Mostly False, False. /verify can also return No Public Record (no score) when no public record settles the claim; /assess cannot | Yes | Yes |
| confidence | How much the reviewers agreed and how sure each one was | Yes | Yes |
| verification_url | A link to the full verification, when one of that statement completed in the last hour | Yes | No |
| rationale | The reviewers’ notes on the verdict, not checked sources | Yes | No |
| lenz_score | Integer score, 1–10; null for No Public Record | No | Yes |
| key_finding | The decisive fact in one line | No | Yes |
| sources | Title, snippet and date for each source | No | Yes |
| executive_summary | Plain-language summary of the verification | No | Yes |
| warnings | Cautions the verification raised | No | Yes |
| audit | The debate and the reviewers’ reasoning | No | Yes |
| coverage | Whether the verdict qualified for the warranty, on a full verification fetched with your API key | No | Yes |
Your API submissions are private to your account.
The recorded responses, field by field, on the developer page
Warranty
Vendors disclaim accuracy. Lenz warrants the verdict.
A verdict can qualify when a full verification returns True or False with high panel confidence and enough independent sources behind it. Your code reads that from the coverage block.
On a paid Pro or Scale plan, every full verification that qualifies carries a contractual warranty, at no extra charge.
07Pricing
Try free, no card.
$7.99/ month
500 assessments or 50 full verifications a month, in any combination.
Or $6.59 a month, billed $79 a year
Choose Plus$99/ month
5,000 assessments or 500 full verifications a month, in any combination. The warranty on qualifying verdicts.
Or $83 a month, billed $990 a year
Choose Pro$399/ month
20,000 assessments or 2,000 full verifications a month, for production volumes. The warranty on qualifying verdicts.
Or $333 a month, billed $3,990 a year
Choose ScaleEvery plan includes 1,000 extractions a day, an extraction being one call however long the text.
Compare plans08Questions
A content detector guesses who wrote a text. Lenz checks whether what the text says is true: it takes an answer you already know came from a model and checks each factual statement against independent public sources.
For the facts, yes: Lenz checks the factual statements in the generated answer against public sources. For faithfulness to your own retrieved context, no; that is a different check, and Lenz does not compare the answer with your documents. It does check the public pages and papers the answer cites.
Different questions, different budgets. /assess is synchronous, ~15 seconds per call, and fits inside a chat completion. /verify is an asynchronous investigation against public sources, ~90 seconds per statement, and returns on a webhook. /review is the same sequence on a whole draft, asynchronous, about 2 to 4 minutes, and returns the issues with suggested rewrites.
Every full verification ships the sources it used, the arguments on both sides and the reviewers’ reasoning, so you can check the check. Lenz also publishes an open evaluation of where frontier models disagree on real-world fact-checks.
Not answered here? Talk to us