Verify a claim
Check a factual claim against sources and return citations, source stances, and a verdict.
/api/v1/verifyhttps://api.webcite.coWhen 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 --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)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 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
claimstringrequiredThe factual claim to verify
decompose_claimbooleanBreak complex claims into sub-claims and verify each independently
Default: false
evidence_scopeobjectGround 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_idstringinclude_descendantsbooleanDefault: true
filtersobjectRequired source constraints. An unmet constraint returns no qualifying citation.
include_numeric_assessbooleanIf 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_readsbooleanInclude retained supplied-URL read receipts. Requires a signed product source-verify delegation with an active workspace grant. Public MCP responses remain redacted.
include_stancebooleanInclude stance analysis for each source (adds 1 credit)
Default: true
include_verdictbooleanGenerate an overall verdict with confidence score (adds 1 credit)
Default: true
source_urlsstring[]Up to five public HTTPS source URLs to inspect directly.
thread_idstringThread 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
authorstringrequiredAuthor or domain name
credibility_basisstringWhether 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_scorenumberrequiredCredibility/relevance score from 1-100 (higher = more credible/relevant/authoritative)
evidenceobjectPublisher evidence receipt v1: state, originalUrl, finalUrl, contentHash, retrievedAt, quoteMatch, typed publisher dates, retention, replayable and failureReason. Missing on legacy records means unknown provenance.
group_idstringGroup ID for citations from the same domain
highlight_rangesstring[]Character ranges [start, end] in snippet that are most relevant to the claim
idstringrequiredUnique citation identifier
is_group_primarybooleanWhether this is the primary (highest-ranked) citation from its domain group
publication_yearnumberPublication year of the cited source
ranknumberrequiredSequential rank (1, 2, 3...) where rank 1 is the highest/best citation, based on credibility_score and verified status
ranking_factorsobjectBreakdown of how the ranking score was calculated
Show ranking_factors fields
content_relevancenumberrequiredHow well the content matches the claim being verified (0-100).
recencynumberrequiredPublication freshness score (0-100). Current year = 100, decreases with age.
source_authoritynumberrequiredDomain reputation score (0-100). Higher scores for government, academic, major news sources.
snippetstringrequiredRelevant excerpt from the source
source_metadataobjectAdditional metadata about the source
Show source_metadata fields
domainstringrequiredExtracted domain from URL
domain_categorystringrequiredCategory of the source domain
Values: "government""academic""news""organization""encyclopedia""social""other"
is_fact_check_sitebooleanrequiredWhether this is a fact-checking website (snopes, politifact, etc.)
is_primary_sourcebooleanrequiredWhether this is a primary source (government, official, press release)
source_typestringSource type: Government Document, Dataset, Journal, Report, Trusted Media, Article, Reddit, Social Media
Values: "Government Document""Dataset""Journal""Report""Trusted Media""Article""Reddit""Social Media"
stancestringWhether this citation supports or contradicts the claim (only with useEnhancedAnalysis)
Values: "supports""contradicts""partially_supports""neutral""inconclusive"
stance_confidencenumberConfidence in the stance assessment (0-100)
stance_explanationstringBrief explanation of the stance determination
statusstringrequiredVerification status of the citation
titlestringrequiredTitle of the cited source
urlstringrequiredURL 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_countnumberrequiredNumber of citations for this claim
citationsobject[]requiredAll citations for this claim (full objects with stance, ranking, etc.)
Show citations fields
authorstringrequiredAuthor or domain name
credibility_basisstringWhether 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_scorenumberrequiredCredibility/relevance score from 1-100 (higher = more credible/relevant/authoritative)
evidenceobjectPublisher evidence receipt v1: state, originalUrl, finalUrl, contentHash, retrievedAt, quoteMatch, typed publisher dates, retention, replayable and failureReason. Missing on legacy records means unknown provenance.
group_idstringGroup ID for citations from the same domain
highlight_rangesstring[]Character ranges [start, end] in snippet that are most relevant to the claim
idstringrequiredUnique citation identifier
is_group_primarybooleanWhether this is the primary (highest-ranked) citation from its domain group
publication_yearnumberPublication year of the cited source
ranknumberrequiredSequential rank (1, 2, 3...) where rank 1 is the highest/best citation, based on credibility_score and verified status
ranking_factorsobjectBreakdown of how the ranking score was calculated
Show ranking_factors fields
content_relevancenumberrequiredHow well the content matches the claim being verified (0-100).
recencynumberrequiredPublication freshness score (0-100). Current year = 100, decreases with age.
source_authoritynumberrequiredDomain reputation score (0-100). Higher scores for government, academic, major news sources.
snippetstringrequiredRelevant excerpt from the source
source_metadataobjectAdditional metadata about the source
Show source_metadata fields
domainstringrequiredExtracted domain from URL
domain_categorystringrequiredCategory of the source domain
Values: "government""academic""news""organization""encyclopedia""social""other"
is_fact_check_sitebooleanrequiredWhether this is a fact-checking website (snopes, politifact, etc.)
is_primary_sourcebooleanrequiredWhether this is a primary source (government, official, press release)
source_typestringSource type: Government Document, Dataset, Journal, Report, Trusted Media, Article, Reddit, Social Media
Values: "Government Document""Dataset""Journal""Report""Trusted Media""Article""Reddit""Social Media"
stancestringWhether this citation supports or contradicts the claim (only with useEnhancedAnalysis)
Values: "supports""contradicts""partially_supports""neutral""inconclusive"
stance_confidencenumberConfidence in the stance assessment (0-100)
stance_explanationstringBrief explanation of the stance determination
statusstringrequiredVerification status of the citation
titlestringrequiredTitle of the cited source
urlstringrequiredURL of the cited source
claimstringrequiredThe claim/sub-prompt text
claim_idstringrequiredUnique identifier for this claim group
claim_indexnumberrequiredIndex of the claim (1-based)
domain_groupsobject[]Citations grouped by domain (lightweight, for deduplication UI)
Show domain_groups fields
domainstringrequiredDomain that groups these citations
domain_categorystringrequiredCategory of this domain
Values: "government""academic""news""organization""encyclopedia""social""other"
group_idstringrequiredUnique identifier for this domain group
group_stancestringrequiredOverall stance of citations from this domain
Values: "supports""contradicts""mixed""neutral"
primary_citation_idstringrequiredID of the primary (highest-ranked) citation from this domain
stance_summarystringrequiredOverall stance summary based on citations
Values: "supported""contradicted""mixed""unverifiable"
verdictobjectVerdict for this claim (streamed as citations complete)
Show verdict fields
aggregation_scorenumberLegacy aggregate score retained for compatibility
calibrated_confidencenumber | nullclaimstringrequiredThe original prompt/claim that was analyzed
confidencenumberrequiredLegacy aggregation score (0-100); use confidence_available and calibrated_confidence for calibration status
confidence_availablebooleanTrue only when calibrated confidence is available
confidence_basisstringValues: "unknown""heuristic""calibrated"
conflictobject | nullThe quoted, named pair of sources behind a "mixed" verdict. Null for every other verdict.
Show conflict fields
contradictingobjectrequiredShow contradicting fields
citation_idstringrequiredId of the citation taking this side
quotestringrequiredThe text this source actually carries, quoted rather than summarised, so a reader can check the disagreement themselves
sourcestringrequiredThe source, by url where known and by domain otherwise
supportingobjectrequiredShow supporting fields
citation_idstringrequiredId of the citation taking this side
quotestringrequiredThe text this source actually carries, quoted rather than summarised, so a reader can check the disagreement themselves
sourcestringrequiredThe source, by url where known and by domain otherwise
correction_statusstringWhether a source-backed replacement statement is available
Values: "available""not_established""conflicted""not_needed"
correctionsobject[]Corrections when the claim contains inaccuracies
Show corrections fields
actualstringlegacyDeprecated v1 alias of corrected_statement
citation_idsstring[]requiredIDs of citations that support this correction
claimedstringrequiredWhat the user originally claimed
corrected_statementstringrequiredA standalone replacement statement supported by the cited evidence
proofobject[]requiredShow proof fields
citation_idstringrequiredquotestringrequiredExact passage copied from the cited source excerpt
document_breakdownobjectStance counts over every document analysed, before syndicated copies of one telling were collapsed into a single origin.
Show document_breakdown fields
contradictsnumberrequiredNumber of citations that contradict the claim
inconclusivenumberNumber of citations that looked at the claim and could not tell. Distinct from neutral, which is a source that took no side.
irrelevantnumberNumber of citations judged off-topic. Excluded from every verdict denominator.
neutralnumberrequiredNumber 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_supportsnumberrequiredNumber of citations that partially support the claim
supportsnumberrequiredNumber of citations that fully support the claim
unknownnumberNumber of citations with no stance recorded. Never treated as agreement or as neutral: these were not scored, not scored as undecided.
document_countnumberDocuments analysed. Reported for transparency; origin_count is what the verdict counts.
evidence_statusstringReadable 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_evidencebooleanTrue 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[]requiredIDs of citations that support this finding
confidencenumberrequiredLegacy model finding score (0-100); not calibrated truth confidence
confidence_availablebooleanTrue only when calibrated confidence is available
confidence_basisstringValues: "unknown""heuristic""calibrated"
evidence_rolestringWhether cited sources take a position on this claim or provide context only; absent means unassessed.
Values: "claim_evidence""context"
findingstringrequiredA key fact extracted from the citations
origin_countnumberDistinct origins behind those documents. Four outlets running one wire story are four documents and one origin, and only this number votes.
resultstringrequiredOverall verdict based on citation analysis
Values: "supported""partially_supported""contradicted""mixed""unverifiable"
stance_breakdownobjectrequiredBreakdown 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
contradictsnumberrequiredNumber of citations that contradict the claim
inconclusivenumberNumber of citations that looked at the claim and could not tell. Distinct from neutral, which is a source that took no side.
irrelevantnumberNumber of citations judged off-topic. Excluded from every verdict denominator.
neutralnumberrequiredNumber 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_supportsnumberrequiredNumber of citations that partially support the claim
supportsnumberrequiredNumber of citations that fully support the claim
unknownnumberNumber of citations with no stance recorded. Never treated as agreement or as neutral: these were not scored, not scored as undecided.
summarystringrequiredHuman-readable summary of the findings
unverified_claimsstring[]Parts of the claim that could not be verified by any source
contentstringText 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
domainstringrequiredDomain that groups these citations
domain_categorystringrequiredCategory of this domain
Values: "government""academic""news""organization""encyclopedia""social""other"
group_idstringrequiredUnique identifier for this domain group
group_stancestringrequiredOverall stance of citations from this domain
Values: "supports""contradicts""mixed""neutral"
primary_citation_idstringrequiredID of the primary (highest-ranked) citation from this domain
generated_promptsstring[]Generated sub-prompts when useMultiplePrompt is enabled
narrative_statusstringno_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 | nullBilling operation identifier on public v1 responses; null when no operation was recorded.
search_metadataobjectMetadata about the search and analysis process
Show search_metadata fields
analysis_modelstringrequiredAI model used for analysis
constraintobjectExplicit constraint accounting: searched vs kept, plus dropped host classes (not publisher names).
processing_time_msnumberrequiredTotal processing time in milliseconds
relevant_sources_foundnumberrequiredNumber 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_searchednumberrequiredTotal number of sources searched
search_resultstringModel-written search summary. It is not evidence. With no_sources it is empty except for the legacy NOT_SEARCHABLE sentinel.
search_result_with_citations_mappingstringThe 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_idstringThread ID for conversation continuity
totalResultsnumberTotal number of citations across all claims
usageobjectBilling usage on public v1 responses.
Show usage fields
creditsnumber | nullrequiredCredits actually deducted; null when a priced operation was not metered. Zero denotes a genuinely free operation.
usagesobjectToken usage of the model calls this request made; credits are reported separately.
Show usages fields
cachedbooleanrequiredTrue when the response was served from the server cache and this request spent no tokens.
input_tokensnumberrequiredInput tokens of the model calls this request made. 0 when the response was served from the server cache.
output_tokensnumberrequiredOutput tokens of the model calls this request made.
total_tokensnumberrequiredTotal tokens of the model calls this request made.
usage_unknownbooleanrequiredTrue 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_scorenumberLegacy aggregate score retained for compatibility
calibrated_confidencenumber | nullclaimstringrequiredThe original prompt/claim that was analyzed
confidencenumberrequiredLegacy aggregation score (0-100); use confidence_available and calibrated_confidence for calibration status
confidence_availablebooleanTrue only when calibrated confidence is available
confidence_basisstringValues: "unknown""heuristic""calibrated"
conflictobject | nullThe quoted, named pair of sources behind a "mixed" verdict. Null for every other verdict.
Show conflict fields
contradictingobjectrequiredShow contradicting fields
citation_idstringrequiredId of the citation taking this side
quotestringrequiredThe text this source actually carries, quoted rather than summarised, so a reader can check the disagreement themselves
sourcestringrequiredThe source, by url where known and by domain otherwise
supportingobjectrequiredShow supporting fields
citation_idstringrequiredId of the citation taking this side
quotestringrequiredThe text this source actually carries, quoted rather than summarised, so a reader can check the disagreement themselves
sourcestringrequiredThe source, by url where known and by domain otherwise
correction_statusstringWhether a source-backed replacement statement is available
Values: "available""not_established""conflicted""not_needed"
correctionsobject[]Corrections when the claim contains inaccuracies
Show corrections fields
actualstringlegacyDeprecated v1 alias of corrected_statement
citation_idsstring[]requiredIDs of citations that support this correction
claimedstringrequiredWhat the user originally claimed
corrected_statementstringrequiredA standalone replacement statement supported by the cited evidence
proofobject[]requiredShow proof fields
citation_idstringrequiredquotestringrequiredExact passage copied from the cited source excerpt
document_breakdownobjectStance counts over every document analysed, before syndicated copies of one telling were collapsed into a single origin.
Show document_breakdown fields
contradictsnumberrequiredNumber of citations that contradict the claim
inconclusivenumberNumber of citations that looked at the claim and could not tell. Distinct from neutral, which is a source that took no side.
irrelevantnumberNumber of citations judged off-topic. Excluded from every verdict denominator.
neutralnumberrequiredNumber 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_supportsnumberrequiredNumber of citations that partially support the claim
supportsnumberrequiredNumber of citations that fully support the claim
unknownnumberNumber of citations with no stance recorded. Never treated as agreement or as neutral: these were not scored, not scored as undecided.
document_countnumberDocuments analysed. Reported for transparency; origin_count is what the verdict counts.
evidence_statusstringReadable 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_evidencebooleanTrue 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[]requiredIDs of citations that support this finding
confidencenumberrequiredLegacy model finding score (0-100); not calibrated truth confidence
confidence_availablebooleanTrue only when calibrated confidence is available
confidence_basisstringValues: "unknown""heuristic""calibrated"
evidence_rolestringWhether cited sources take a position on this claim or provide context only; absent means unassessed.
Values: "claim_evidence""context"
findingstringrequiredA key fact extracted from the citations
origin_countnumberDistinct origins behind those documents. Four outlets running one wire story are four documents and one origin, and only this number votes.
resultstringrequiredOverall verdict based on citation analysis
Values: "supported""partially_supported""contradicted""mixed""unverifiable"
stance_breakdownobjectrequiredBreakdown 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
contradictsnumberrequiredNumber of citations that contradict the claim
inconclusivenumberNumber of citations that looked at the claim and could not tell. Distinct from neutral, which is a source that took no side.
irrelevantnumberNumber of citations judged off-topic. Excluded from every verdict denominator.
neutralnumberrequiredNumber 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_supportsnumberrequiredNumber of citations that partially support the claim
supportsnumberrequiredNumber of citations that fully support the claim
unknownnumberNumber of citations with no stance recorded. Never treated as agreement or as neutral: these were not scored, not scored as undecided.
summarystringrequiredHuman-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