Skip to content
Documentation/Verification

Verify a claim

Check a factual claim against sources and return citations, source stances, and a verdict.

Markdown
POST/api/v1/verifyhttps://api.webcite.co

When to use it

Use this when you need sources and an assessment of whether they support a claim. Set decompose_claim: true to check the parts of a compound claim. Both /verify and /verify/stream support decomposition.

include_numeric_assess adds an arithmetic check of the claim text to this JSON endpoint. It does not supply source figures or certify the choice of operands. Use numeric verification for retained source operands.

Pass up to five public HTTPS URLs in source_urls to inspect specific sources directly. filters sets required source constraints; an unmet constraint returns no qualifying citation.

Evidence response contract

The hosted API uses evidence policy 13. The hosted MCP connector runs the current release; mcp-health reports its live version and tool count. A local MCP server runs the npm package version you installed. Inspect response metadata and the installed client version; saved responses retain their original policy and evidence time.

Preserve each citation's optional evidence receipt and credibility_basis, including null scores. Verdict confidence_available: false means calibrated truth confidence is unavailable; aggregation_score preserves the legacy number for compatibility. See publisher evidence receipts and score meanings. Source search does not become a judged verification merely because it returns citations.

Choose and constrain sources

Use source_urls for up to five public HTTPS sources, and filters for required source constraints. The request field is filters, not source_filters. Supported fields are source_type, is_primary_source, official_country (two-letter country code), publication_year (from, to), and domain (hostnames, including their subdomains). Missing required source type or publication year does not qualify. Unknown domain authority alone is not dropped by is_primary_source; use official_country or explicit domain constraints when you need a known government source. An official source must still address the same measure, period, currency and reporting basis as the claim.

search_metadata.constraint reports searched and kept counts and dropped host classes. No qualifying citation means no qualifying evidence was retained, not that the claim is false. Supplied sources can also be unavailable or only partly read. Inspect evidence.readerCoverage, readerLimitations and numericScope before treating a PDF table or image as fully covered.

include_source_reads is restricted to signed product delegations with an active workspace grant. It does not enable raw source-read receipts for an ordinary public API key; public MCP responses remain redacted.

evidence_scope selects filed folder sources instead of web verification. It requires folder read and verify permission and returns folder citations at zero credits, with support: not_checked and verdict: null. App keys must provide it. Unbound account keys may omit it for web verification.

Request

2 credits for search only; 3 with stance; 4 with a verdict. No additional operation charge. Filed-folder verification with `evidence_scope` uses 0 credits.

Examples run on your server. Set WEBCITE_API_KEY first. Python examples use the requests package.

curl
curl --fail-with-body -X POST 'https://api.webcite.co/api/v1/verify' \
  -H "x-api-key: $WEBCITE_API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{
  "claim": "The Eiffel Tower is 330 meters tall",
  "include_stance": true,
  "include_verdict": true
}'

Path and query parameters

Idempotency-Key (header)string

Optional 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 endpoint. Reuse with the same request to recover a completed result without regenerating or charging twice. Different payload returns 409. Completed checkpoints are retained for 24 hours; missing checkpoints or unresolved accounting return 503 instead of repeating work. This header contract applies to JSON verify only.

Request body

claimstringrequired

The factual claim to verify

decompose_claimboolean

Break complex claims into sub-claims and verify each independently

Default: false

evidence_scopeobject

Ground the claim in a folder's filed sources instead of the web: {folder_id, include_descendants (default true)}. The response carries folder citations (stable citation_id, span, quote, folder_id, relation); stance and verdict are not produced. Omit for the unchanged web verification.

Show evidence_scope fields
folder_idstring
include_descendantsboolean

Default: true

filtersobject

Required source constraints. An unmet constraint returns no qualifying citation.

include_numeric_assessboolean

If true, also run deterministic numeric assessment on the claim text (no extra figure operands). Skips with reason when the claim is not numeric. Default false. Does not add a separate credit charge in this release; uses the verify bill only.

Default: false

include_source_readsboolean

Include retained supplied-URL read receipts. Requires a signed product source-verify delegation with an active workspace grant. Public MCP responses remain redacted.

include_stanceboolean

Include stance analysis for each source (adds 1 credit)

Default: true

include_verdictboolean

Generate an overall verdict with confidence score (adds 1 credit)

Default: true

source_urlsstring[]

Up to five public HTTPS source URLs to inspect directly.

thread_idstring

Thread ID to continue a conversation

Response

Read claim_groups for each claim and its citations, domain_groups, and verdict. Use operation_id and usage.credits to reconcile billing. Optional analysis fields may be absent; absence does not mean the claim is supported.

200 response

application/json

citationsobject[]legacy

[DEPRECATED] Use claim_groups[0].citations instead. Legacy citations array.

Show citations fields
authorstringrequired

Author or domain name

credibility_basisstring

Whether credibility_score rests on an actual measurement ('measured') or is a placeholder because no check has run yet ('unknown', e.g. no grounding signal or the citation has not been analysed). Absent means the same as "measured" for citations produced before this field existed.

Values: "measured""heuristic""unknown"

credibility_scorenumberrequired

Credibility/relevance score from 1-100 (higher = more credible/relevant/authoritative)

evidenceobject

Publisher evidence receipt v1: state, originalUrl, finalUrl, contentHash, retrievedAt, quoteMatch, typed publisher dates, retention, replayable and failureReason. Missing on legacy records means unknown provenance.

group_idstring

Group ID for citations from the same domain

highlight_rangesstring[]

Character ranges [start, end] in snippet that are most relevant to the claim

idstringrequired

Unique citation identifier

is_group_primaryboolean

Whether this is the primary (highest-ranked) citation from its domain group

publication_yearnumber

Publication year of the cited source

ranknumberrequired

Sequential rank (1, 2, 3...) where rank 1 is the highest/best citation, based on credibility_score and verified status

ranking_factorsobject

Breakdown of how the ranking score was calculated

Show ranking_factors fields
content_relevancenumberrequired

How well the content matches the claim being verified (0-100).

recencynumberrequired

Publication freshness score (0-100). Current year = 100, decreases with age.

source_authoritynumberrequired

Domain reputation score (0-100). Higher scores for government, academic, major news sources.

snippetstringrequired

Relevant excerpt from the source

source_metadataobject

Additional metadata about the source

Show source_metadata fields
domainstringrequired

Extracted domain from URL

domain_categorystringrequired

Category of the source domain

Values: "government""academic""news""organization""encyclopedia""social""other"

is_fact_check_sitebooleanrequired

Whether this is a fact-checking website (snopes, politifact, etc.)

is_primary_sourcebooleanrequired

Whether this is a primary source (government, official, press release)

source_typestring

Source type: Government Document, Dataset, Journal, Report, Trusted Media, Article, Reddit, Social Media

Values: "Government Document""Dataset""Journal""Report""Trusted Media""Article""Reddit""Social Media"

stancestring

Whether this citation supports or contradicts the claim (only with useEnhancedAnalysis)

Values: "supports""contradicts""partially_supports""neutral""inconclusive"

stance_confidencenumber

Confidence in the stance assessment (0-100)

stance_explanationstring

Brief explanation of the stance determination

statusstringrequired

Verification status of the citation

titlestringrequired

Title of the cited source

urlstringrequired

URL of the cited source

claim_groupsobject[]

Unified tree: All data organized by claim. Each claim_group contains citations, domain_groups, and verdict.

Show claim_groups fields
citation_countnumberrequired

Number of citations for this claim

citationsobject[]required

All citations for this claim (full objects with stance, ranking, etc.)

Show citations fields
authorstringrequired

Author or domain name

credibility_basisstring

Whether credibility_score rests on an actual measurement ('measured') or is a placeholder because no check has run yet ('unknown', e.g. no grounding signal or the citation has not been analysed). Absent means the same as "measured" for citations produced before this field existed.

Values: "measured""heuristic""unknown"

credibility_scorenumberrequired

Credibility/relevance score from 1-100 (higher = more credible/relevant/authoritative)

evidenceobject

Publisher evidence receipt v1: state, originalUrl, finalUrl, contentHash, retrievedAt, quoteMatch, typed publisher dates, retention, replayable and failureReason. Missing on legacy records means unknown provenance.

group_idstring

Group ID for citations from the same domain

highlight_rangesstring[]

Character ranges [start, end] in snippet that are most relevant to the claim

idstringrequired

Unique citation identifier

is_group_primaryboolean

Whether this is the primary (highest-ranked) citation from its domain group

publication_yearnumber

Publication year of the cited source

ranknumberrequired

Sequential rank (1, 2, 3...) where rank 1 is the highest/best citation, based on credibility_score and verified status

ranking_factorsobject

Breakdown of how the ranking score was calculated

Show ranking_factors fields
content_relevancenumberrequired

How well the content matches the claim being verified (0-100).

recencynumberrequired

Publication freshness score (0-100). Current year = 100, decreases with age.

source_authoritynumberrequired

Domain reputation score (0-100). Higher scores for government, academic, major news sources.

snippetstringrequired

Relevant excerpt from the source

source_metadataobject

Additional metadata about the source

Show source_metadata fields
domainstringrequired

Extracted domain from URL

domain_categorystringrequired

Category of the source domain

Values: "government""academic""news""organization""encyclopedia""social""other"

is_fact_check_sitebooleanrequired

Whether this is a fact-checking website (snopes, politifact, etc.)

is_primary_sourcebooleanrequired

Whether this is a primary source (government, official, press release)

source_typestring

Source type: Government Document, Dataset, Journal, Report, Trusted Media, Article, Reddit, Social Media

Values: "Government Document""Dataset""Journal""Report""Trusted Media""Article""Reddit""Social Media"

stancestring

Whether this citation supports or contradicts the claim (only with useEnhancedAnalysis)

Values: "supports""contradicts""partially_supports""neutral""inconclusive"

stance_confidencenumber

Confidence in the stance assessment (0-100)

stance_explanationstring

Brief explanation of the stance determination

statusstringrequired

Verification status of the citation

titlestringrequired

Title of the cited source

urlstringrequired

URL of the cited source

claimstringrequired

The claim/sub-prompt text

claim_idstringrequired

Unique identifier for this claim group

claim_indexnumberrequired

Index of the claim (1-based)

domain_groupsobject[]

Citations grouped by domain (lightweight, for deduplication UI)

Show domain_groups fields
domainstringrequired

Domain that groups these citations

domain_categorystringrequired

Category of this domain

Values: "government""academic""news""organization""encyclopedia""social""other"

group_idstringrequired

Unique identifier for this domain group

group_stancestringrequired

Overall stance of citations from this domain

Values: "supports""contradicts""mixed""neutral"

primary_citation_idstringrequired

ID of the primary (highest-ranked) citation from this domain

stance_summarystringrequired

Overall stance summary based on citations

Values: "supported""contradicted""mixed""unverifiable"

verdictobject

Verdict for this claim (streamed as citations complete)

Show verdict fields
aggregation_scorenumber

Legacy aggregate score retained for compatibility

calibrated_confidencenumber | null
claimstringrequired

The original prompt/claim that was analyzed

confidencenumberrequired

Legacy aggregation score (0-100); use confidence_available and calibrated_confidence for calibration status

confidence_availableboolean

True only when calibrated confidence is available

confidence_basisstring

Values: "unknown""heuristic""calibrated"

conflictobject | null

The quoted, named pair of sources behind a "mixed" verdict. Null for every other verdict.

Show conflict fields
contradictingobjectrequired
Show contradicting fields
citation_idstringrequired

Id of the citation taking this side

quotestringrequired

The text this source actually carries, quoted rather than summarised, so a reader can check the disagreement themselves

sourcestringrequired

The source, by url where known and by domain otherwise

supportingobjectrequired
Show supporting fields
citation_idstringrequired

Id of the citation taking this side

quotestringrequired

The text this source actually carries, quoted rather than summarised, so a reader can check the disagreement themselves

sourcestringrequired

The source, by url where known and by domain otherwise

correction_statusstring

Whether a source-backed replacement statement is available

Values: "available""not_established""conflicted""not_needed"

correctionsobject[]

Corrections when the claim contains inaccuracies

Show corrections fields
actualstringlegacy

Deprecated v1 alias of corrected_statement

citation_idsstring[]required

IDs of citations that support this correction

claimedstringrequired

What the user originally claimed

corrected_statementstringrequired

A standalone replacement statement supported by the cited evidence

proofobject[]required
Show proof fields
citation_idstringrequired
quotestringrequired

Exact passage copied from the cited source excerpt

document_breakdownobject

Stance counts over every document analysed, before syndicated copies of one telling were collapsed into a single origin.

Show document_breakdown fields
contradictsnumberrequired

Number of citations that contradict the claim

inconclusivenumber

Number of citations that looked at the claim and could not tell. Distinct from neutral, which is a source that took no side.

irrelevantnumber

Number of citations judged off-topic. Excluded from every verdict denominator.

neutralnumberrequired

Number of citations that took no side. This counts the neutral stance only. It previously also absorbed inconclusive and unscored citations, which are now reported in their own fields below.

partially_supportsnumberrequired

Number of citations that partially support the claim

supportsnumberrequired

Number of citations that fully support the claim

unknownnumber

Number of citations with no stance recorded. Never treated as agreement or as neutral: these were not scored, not scored as undecided.

document_countnumber

Documents analysed. Reported for transparency; origin_count is what the verdict counts.

evidence_statusstring

Readable source availability and stance coverage, independent of the legacy conflict flag. Absent means not assessed by this policy.

Values: "unavailable""claim_evidence""context_only""unassessed"

insufficient_evidenceboolean

True when the counts were split but no two sources could be quoted disagreeing, so the split was reported as unverifiable rather than as a controversy.

key_findingsobject[]

Key facts extracted from citations (only with useEnhancedAnalysis)

Show key_findings fields
citation_idsstring[]required

IDs of citations that support this finding

confidencenumberrequired

Legacy model finding score (0-100); not calibrated truth confidence

confidence_availableboolean

True only when calibrated confidence is available

confidence_basisstring

Values: "unknown""heuristic""calibrated"

evidence_rolestring

Whether cited sources take a position on this claim or provide context only; absent means unassessed.

Values: "claim_evidence""context"

findingstringrequired

A key fact extracted from the citations

origin_countnumber

Distinct origins behind those documents. Four outlets running one wire story are four documents and one origin, and only this number votes.

resultstringrequired

Overall verdict based on citation analysis

Values: "supported""partially_supported""contradicted""mixed""unverifiable"

stance_breakdownobjectrequired

Breakdown of citation stances over distinct ORIGINS, which is what the verdict is computed from. For the raw per-document counts before origins were collapsed, see document_breakdown.

Show stance_breakdown fields
contradictsnumberrequired

Number of citations that contradict the claim

inconclusivenumber

Number of citations that looked at the claim and could not tell. Distinct from neutral, which is a source that took no side.

irrelevantnumber

Number of citations judged off-topic. Excluded from every verdict denominator.

neutralnumberrequired

Number of citations that took no side. This counts the neutral stance only. It previously also absorbed inconclusive and unscored citations, which are now reported in their own fields below.

partially_supportsnumberrequired

Number of citations that partially support the claim

supportsnumberrequired

Number of citations that fully support the claim

unknownnumber

Number of citations with no stance recorded. Never treated as agreement or as neutral: these were not scored, not scored as undecided.

summarystringrequired

Human-readable summary of the findings

unverified_claimsstring[]

Parts of the claim that could not be verified by any source

contentstring

Text content from agent (for non-citation responses)

domain_groupsobject[]legacy

[DEPRECATED] Use claim_groups[n].domain_groups instead. Legacy domain grouping.

Show domain_groups fields
domainstringrequired

Domain that groups these citations

domain_categorystringrequired

Category of this domain

Values: "government""academic""news""organization""encyclopedia""social""other"

group_idstringrequired

Unique identifier for this domain group

group_stancestringrequired

Overall stance of citations from this domain

Values: "supports""contradicts""mixed""neutral"

primary_citation_idstringrequired

ID of the primary (highest-ranked) citation from this domain

generated_promptsstring[]

Generated sub-prompts when useMultiplePrompt is enabled

narrative_statusstring

no_sources: no citation was retained, so no narrative is returned except the legacy NOT_SEARCHABLE sentinel. model_text: the narrative is model-written; only its kept [n] markers point at returned citations.

Values: "no_sources""model_text"

operation_idstring | null

Billing operation identifier on public v1 responses; null when no operation was recorded.

search_metadataobject

Metadata about the search and analysis process

Show search_metadata fields
analysis_modelstringrequired

AI model used for analysis

constraintobject

Explicit constraint accounting: searched vs kept, plus dropped host classes (not publisher names).

processing_time_msnumberrequired

Total processing time in milliseconds

relevant_sources_foundnumberrequired

Number of relevant sources found and included

source_url_readsstring[]

Per supplied-URL read receipts, with fetched_at from retained capture time or null when unknown. Present for authenticated DD/eval; omitted on public MCP.

total_sources_searchednumberrequired

Total number of sources searched

search_resultstring

Model-written search summary. It is not evidence. With no_sources it is empty except for the legacy NOT_SEARCHABLE sentinel.

search_result_with_citations_mappingstring

The search summary with [n] markers. [n] is the nth entry of citations (or of claim_groups citations when citations is absent). A marker is kept only when that citation passage is fetched and contains every figure and literal metric/unit context in the marked sentence or table row; figures without a marker are unsourced model text. Empty when narrative_status is no_sources.

thread_idstring

Thread ID for conversation continuity

totalResultsnumber

Total number of citations across all claims

usageobject

Billing usage on public v1 responses.

Show usage fields
creditsnumber | nullrequired

Credits actually deducted; null when a priced operation was not metered. Zero denotes a genuinely free operation.

usagesobject

Token usage of the model calls this request made; credits are reported separately.

Show usages fields
cachedbooleanrequired

True when the response was served from the server cache and this request spent no tokens.

input_tokensnumberrequired

Input tokens of the model calls this request made. 0 when the response was served from the server cache.

output_tokensnumberrequired

Output tokens of the model calls this request made.

total_tokensnumberrequired

Total tokens of the model calls this request made.

usage_unknownbooleanrequired

True when a model call this request made could not be measured, so the totals are a lower bound.

verdictobjectlegacy

[DEPRECATED] Use claim_groups[n].verdict instead. Legacy overall verdict.

Show verdict fields
aggregation_scorenumber

Legacy aggregate score retained for compatibility

calibrated_confidencenumber | null
claimstringrequired

The original prompt/claim that was analyzed

confidencenumberrequired

Legacy aggregation score (0-100); use confidence_available and calibrated_confidence for calibration status

confidence_availableboolean

True only when calibrated confidence is available

confidence_basisstring

Values: "unknown""heuristic""calibrated"

conflictobject | null

The quoted, named pair of sources behind a "mixed" verdict. Null for every other verdict.

Show conflict fields
contradictingobjectrequired
Show contradicting fields
citation_idstringrequired

Id of the citation taking this side

quotestringrequired

The text this source actually carries, quoted rather than summarised, so a reader can check the disagreement themselves

sourcestringrequired

The source, by url where known and by domain otherwise

supportingobjectrequired
Show supporting fields
citation_idstringrequired

Id of the citation taking this side

quotestringrequired

The text this source actually carries, quoted rather than summarised, so a reader can check the disagreement themselves

sourcestringrequired

The source, by url where known and by domain otherwise

correction_statusstring

Whether a source-backed replacement statement is available

Values: "available""not_established""conflicted""not_needed"

correctionsobject[]

Corrections when the claim contains inaccuracies

Show corrections fields
actualstringlegacy

Deprecated v1 alias of corrected_statement

citation_idsstring[]required

IDs of citations that support this correction

claimedstringrequired

What the user originally claimed

corrected_statementstringrequired

A standalone replacement statement supported by the cited evidence

proofobject[]required
Show proof fields
citation_idstringrequired
quotestringrequired

Exact passage copied from the cited source excerpt

document_breakdownobject

Stance counts over every document analysed, before syndicated copies of one telling were collapsed into a single origin.

Show document_breakdown fields
contradictsnumberrequired

Number of citations that contradict the claim

inconclusivenumber

Number of citations that looked at the claim and could not tell. Distinct from neutral, which is a source that took no side.

irrelevantnumber

Number of citations judged off-topic. Excluded from every verdict denominator.

neutralnumberrequired

Number of citations that took no side. This counts the neutral stance only. It previously also absorbed inconclusive and unscored citations, which are now reported in their own fields below.

partially_supportsnumberrequired

Number of citations that partially support the claim

supportsnumberrequired

Number of citations that fully support the claim

unknownnumber

Number of citations with no stance recorded. Never treated as agreement or as neutral: these were not scored, not scored as undecided.

document_countnumber

Documents analysed. Reported for transparency; origin_count is what the verdict counts.

evidence_statusstring

Readable source availability and stance coverage, independent of the legacy conflict flag. Absent means not assessed by this policy.

Values: "unavailable""claim_evidence""context_only""unassessed"

insufficient_evidenceboolean

True when the counts were split but no two sources could be quoted disagreeing, so the split was reported as unverifiable rather than as a controversy.

key_findingsobject[]

Key facts extracted from citations (only with useEnhancedAnalysis)

Show key_findings fields
citation_idsstring[]required

IDs of citations that support this finding

confidencenumberrequired

Legacy model finding score (0-100); not calibrated truth confidence

confidence_availableboolean

True only when calibrated confidence is available

confidence_basisstring

Values: "unknown""heuristic""calibrated"

evidence_rolestring

Whether cited sources take a position on this claim or provide context only; absent means unassessed.

Values: "claim_evidence""context"

findingstringrequired

A key fact extracted from the citations

origin_countnumber

Distinct origins behind those documents. Four outlets running one wire story are four documents and one origin, and only this number votes.

resultstringrequired

Overall verdict based on citation analysis

Values: "supported""partially_supported""contradicted""mixed""unverifiable"

stance_breakdownobjectrequired

Breakdown of citation stances over distinct ORIGINS, which is what the verdict is computed from. For the raw per-document counts before origins were collapsed, see document_breakdown.

Show stance_breakdown fields
contradictsnumberrequired

Number of citations that contradict the claim

inconclusivenumber

Number of citations that looked at the claim and could not tell. Distinct from neutral, which is a source that took no side.

irrelevantnumber

Number of citations judged off-topic. Excluded from every verdict denominator.

neutralnumberrequired

Number of citations that took no side. This counts the neutral stance only. It previously also absorbed inconclusive and unscored citations, which are now reported in their own fields below.

partially_supportsnumberrequired

Number of citations that partially support the claim

supportsnumberrequired

Number of citations that fully support the claim

unknownnumber

Number of citations with no stance recorded. Never treated as agreement or as neutral: these were not scored, not scored as undecided.

summarystringrequired

Human-readable summary of the findings

unverified_claimsstring[]

Parts of the claim that could not be verified by any source

Errors

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 read plus verify permission (403 KEY_SCOPE_DENIED). A folder outside the key scope returns 404 FOLDER_NOT_FOUND.

401
Unauthorized - API key required
403
APP_KEY_EVIDENCE_SCOPE_REQUIRED: app keys need evidence_scope. KEY_SCOPE_DENIED: the key lacks read or verify permission.
409
Idempotency-Key reused with a different verification request
429
Rate limit exceeded
503
Idempotent work in progress, saved result unavailable, or accounting unresolved; retry with the same key
Error handling and retry guidance