Skip to content
Verification & evidenceEvidence packets

Verification & evidence

On this page
POST/api/v1/evidence/verifyGET/api/v1/evidence/keys

Evidence packets

Extraction responses with metadata report metadata.evidenceStatus. When it is signed, metadata.evidence is an Ed25519 signature over the complete public response except the seal itself. That includes the acceptance decision, provenance, trace, credits and grounding evidence. Hand the whole response to another agent, an auditor or a customer; they can check it without trusting you, and without an API key.

Downloaded snapshot-verification results use a workspace v1 envelope and the same v2 signature, including when verification refuses an answer. Submit the complete downloaded result unchanged; it has no quality score to add. Its provided_snapshot metadata means the URL is a reference, not authenticated acquisition. Requesting ?refetch=true preserves the signature verdict and reports comparison unavailable without fetching that URL.

What a receipt proves

This response was issued by Contrie and not altered — the v2 signature covers the complete public response except the seal, so changing or removing a public field breaks it. Obtain or pin the issuer key independently. Current packets omit the internal source basis, so automatic source-hash comparison is unavailable even when ?refetch=true is requested. Older packets with supported source-basis metadata may still support a separate content comparison.

It does not prove that a value belongs to the requested field or entity, or that the upstream page is factually correct. Grounding shows whether checkable value text appears in the source; supporting excerpts make that limited check inspectable. The complete source corpus is not included in the response.

Check the acquisition time before reusing a result. It shows when the source was retrieved, not when its publisher last updated it. A known partial source is disclosed in the result; an absent warning does not guarantee that every item on a page was captured. Requested-field coverage and populated values are separate checks.

Read metadata.source.mode before trusting the URL. fetched means Contrie retrieved the page itself. provided_html (from /api/v1/extract) means the caller supplied the HTML and Contrie did not fetch it: the URL is whatever the caller named, and a valid signature proves Contrie answered over that HTML, not that the page at that URL contained it. recording marks a keyless recorded example. Both verifiers repeat the signed mode as source beside a valid verdict.

What is signed

FieldTypeDescription
response.* except metadata.evidencecomplete JSON responsev2 binds every public answer, decision, source, trace, credit and final evidence field. The seal is excluded to avoid signing itself.
version · issuer · signedAtpacket envelopeThe current packet version is 2 and the issuer is contrie.com.

Verify a response

POST /api/v1/evidence/verify — free, no key, separate request limit
curl -X POST "https://www.contrie.com/api/v1/evidence/verify" \
  -H "Content-Type: application/json" \
  -d @response.json

From a streamed (NDJSON) response, verify the final result line after removing its event and status members: they are stream framing, not part of the signed response.

Verdict

Check the HTTP status before reading the verdict. Malformed requests, rate limits and unavailable admission return 400, 429 or 503 with an error and no signature verdict. Hosted verification permits 30 requests per minute per platform-observed address, using a shared bucket when unavailable. Offline verification needs no hosted request.

200 OK
{
  "valid": true,
  "keyId": "ca1313e0de8b24f3",
  "signedAt": "2026-09-07T06:33:40.485Z"
}

Verify offline

Download /evidence-verifier.mjs and obtain then pin the trusted key set separately from GET /api/v1/evidence/keys. The shipped Node 20 verifier reconstructs the v2 packet from the complete response, checks the key id, packet hash, Ed25519 signature and response integrity. Full source text is not embedded; source-hash or offset reproduction requires the matching source basis separately.

node evidence-verifier.mjs response.json trusted-keys.json

A valid signature proves issuer-key possession and response integrity. Key retrieval must be trusted or pinned independently; signature validity does not establish attribution, freshness or factual truth.

GET /api/v1/evidence/keys serves only the current signing key; retired keys are not archived there. If the key is rotated, a receipt signed with the old key can be checked only against a copy you pinned earlier, so pin the key set alongside any receipts you store.