---
title: "Get Verification"
method: GET
path: "/api/v1/verifications/{verification_id}"
tags: ["Verifications"]
---

# Get Verification

`GET /api/v1/verifications/{verification_id}`

## Request

- Base URL: `https://lenz.io`
- URL: `https://lenz.io/api/v1/verifications/{verification_id}`
- Auth: none declared

Retrieve the full verification report for a single claim.

Returns the verdict, citations, and (under ``audit``) the panel
reasoning, debate transcript, and assessments. Same shape as the
/verify webhook payload and the deprecated /library/{id} endpoint
this merger replaces.

Authorization model (optional Bearer):
- Anon callers see any listed public claim (``visibility='public'`` AND
  ``status`` in {pending, published}) PLUS any API ``unlisted`` claim
  (``visibility='public'``, ``status='hidden'``, ``source_channel='api'``):
  unlisted is readable by verification_id, just never surfaced in listings.
- Authed callers additionally see their own claims regardless of
  visibility or status.
- Private claims, and non-API hidden public claims (retracted / pre-screen),
  owned by someone else return 404.

Also accepts the **task_id** ``/verify`` returned, in place of a
verification_id. A completed run reads exactly as its verification_id
would. A run that has not completed answers **409** with ``status``
(``processing``, ``needs_input`` or ``failed``) and a ``hint``, plus the
failure fields when it failed; poll ``GET /verify/status/{task_id}`` for
progress. A task_id that is unknown, or not yours, answers 404 with a
``hint`` at that endpoint.

**Versions.** 200: `2026-10-11` receives `ClaimDetailOut`, `2026-05-13` receives `ClaimDetailOutLegacy`; 409: `2026-10-11` receives `VerificationNotReadyOut`, `2026-05-13` receives `VerificationNotReadyOutLegacy`; default: `2026-10-11` receives `ErrorOut`, `2026-05-13` receives `ErrorOutLegacy`.

## Path parameters

- `verification_id` string, required

## Headers

- `X-Lenz-API-Version` string

## Response `200`

OK

- ClaimDetailOut: Full verification report. Slim top-level (verdict + confidence + lenz_score + sources). Audit detail (panel reasoning, debate, individual panelist assessments) lives under ``audit``. Same field vocabulary as ``VerificationListItemOut`` (list view) and ``AssessClaimOut`` (fast verdict). A consumer that branches on ``verdict`` or ``confidence`` reads the same field name regardless of which endpoint produced the payload.
  - `verification_id` string, required
  - `claim` string, required
  - `visibility` string
  - `depth` string
  - `domain` string
  - `entities` EntityRef[]
    - `name` string, required
    - `qid` string, nullable
  - `presumed_intent` string
  - `verdict` string: `True`, `Mostly True`, `Mixed`, `Mostly False` or `False`, or `No Public Record`: Lenz found no public record that settles the claim, which does not make it false. It has no `lenz_score` (null), a `confidence`, and is never warranted. Version `2026-05-13` never receives it: it reads such a run as a failure (`research_empty` when no source was found, else `research_insufficient`).
  - `confidence` string
  - `lenz_score` integer, nullable: 1-10; null for `No Public Record`.
  - `key_finding` string
  - `executive_summary` string
  - `warnings` string[]
  - `suggested_rewrite` string, nullable: A suggested rewrite of `claim` that this verification's findings support, to use in place of the original sentence. It has not been verified itself: before using it, review it or run it through `/verify`. `null` for a true claim, when no correction is established, and on verifications that predate the field. On every verification, single or listed; not on `/assess` rows.
  - `created_at` string
  - `completed_at` string: When the verification finished (ISO 8601). Always set on a completed verification; a rerun moves it. API version `2026-05-13` sends `modified_at` instead: this time, but only when it falls on a later UTC calendar day than `created_at`, else null.
  - `sources` SourceOut[]
    - `source_name` string
    - `title` string
    - `url` string
    - `snippet` string: The sentence(s) quoted from the source page, verbatim and in the page's own language, with ` … ` between separate passages. A few sources carry no verified quote — for those it is the surrounding passage instead, which may run longer and contain line breaks.
    - `snippet_language` string, nullable: The language of `snippet` (the source page's own language) as an ISO 639-1 code (e.g. `uk`, `pt`), when it is not English; null for English or when unknown. The verdict's own language is `language`.
    - `date` string
  - `audit` AuditOut: Audit / explainability block — for callers that need to show their work. ``panel_agreement`` is derived from the panel: ``unanimous`` (all agree), ``majority`` (score spread <= 2), or ``split`` — over every reviewer that voted, so a panel that called in Reviewers D and E is counted whole. For "No Public Record" it counts the no-record votes (``unanimous`` when every voting reviewer voted no-record, ``majority`` when most did), and is ``''`` when no panel voted (decided by research alone); its debate is empty.
    - `adjudication_summary` string
    - `assessments` AssessmentOut[]
      - `panelist_name` string
      - `focus_area` string
      - `score` number, nullable
      - `reasoning` string
      - `warnings` string[]
    - `debate_pro` DebateSideOut: One side of the debate (pro or con). Nested under ``audit``.
      - `role` string
      - `argument` string
      - `rebuttal` string
    - `debate_con` DebateSideOut: One side of the debate (pro or con). Nested under ``audit``.
      - `role` string
      - `argument` string
      - `rebuttal` string
    - `panel_agreement` string
  - `language` string, required
  - `coverage` CoverageOut: Whether this verdict carries a warranty, and if not, why not. Present only when covered verification is enabled. It describes the pair (this account, this analysis), not the analysis alone: two accounts can hold two certificates over one cached verdict, so the block one customer sees is never the block another sees. ``reasons`` is empty exactly when ``status`` is not ``uncovered``. The vocabulary is closed and deliberately smaller than the set of rules behind the decision: ``plan`` and ``depth`` are actionable, ``account`` means the account turned certificates off (Pro and Scale), ``verdict`` is a product rule callers design around, ``quality`` covers everything a caller can neither act on nor define, and ``withdrawn`` / ``issue_failed`` are statements about Lenz rather than about the caller's claim.
    - `status` 'covered' | 'uncovered' | 'pending_timestamp'
    - `reasons` string[]
    - `certificate_id` string, nullable
    - `certificate_url` string, nullable
    - `as_of` string, nullable
    - `currency` string
    - `cap` integer
    - `aggregate` integer
    - `terms_version` string

## Other responses

- `404`: Not Found
- `409`: Conflict
- `410`: Gone
- `default`: An error

---

[API](https://skmtc.dev/lenz/apis/lenz-ai-fact-checking-api.md) · [All operations](https://skmtc.dev/lenz/apis/lenz-ai-fact-checking-api/llms.txt) · [OpenAPI document](https://skmtc.dev/lenz/apis/lenz-ai-fact-checking-api/revisions/6150947324bf?raw)
