---
title: "Verify a signed attestation (public)"
method: POST
path: "/api/v1/attestations/verify"
tags: ["Governance"]
---

# Verify a signed attestation (public)

`POST /api/v1/attestations/verify`

## Request

- Base URL: `https://legal.nexusquantum.legal`
- URL: `https://legal.nexusquantum.legal/api/v1/attestations/verify`
- Auth: none required

Verifies an attestation against the public JWKS. **PUBLIC — no authentication required — rate-limited by IP.** The public key is looked up server-side by `attestation.signer_key_id` (the embedded key is never trusted); an unknown key yields `signature_valid: false`.

Steps: (1) EdDSA signature check over the canonical JSON of the attestation (excluding `signature`); (2) `content_match` = SHA256(normalize(content)) === attestation.content_hash; (3) best-effort stateless citation re-verification of the submitted content (`citation_recheck.skipped: true` when the jurisdiction has no active corpus).

Property: the signature validates **offline** with the public JWKS — no shared secret with Nexus. HMAC is used only for webhooks.

## Request body

- object
  - `attestation` Attestation, required: Signed, offline-verifiable attestation of an output. The EdDSA (Ed25519) signature is verified against the public JWKS (`GET /api/v1/attestations/keys`) with no shared secret. Zero-Retention: `citation_summary` carries counts only (no canonical citation text); `content_hash` binds the exact text the verifier re-submits.
    - `attestation_version` string, required
    - `issued_at` string, date-time, required
    - `signer_key_id` string, required: kid of the signing key (matches a key in the JWKS).
    - `output_id` string, uuid
    - `job_id` string, uuid, nullable
    - `request_id` string, nullable
    - `jurisdiction` string, required
    - `routing` object: Effective routing for the attested run.
      - `mode` 'byo' | 'platform'
      - `provider_id` string, nullable
    - `integrity_hash` string, required: analysis_outputs.integrity_hash = SHA256(analysis_text + job_id + created_at).
    - `content_hash` string, required: SHA256(normalize(analysis_text)); normalize = NFC + trim. Binds the content the verifier re-submits.
    - `model_chain` string[]
    - `verify_engine_version` string, required
    - `citation_summary` object: Counts only (ZR): { counts, anyBroken, total }.
    - `signature` string, required: base64url EdDSA signature over the canonical JSON of the attestation with `signature` excluded.
  - `content` string, required: The exact analysis text the attestation was issued over (its hash is compared to `content_hash`).

## Response `200`

Verification result.

- AttestationVerifyResult: Result of `POST /api/v1/attestations/verify`. The signature is validated offline against the server-side public key looked up by `signer_key_id` (the embedded key is never trusted).
  - `signature_valid` boolean, required: true if the EdDSA signature validates against the public key for `signer_key_id`. An unknown `signer_key_id` yields false.
  - `content_match` boolean, required: true if SHA256(normalize(content)) === attestation.content_hash.
  - `citation_recheck` object: Best-effort stateless citation re-verification of the submitted content.
    - `counts` object
    - `anyBroken` boolean
    - `total` integer
    - `skipped` boolean: true when the jurisdiction has no active corpus (recheck not run).
  - `verify_engine_version` string
  - `signer_key_id` string

## Other responses

- `400`: VALIDATION_ERROR — malformed attestation or missing content; `content_too_large` — `content` exceeds 200KB; `too_many_citations` — more than 200 citations submitted.
- `429`: RATE_LIMITED — per-IP rate limit exceeded.

---

[API](https://skmtc.dev/nexusquantum/apis/nexus-legal-api.md) · [All operations](https://skmtc.dev/nexusquantum/apis/nexus-legal-api/llms.txt) · [OpenAPI document](https://skmtc.dev/nexusquantum/apis/nexus-legal-api/revisions/4084d8d4eb0b?raw)
