Extract

Extract

Extract verifiable claims from arbitrary text.

Runs the extraction step on its own — no research, no debate, no credit charge. Enumerates every distinct major factual claim in the input (up to 100), ordered most-check-worthy-first, in claims (one item for a single claim, [] for none). Claims returned here verify cleanly when submitted verbatim to POST /verify.

Pass focus to narrow the result to the claims you care about — a short description such as "market size, growth and competitors", at most 300 characters. A focus selects from the claims the extractor found and nothing else: it cannot add a claim, reword one, reorder them, change the language, or change what counts as a claim. Ordering stays most-check-worthy-first.

status is one of:

  • ready — claims were found (and, with a focus, at least one matched).
  • no_checkable_claim — no claim in the input could be checked against public evidence.
  • no_match — claims were found but none fall within your focus. The unfocused list is never substituted; widen the focus and call again.

text can also be a single public web page URL (http or https, nothing else in the field). Lenz reads the page, or a YouTube video's transcript, and extracts the claims from its first 50,000 characters. Pages behind a login (Facebook, Instagram, Threads, LinkedIn) can't be read. A URL call typically takes 5-40 seconds, so give it a 90-second client timeout (SDK 2.13 and later do). A page that cannot be read answers 502 extraction_failed; when the services that read pages are down, 503 upstream_unavailable with Retry-After. Neither uses a unit of the daily cap.

Pass locate: true to keep only the claims that can be traced directly back to your text, and get each claim's positions: the passages that make it, with start / end offsets into text as you sent it, in Unicode code points. A claim the text does not make, or makes with a different figure, is left out, so the list says what the author wrote and nothing else. Offsets count code points, not UTF-16 units: in JavaScript slice with Array.from(text).slice(start, end).join(''). For a URL the offsets are null and each position carries its passage. Locating adds a few seconds, never more than 20. If it cannot run, every positions is null and the claims are returned unfiltered. locate defaults to false.

Accepts up to 50,000 characters (longer input is truncated). Free for API-key holders, capped at 1000 calls per ACCOUNT per day (resets at 00:00 UTC) regardless of input length — a focused call costs the same one unit as an unfocused one. The cap is shared across all of the account's keys.

Versions. 200: 2026-10-11 receives ExtractOut, 2026-05-13 receives ExtractOutLegacy; 422: 2026-10-11 receives ValidationErrorOut, 2026-05-13 receives ValidationErrorOutLegacy; default: 2026-10-11 receives ErrorOut, 2026-05-13 receives ErrorOutLegacy.

post/api/v1/extract

Request

  • Base URL: https://lenz.io
  • URL: https://lenz.io/api/v1/extract
  • Auth: HTTP bearer

Headers

X-Lenz-API-Versionstring
Example:2026-05-13

The API version to answer in, as a date. A date before 2026-10-11 (or a value that is not a date) gets 2026-05-13. See https://lenz.io/docs/api-versions.

Request body

textstring required

The document to extract claims from. Up to 50,000 characters; longer input is truncated. Or a single public web page URL (http or https, nothing else in the field): Lenz reads the page, or a YouTube video's transcript, and extracts the claims from its first 50,000 characters.

languagestring

ISO 639-1 code for the language of the emitted claims. Omitted: English. auto: detected from the submitted text (the same rule as lenz.io: a supported language, or English when the text is short, English or in a language we do not answer in). A code always wins. Responses carry the code that was used, never auto. For a text that is one URL, auto reads the page.

focusstring

Optional. Narrows the result to the claims this describes, e.g. "market size, growth and competitors". At most 300 characters — a longer focus is rejected, never truncated. A focus can only select from the claims the extractor found: it cannot add a claim, reword one, reorder them, or change what counts as a claim. When nothing matches, status is no_match and claims is empty; the unfocused list is never substituted.

locateboolean nullable

Optional, default false. When true, only claims that could be traced directly back to your text are returned, and each claim's positions say where in the text it is made. A claim found nowhere in the text, or found with a different figure, is left out; so is a list that ends up empty, which answers no_checkable_claim. Adds a few seconds, never more than 20. If the claims cannot be located, every positions is null and the list is returned unfiltered.

Response

OK

status'ready' | 'no_checkable_claim' | 'no_match'
domainstring
presumed_intentstring
original_inputstring
languagestring nullable

The language the claims are written in, as an ISO 639-1 code: the one you sent, en when you sent none, or the detected one when you asked for detection. Pass it on to /assess or /verify to keep a chain in one language. Absent on a replay of a response stored before this field existed.

Changes

No recorded changes to this operation across all 1 revision of this API.