---
title: "Verify up to 20 claims in one call."
method: POST
path: "/v1/verify/batch"
---

# Verify up to 20 claims in one call.

`POST /v1/verify/batch`

## Request

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

Runs each claim through the pipeline concurrently (bounded). Use one persisted Idempotency-Key for the whole batch. A response-wait expiry returns 202 for the operation, not free per-item verdicts. Each completed item has its own verdict and receipt. If an item fails with an uncertain outcome, it has no receipt, billed_usd is null, and the batch requires operator reconciliation; do not resubmit under another key.

## Headers

- `Idempotency-Key` string

## Request body

- object
  - `claims` VerifyRequest[], required
    - `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.
  - `max_wait_ms` integer: Response wait for the entire batch, not cancellation. Per-item max_wait_ms does not cancel work or determine the batch HTTP wait.

## Response `200`

Durably recorded batch response in input order. Inspect outcome; an uncertain item is not a completed verdict and the final total is unknown.

- object
  - `verdicts` union[], required
    - union
      - 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
      - object
        - `status` 'outcome_unknown', required
        - `billed_usd` unknown, required
        - `detail` string, required
  - `billed_usd` number, nullable, required: Null if any item has an uncertain billing outcome.
  - `confirmed_billed_usd` number, required: Sum of confirmed item charges only, not an upper bound on uncertain charges.
  - `outcome` 'completed' | 'requires_reconciliation', required

## Other responses

- `202`: Batch response not yet durably recorded. Poll the account-scoped status_url. No final verdict or charge amount is asserted.
- `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 batch result was removed by retention. The key remains reserved; do not automatically submit another key.
- `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)
