Source Claim Verification

API documentation

One question per call: does this specific source support this specific claim?

What it verifies — and what it does not

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)

  1. Send the request without payment. You receive HTTP 402 with the requirement in the JSON body and the PAYMENT-REQUIRED header (x402 v2, scheme exact, USDC on Base mainnet (eip155:8453)).
  2. Sign an EIP-3009 authorization for exactly 0.048 USDC to the listed payTo, valid for at least 90 seconds.
  3. Repeat the identical request with the same Idempotency-Key and a PAYMENT-SIGNATURE header. The PAYMENT-RESPONSE header 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

SUPPORTEDThe source provides sufficient evidence for the material meaning of the claim.
CONTRADICTEDThe source materially conflicts with the claim.
PARTIALLY_SUPPORTEDThe source supports only part of the claim, or supports it only with material limitations (missing qualifier, attribution, narrower scope).
AMBIGUOUSThe source contains potentially relevant material, but the relationship to the claim is not sufficiently clear.
NOT_FOUND_IN_SOURCEThe 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_UNAVAILABLEThe source could not be retrieved or reliably parsed. No charge is made for this outcome.
UNABLE_TO_VERIFYEvidence 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…"
  }
}

Retrieve a stored result: GET /api/v1/verifications/{request_id} with Authorization: Bearer <Idempotency-Key>.

Source retrieval

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.