Check quotes in a batch
Check whether each quote appears in the source you provide.
/api/v1/verify/batchhttps://api.webcite.coWhen to use it
This checks source grounding. It does not independently search for evidence that the quoted assertion is true. Provide source_text, url, or asset_id for each quote. For retained evidence, supply all three immutable IDs: source_version_id, representation_id, and source_unit_id.
fuzzy and reflowed matches remain needs_review. Omit meaning when no assessment is available; the result reports not_checked. Caller-supplied meaning accepts only changed or ambiguous, never a self-certified faithful.
Match against filed folder sources
evidence_scope: {folder_id, include_descendants: true} supplies filed folder evidence for items with no source. Each matched item returns its folder citation; no match returns an item error. App keys require this scope and read plus verify permission. Their items must omit source_text, url, asset_id, source_version_id, representation_id and source_unit_id. Unbound account keys retain own-source verification.
The folder organization billing owner pays an app-key batch. Folder visibility, permissions and an active payer are checked before reservation. Idempotency-Key preserves the original app principal and resolved payer; a changed payer on replay returns 409 before another reservation or dispatch. Results remain an array, with operation and credit receipt headers preserved.
Per-item response example
Illustrative response, not a recorded API result.
[
{
"id": "1",
"quote": "reduced HbA1c by 1.2%",
"binding": {
"grounded": true,
"method": "fuzzy",
"score": 0.67,
"matched_text": "A 1.2% reduction in HbA1c was observed versus placebo."
},
"verification": {
"layer": "bound",
"band": "needs_review",
"confidence": 80,
"grounded": true,
"meaning": "not_checked"
},
"feedback_token": "eyJxIjoi..."
}
]Prepared OCR example
Illustrative response, not a recorded API result.
[
{
"id": "ocr-example",
"quote": "Revenue increased by 18 percent.",
"binding": {
"grounded": true,
"method": "reflowed",
"reading": "body",
"score": 1,
"matched_text": "Revenue increased\nAnnual report\nby 18 percent.",
"rescue": {
"attempted": true,
"rescued": true,
"reading": "Revenue increased by 18 percent.",
"transformations": [
{
"kind": "drop",
"atLine": 1,
"line": "Annual report",
"source": "element_label"
},
{
"kind": "join",
"afterLine": 0
}
],
"droppedLines": [
"Annual report"
],
"retainedSpans": [
{
"page": 1,
"fromLine": 0,
"toLine": 0
},
{
"page": 1,
"fromLine": 2,
"toLine": 2
}
],
"calibrationKey": "illustrative-prepared-artifact-key",
"basis": "code",
"model": null,
"decidedAt": "2026-09-19T00:00:00.000Z"
}
},
"verification": {
"layer": "bound",
"band": "needs_review",
"confidence": 80,
"grounded": true,
"meaning": "not_checked"
},
"feedback_token": "illustrative-token"
}
]Request
1 credit per item, up to 200 items.
Examples run on your server. Set WEBCITE_API_KEY first. Python examples use the requests package.
curl --fail-with-body -X POST 'https://api.webcite.co/api/v1/verify/batch' \
-H "x-api-key: $WEBCITE_API_KEY" \
-H 'Content-Type: application/json' \
-d '{
"items": [
{
"id": "revenue-2025",
"quote": "Revenue was $12 million.",
"source_text": "The annual report states: Revenue was $12 million."
}
]
}'Path and query parameters
Idempotency-Key (header)stringOptional 1-128 printable non-space ASCII key scoped per API key (with its app, folder limit and permissions) or per user for a user key, and to the verify/batch endpoint. Reuse with the same body (the whole validated request) to recover a completed result without re-running or charging twice. A different body or changed app-batch billing owner returns 409; a repeat while the first is running returns 503. Completed results are retained for 24 hours.
Request body
evidence_scopeobjectBind items that carry no source to a folder's filed sources: {folder_id, include_descendants (default true)}. Each such item is checked against the best folder citation for its quote and returns it as citation; an item with no match returns an error. Items with their own source are unchanged. Omit for the unchanged behaviour.
Show evidence_scope fields
folder_idstringinclude_descendantsbooleanDefault: true
itemsobject[]requiredClaims to verify, each against its source. Bound back per item; a fuzzy match is capped at needs_review, never verified.
Show items fields
asset_idstringAn uploaded asset id to check against.
idstringCaller id echoed back on the result.
meaningstringA meaning-preservation problem you have already found, from an assessment such as POST /api/v2/context/assess-meaning. Only the cautious states are accepted: "changed" and "ambiguous" stop a citation presenting as verified. "faithful" is deliberately NOT accepted here , a clearance asserted by the party asking for the check is not a check, and this field exists precisely so that "nobody assessed this" cannot be mistaken for "an assessor cleared this". Omit it when you found no problem; the result then reports meaning "not_checked", which is what absence honestly means.
Values: "changed""ambiguous"
pagenumber1-based page for an asset source.
quotestringrequiredThe claim or quote to check.
representation_idstringsource_textstringThe source text to check the quote against. Provide this, or url, or asset_id.
source_unit_idstringsource_version_idstringImmutable source version. Requires exact representation and unit IDs.
urlstringA web source URL to resolve and check.
Response
An array of results, one per item. Each result includes binding, verification, and feedback_token. This endpoint returns an array, not an object with a top-level usage receipt.
200 response
application/json
Array of results:
bindingobjectrequiredShow binding fields
groundedbooleanrequiredTrue when the quote was found in the resolved source.
matched_quotestringThe matched substring, when grounded verbatim.
matched_textstringThe best-matching passage found in the source , present even when unbound, so a reviewer sees the closest evidence.
methodstringrequiredHow the quote matched: exact/normalized substring, fuzzy passage match, reflowed OCR reading, or unbound.
Values: "exact""normalized""fuzzy""reflowed""unbound"
readingstringDerived body reading with page furniture removed; absent for stored text.
Values: "body"
rescueobjectOCR rescue outcome: attempted=false with code/reason, attempted=true and rescued=false (optionally ambiguous), or rescued=true with transformations, raw dropped lines and retained spans. Unknown or unattempted is never a failed rescue.
Show rescue fields
Variant 1
attemptedbooleanrequiredValues: false
codestringrequiredValues: "not_ocr""labels_not_available""judge_unavailable""not_prepared""disabled""resource_limit"
reasonstringrequiredVariant 2
ambiguousbooleanValues: true
attemptedbooleanrequiredValues: true
rescuedbooleanrequiredValues: false
Variant 3
attemptedbooleanrequiredValues: true
basisstringrequiredValues: "code""measured"
calibrationKeystringrequireddecidedAtstringrequireddroppedLinesstring[]requiredmodelstring | nullrequiredreadingstringrequiredDerived matching text; display the raw preview text instead.
rescuedbooleanrequiredValues: true
retainedSpansobject[]requiredShow retainedSpans fields
fromLineintegerrequiredpageintegerrequiredtoLineintegerrequiredtransformationsobject[]requiredShow transformations fields
afterLineintegeratLineintegerkindstringrequiredValues: "dehyphenate""join""drop"
linestringsourcestringValues: "element_label""repetition""page_number""margin_band"
scorenumberSimilarity of the best match, 0..1.
enginestringValues: "context_graph"
errorstringfeedback_tokenstringrequiredidstringCaller id echoed from the request.
judgmentobjectquotestringrequiredsource_checkstringValues: "read""not_read"
verificationobjectrequiredShow verification fields
bandstringrequiredValues: "verified""needs_review""unverified"
binding_methodstringValues: "exact""normalized""fuzzy""reflowed""unbound"
confidencenumber | nullrequiredgroundedbooleanrequiredlayerstringrequiredValues: "deterministic""bound""model""unbound"
meaningstringrequiredValues: "not_checked""faithful""changed""ambiguous"
review_reasonstringErrors
For 400, check the request fields and source identifiers. For 401, check your API key. For 429, wait for the retry interval. See the errors guide before retrying a billable request. App keys require evidence_scope (403 APP_KEY_EVIDENCE_SCOPE_REQUIRED) and must not provide their own source fields (403 APP_KEY_BATCH_SOURCE_FORBIDDEN). Missing read or verify permission returns 403 KEY_SCOPE_DENIED; a folder outside the key scope returns 404 FOLDER_NOT_FOUND. No active folder org payer returns 403 FOLDER_BILLING_OWNER_UNAVAILABLE. Reusing Idempotency-Key with a changed body or app-batch billing owner returns 409.
401- Unauthorized - API key required
403- APP_KEY_EVIDENCE_SCOPE_REQUIRED: app keys need evidence_scope. APP_KEY_BATCH_SOURCE_FORBIDDEN: app items must not supply their own source. FOLDER_BILLING_OWNER_UNAVAILABLE: the folder has no active org payer. KEY_SCOPE_DENIED: missing read or verify permission.
409- Idempotency-Key reused with a different batch request or app-batch billing owner
429- Rate limit exceeded