---
title: "Verify claims about a model's outputs"
method: POST
path: "/api/v1/verify/{model}"
tags: ["evals"]
---

# Verify claims about a model's outputs

`POST /api/v1/verify/{model}`

## Request

- Base URL: `https://worthune.com`
- URL: `https://worthune.com/api/v1/verify/{model}`
- Auth: one of:
  - none
  - HTTP bearer
  - API key in header `X-Api-Key`

Runs the model on `inputs` and rules on each claim: verified / violated for quantities the model computes, out-of-scope otherwise — never a guess. Same key boundary as running the model.

## Request body

- object
  - `inputs` object, required: Per the model contract.
  - `claims` Claim[], required
    - `path` string, required: Dot/bracket path into the outputs, e.g. "schedule[3].balance".
    - `op` '==' | '<' | '<=' | '>' | '>=': Defaults to "==".
    - `value` union, required: Non-finite numbers use the spec string encoding ("Infinity", "NaN").
      - number
      - string
      - boolean
  - `tolerance` GradeTolerance: Comparison tolerance; defaults to the Concordance harness tolerance (rel 1e-9, abs 0.000001). Never looser than 1e-2 relative.
    - `rel` number: Clamped to [1e-9, 1e-2].
    - `abs` number: Clamped to [0.000001, 1].

## Response `200`

Verdicts with the computed values as proof.

- object
  - `ok` unknown, required
  - `model` string, required
  - `specVersion` string, required
  - `verdict` 'verified' | 'violated' | 'out-of-scope', required: violated if any claim is; else out-of-scope if any is; else verified.
  - `claims` CheckedClaim[], required
    - `path` string, required
    - `op` '==' | '<' | '<=' | '>' | '>=', required
    - `value` union, required
      - number
      - string
      - boolean
    - `verdict` 'verified' | 'violated' | 'out-of-scope', required
    - `computed` unknown
    - `note` string: Present on out-of-scope: why the model cannot rule.
  - `checked` integer, required
  - `verified` integer, required
  - `violated` integer, required
  - `outOfScope` integer, required
  - `sentinels` SentinelNote[], required
    - `field` string, required
    - `value` union, required: Non-finite sentinels are encoded as the string "Infinity".
      - number
      - string
    - `meaning` string, required
    - `triggered` boolean, required
  - `record` DecisionRecord, required: Evidence record v2. Verify with POST /api/v1/records/verify or the SDKs' verifyRecord.
    - `sha256` string, required: SHA-256 (hex) over the canonical JSON of {model, specVersion, inputs, outputs} — keys sorted recursively, no whitespace.
    - `fields` unknown, required
    - `howToVerify` string, required
    - `model` string, required: The hashed model identity — a catalog model name, "household-projection", or "decision-<strategy>".
    - `specVersion` string, required
    - `inputs` object: The exact hashed inputs, present on records whose envelope does not otherwise expose them (household projections, decisions). Point-model run responses echo `inputs` at top level instead; a verify response's record covers the inputs the caller sent in the request.
    - `signature` RecordSignature: Proves Worthune minted the record's hash. Absent when the deployment has no signing key; a stored decision is signed only when its hash is recomputed from the stored inputs.
      - `alg` 'Ed25519', required
      - `keyId` string, required: Matches a key at GET /api/v1/records/keys.
      - `value` string, required: base64url signature.
      - `message` string, required: What was signed: "worthune-record:v1:" + sha256. Rebuild it from the hash when verifying.
  - `tolerance` object, required
    - `rel` number, required
    - `abs` number, required
  - `provenance` string, required
  - `disclaimer` string, required

## Other responses

- `400`: Malformed JSON, a body of the wrong shape, or inputs that fail the model contract (field errors).
- `402`: A paid model (or its spec / dataset / grading) was called without a key, or with an unrecognized or revoked key. Free without a key: emergency-fund, relocation, side-business.
- `404`: Unknown model.
- `413`: More than 50 claims.
- `429`: Hourly per-org stateful quota, a per-route durable limit, or the 120 requests/minute per-IP burst backstop.

---

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