For teams shipping AI-drafted text

Catch AI hallucinations before they ship.

Lenz is a fact-checking API for model-generated text. It checks factual statements against independent public sources, not against the model that produced them, and returns structured results.

€10,000 warranty per qualifying fact check

Hallucination detection against public sources.

Send Lenz an answer your model produced.

It pulls out the factual statements and checks each against independent public sources, using models from multiple vendors. On a full verification, models argue for and against each statement, three reviewers assess it, and the result ships with the trace.

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.

Inside Cursor and Claude Code with one command and your key; from a script in Python or TypeScript; or through the REST API.

The API: two different checks, one sequence.

Lenz supplies the verdicts. Your gate applies your thresholds.

  1. An answer is drafted

    A support reply, a RAG answer, a summary — anything a model wrote that a customer is about to read.

  2. Extract the statements

    POST /extract splits the answer into single factual statements, up to 20, each self-contained enough to check on its own. Opinions, recommendations, predictions and questions are left out. It costs no credits, capped at 1,000 calls a day per account.

  3. Sort them, then establish the ones that matter

    POST /assess is a judgement: a panel of models returns a verdict and a confidence level per statement, synchronously, about 10 seconds, up to 20 statements a call; no score, no sources. Send the negative and low-confidence ones to POST /verify: an investigation against independent public sources, about 90 seconds a statement, asynchronous, with a webhook.

  4. Your gate decides

    Your thresholds and your routing: what clears them ships, and what does not goes to your reviewer with the verdict, the sources and the reasoning already attached. Lenz returns results — it never holds, edits or publishes your text.

  5. Ship, with the record

    A full verification keeps its trace: the statement as framed, every source with its date, the arguments on both sides, the reasoning. API submissions are private by default; visibility: "unlisted" returns a link you can pass on.

The sequence is extract → assess in bulk → verify the uncertain results → ask follow-up questions about a verification. Assess to sort; verify to establish.

Try it on your own output →

Fact-checking RAG answers.

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.

A guardrail filters. Lenz investigates.

Fast guardrails filter against the model’s own context, at low latency.

Lenz checks the statement against evidence the model was never given: independent public sources, models from multiple vendors arguing both sides on what it found, three reviewers weighing the arguments. A split panel stays visible in the result.

The open evaluation: where frontier models disagree on real-world fact-checks →

Check LLM output with Python.

Python pip install lenz-io

# model output in — the statements your policy holds back, out
from lenz_io import Lenz

client = Lenz(api_key="lenz_...")
extracted = client.extract(text=model_output)
# identified_claims is empty when the text yields a single statement
claims = extracted.identified_claims or [extracted.claim]
r = client.assess(claims=claims)   # one row per statement, same order

# your routing policy. "Error" means the item was not checked — never ship it as clean
for c in r.claims:
    if c.verdict in ("False", "Mostly False", "Mixed", "Error") or c.confidence == "low":
        print("HOLD:", c.claim, c.verdict, c.confidence)
# HOLD: Python 3.12 runs about 20% faster than Python 3.11 ... False high

TypeScript SDK: npm install lenz-io, with the same example on the developer page. Webhooks replace the wait on /verify.

What comes back: verdict, score, sources, reasoning.

Branch on verdict and confidence from either endpoint; the rest exists only on a full verification.

An assessment returns verdict and confidence per statement, and a verification_url when a full verification of it completed in the last hour. A full verification adds lenz_score, key_finding, sources with title, snippet and date, executive_summary, warnings and the audit block with the debate and the panel reasoning. A full verification fetched with your API key carries a coverage block saying whether that verdict qualified. Your API submissions are private to your account.

The recorded responses, field by field, on the developer page →

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.

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.

How the warranty works →

Pricing: start free, no card.

Free tier, no card: 100 assessments or 10 full verifications a month, in any combination. The Pro tier is $99 a month for 5,000 assessments or 500 full verifications, the same way, and the Scale tier is $399 a month for production volumes. Every plan includes 1,000 extractions a day, an extraction being one call however long the text.

Compare plans →

Frequently asked questions

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.

Different questions, different budgets. /assess is synchronous, about 10 seconds per call, and fits inside a chat completion. /verify is an asynchronous investigation against public sources, about 90 seconds per statement, and returns on a webhook.

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 →

Catch the next hallucination before a customer does.