---
title: "Verify a single claim."
method: POST
path: "/v1/verify"
---

# Verify a single claim.

`POST /v1/verify`

## Request

- Base URL: `https://api.verify-api.dev`
- URL: `https://api.verify-api.dev/v1/verify`
- Auth: HTTP bearer

The pipeline: normalize → cache → search → extract → adjudicate → verbatim-check → persist + bill. Completed results return 200. An expired response wait returns 202 pending, never a fabricated verdict or zero-charge receipt. A database or worker interruption can leave a key unresolved and requires operator reconciliation; do not submit a new key.

## Headers

- `Idempotency-Key` string

## Request body

- VerifyRequest
  - `claim` string, required: A single factual claim to verify. If you have multiple claims, either send each separately or POST /v1/verify/batch.
  - `as_of` string, date: Optional ISO date. Set for time-sensitive claims. Buckets into perennial / annual / volatile based on claim shape.
  - `max_wait_ms` integer: HTTP wait budget, not cancellation. If completion is not confirmed, returns HTTP 202 pending without a verdict, receipt or final charge amount. Poll the account-scoped status URL. Provider work may continue.
  - `domains_allow` string[]: Optional allowlist of source hostnames.
  - `domains_deny` string[]: Optional denylist of source hostnames.
  - `freshness` 'cached' | 'fresh': Freshness tier. `cached` (default) honors both cache tiers. `fresh` bypasses both caches, forces a full pipeline run, and is billed at the fresh-tier multiplier (default 5x). See GET /v1/pricing for current multipliers.
  - `max_age_seconds` integer: HTTP Cache-Control-style max-age for the verdict. Under FRESH_THRESHOLD_SEC (default 3600) triggers the fresh tier; under RECENT_THRESHOLD_SEC (default 86400) triggers the recent tier (default 2x); otherwise treated as cached.

## Response `200`

Verdict.

- Verdict
  - `id` string, required: Verdict ULID, prefixed vrf_.
  - `verdict` 'supported' | 'refuted' | 'insufficient_evidence' | 'out_of_scope' | 'malformed', required
  - `confidence` number, required: 0-1. Below CONFIDENCE_FLOOR (default 0.75) is downgraded to insufficient_evidence.
  - `source_url` string, uri, nullable: URL of the source that yielded the verdict.
  - `published_date` string, date, nullable
  - `exact_quote` string, nullable: Verbatim passage from the source. Guaranteed to appear character-for-character in the extracted source text.
  - `reasoning` string, nullable: 1-2 sentence explanation of the verdict.
  - `cache` 'miss' | 'exact' | 'semantic', required: Which cache tier served this verdict, if any. Semantic hits are cosine ≥ 0.92 within the same as_of bucket.
  - `billed_usd` number, required: Amount billed for this call, in dollars. 0 for insufficient_evidence / out_of_scope / malformed. May exceed base price at recent/fresh tiers.
  - `as_of_bucket` string, required: The temporal bucket the claim was assigned to.
  - `freshness_tier` 'default' | 'recent' | 'fresh': Which freshness tier the pipeline actually ran at. May differ from the requested tier when the resolver downgrades (e.g. cache hit within max_age_seconds).
  - `price_multiplier` number: Multiplier applied to the base price for this verdict. 1 for default tier, 2 for recent, 5 for fresh (see /v1/pricing).
  - `verdict_age_seconds` integer, nullable: Age of the verdict in seconds when it was returned. 0 for miss (fresh compute). Non-zero for cache hits.
  - `receipt` object: Signed receipt (compact JWS, EdDSA/Ed25519). Verify against /.well-known/jwks.json to prove authenticity without trusting the network path.
    - `jws` string: Compact JWS: `header.payload.signature`.
    - `kid` string: Key id — look up in /.well-known/jwks.json.
    - `issued_at` string, date-time

## Other responses

- `202`: Pending or uncertain outcome. No final verdict or charge is asserted. Poll the status_url with the same account.
- `401`: Missing or invalid API key.
- `402`: Account balance is insufficient. Top up using the advertised prepaid-account routes. x402 settlement is disabled; do not submit on-chain payment.
- `409`: Idempotency key conflicts with an existing operation.
- `410`: Saved result was removed by retention. The key remains reserved; no new work or charge. Do not automatically switch keys.
- `429`: Too many requests.

---

[API](https://skmtc.dev/verify-api/apis/verifyapi.md) · [All operations](https://skmtc.dev/verify-api/apis/verifyapi/llms.txt) · [OpenAPI document](https://skmtc.dev/verify-api/apis/verifyapi/revisions/e901ce13ce0e?raw)
