API documentation
One question per call: does this specific source support this specific claim?
What it verifies — and what it does not
- It checks the relationship between one claim and one source you name. It does not search the web for other sources.
- It does not decide whether a claim is true in the world. NOT_FOUND_IN_SOURCE is not evidence that a claim is false.
- It does not provide legal, medical or financial advice.
- Compound claims are split into components; support for only some of them yields PARTIALLY_SUPPORTED.
Request
POST https://sourceclaimverification.online/api/v1/verify
Content-Type: application/json
Idempotency-Key: <random, 16-128 chars of A-Z a-z 0-9 _ -> (required; also your result access token)
PAYMENT-SIGNATURE: <x402 payload> (second call, after the 402)
{
"claim": "The company reported revenue of $3.2 billion in 2025.", // required, ≤ 1000 chars
"source_url": "https://example.com/report", // or source_text (exactly one)
"source_text": "…", // ≤ 100000 chars; reported as provided_by_requester
"source_label": "Annual report PDF, p. 12", // optional, with source_text
"output_language": "ja", // optional BCP-47; default: the claim's language, else en
"source_language": "de", // optional hint when the page does not declare it
"strictness": "standard", // or "strict": SUPPORTED only on direct/secondary statements
"max_source_age_seconds": 600 // cached copy allowed up to this age; 0 forces a fresh fetch
}Payment (x402)
- Send the request without payment. You receive HTTP 402 with the requirement in the JSON body and the
PAYMENT-REQUIREDheader (x402 v2, schemeexact, USDC on Base mainnet (eip155:8453)). - Sign an EIP-3009 authorization for exactly 0.048 USDC to the listed
payTo, valid for at least 90 seconds. - Repeat the identical request with the same Idempotency-Key and a
PAYMENT-SIGNATUREheader. ThePAYMENT-RESPONSEheader returns the settlement.
One price per verification, quoted before any work and bound into the x402 payment requirement. You are charged only when the source was retrieved and a verdict was produced: SOURCE_UNAVAILABLE and model/provider failures are not charged (the payment authorization is not settled). Requests rejected by validation are never charged. Retrying with the same Idempotency-Key never charges twice.
The verdict is released only after the payment settles. If retrieval fails, the result is SOURCE_UNAVAILABLE and the authorization is not settled. If the model provider fails, you get HTTP 503 with retryable: true: resend the same request with the same key and payment while the authorization is valid. One payment authorization can buy only one request; reusing it for a different request returns HTTP 409.
Free validation: POST /api/v1/quote with the same body checks the schema, URL safety and DNS, and returns the price — without payment, retrieval or model use.
Verdicts
SUPPORTED | The source provides sufficient evidence for the material meaning of the claim. |
CONTRADICTED | The source materially conflicts with the claim. |
PARTIALLY_SUPPORTED | The source supports only part of the claim, or supports it only with material limitations (missing qualifier, attribution, narrower scope). |
AMBIGUOUS | The source contains potentially relevant material, but the relationship to the claim is not sufficiently clear. |
NOT_FOUND_IN_SOURCE | The source was retrieved and examined, but material supporting or contradicting the claim was not found. This is NOT evidence that the claim is false. |
SOURCE_UNAVAILABLE | The source could not be retrieved or reliably parsed. No charge is made for this outcome. |
UNABLE_TO_VERIFY | Evidence was examined but no defensible determination could be made. |
Confidence (HIGH / MEDIUM / LOW) describes how clearly the source settles the relationship — evidence quality, how much of the source was examined, and whether deterministic checks intervened. It is not a probability that the claim is true.
Response
{
"object": "claim_verification",
"verification_id": "5d0c…",
"verdict": "PARTIALLY_SUPPORTED",
"verdict_label": "Partially supported",
"confidence": "MEDIUM",
"scope": "claim_to_source_relationship",
"claim": {
"text": "Company X cut prices by 20% in January 2026.",
"language": "en"
},
"source": {
"url": "https://example.com/news",
"final_url": "https://example.com/news",
"title": "Company X trims prices",
"published_at": "2026-03-04T08:00:00.000Z",
"retrieved_at": "2026-09-30T12:00:00.000Z",
"language": "en",
"content_sha256": "9f2c…",
"cache": {
"used": false,
"original_retrieved_at": null
},
"examination": {
"passages_total": 42,
"passages_examined": 42,
"complete": true,
"method": "full_text"
},
"provided_by_requester": false
},
"evidence": [
{
"passage": "Company X cut selected product prices by up to 20% in March 2026.",
"language": "en",
"location": {
"passage_id": "p3",
"block_index": 2,
"heading": "Pricing",
"char_start": 311
},
"relation": "PARTIALLY_SUPPORTS",
"assertion_type": "DIRECT_SOURCE_STATEMENT",
"attributed_to": null,
"translation": null
}
],
"analysis": {
"subject_match": true,
"action_or_fact_match": true,
"quantity_match": false,
"time_match": false,
"qualifiers_preserved": false,
"missing_qualifiers": [
"selected products only",
"up to 20%"
],
"mismatches": [
{
"component": "time",
"claim": "January 2026",
"source": "March 2026"
}
]
},
"explanation": "The source reports cuts of up to 20% on selected products in March, not January.",
"guards": [],
"limitations": [],
"payment": {
"amount": "0.048",
"currency": "USDC",
"charged": true,
"transaction": "0x…"
}
}evidence[].passageis a short verbatim excerpt in the source's original language (verified character-for-character against the retrieved text).translation, when present, is derived and never replaces the original.assertion_type: DIRECT_SOURCE_STATEMENT, ATTRIBUTED_STATEMENT (someone is reported as saying it), SECONDARY_REPORTING (reported as fact based on another source), INFERENCE. A claim supported only by an attributed statement is PARTIALLY_SUPPORTED unless the claim itself is attributed.guardslists deterministic checks that changed or qualified the model's answer, e.g.claim_quantity_conflicts_with_evidence,polarity_conflict,attributed_evidence_only,evidence_quantity_is_qualified.source.content_sha256fingerprints the normalized text that was examined;source.cachediscloses when a cached copy was used and when it was originally retrieved.- Language fields hold ISO codes,
UNKNOWN(not reliably identifiable) orMULTILINGUAL.
Retrieve a stored result: GET /api/v1/verifications/{request_id} with Authorization: Bearer <Idempotency-Key>.
Source retrieval
- Public HTML, plain text and JSON over http/https (ports 80/443). Up to 5 redirects, 3 MB, 12 s.
- Static retrieval only in this version: pages that render their content with JavaScript, PDFs and office documents return SOURCE_UNAVAILABLE — send their text as
source_text. - No bypass of logins, paywalls, CAPTCHAs, bot challenges or rate limits (HTTP 401/402/403/429 → SOURCE_UNAVAILABLE, not charged).
- Loopback, private, link-local, carrier-grade NAT and cloud metadata addresses are refused, for the first request, every redirect, and every DNS answer.
- Page content is untrusted data: instructions written inside a page are ignored.
- Large pages are reduced to the passages most relevant to the claim (≈3500 tokens; ≈6000 when claim and source languages differ).
source.examinationreports how much was examined.
Errors
Errors are JSON: { error: { code, message } }. 400 validation / unsafe URL, 402 payment required or rejected, 409 key or payment reuse, 413 too large, 415 wrong content type, 429 rate limited (per client, per minute), 503 not configured / provider failure / settlement reconciliation. None of the 4xx responses are charged.
Languages
Claims and sources may be in any language and need not match (for example an English claim against a Japanese source). Explanations follow output_language; quoted evidence stays in the original. The website is in English; the service is not English-only.