VDA Witness VDA
← Verified Digital Agents

AI compliance, sorted.

Every decision your AI agents make becomes tamper-evident, independently verifiable evidence — the audit trail the EU AI Act (Article 12) requires. And because it's anchored outside our systems, the record is provable even against us.

Part of the Verified Digital Agents (VDA) platform.

Audit-ready Verify offline — open-source SDK EU AI Act Article 12 Agent admission credentials Customer-controlled signing Integrity holds even against VDA
Get your API key → Read the docs
📋

Pass the audit

A complete, tamper-evident record of what every agent did and the rule it acted under — hand it straight to an auditor.

🔎

Trust no one — verify

Anyone can check the evidence themselves — offline, with our open-source SDK, no private key, and without trusting VDA.

🛡️

Proof against the vendor

The trail is anchored to independent authorities we don't control, so even VDA can't quietly rewrite history.

Two tiers, labelled honestly

Sealed tier (free, self-serve). Every record is Ed25519-signed + hash-chained (tamper-evident) and independently verifiable offline — but it is not externally anchored. It stays sealed: that is the terminal state on this tier, not "anchoring soon." So "provable even against us" does not apply here.
Anchored tier (recommended). Sealed and externally committed to authorities we don't control — Rekor + at least one RFC-3161 TSA, quorum met — the only tier where even VDA can't quietly rewrite history. VDA holds the signing key, but the strength comes from the anchoring, not from us holding the key.
Higher-assurance: customer-controlled signing (available now). You hold the signing key; VDA never sees it — prepare → sign locally → submit, and check_valid confirms your key against your published did:web (issuer_verified). For threat models where the vendor must never hold the key at all — and the way a credential authority proves a credential was signed by it, not us.
You're sealed — anchor it, and even we can't rewrite it. The free Sealed tier is clearly marked and is not anchored; anchoring is what makes a trail provable against VDA itself. Anchoring is concierge-provisioned (contact us) — not self-serve today. Witness produces the evidence; a Compliance Officer's attestation is what turns it into a signed regulatory artefact.

Pricing

Tier Price Seals / month Access
SealedFree5,000Self-serve, instant, no human
Anchoredfrom €50 / month5,000 includedContact us to enable (concierge today)
EnterpriseTalk to usVolume-negotiatedContact us
Sealed — signed + hash-chained + independently verifiable offline, but not externally anchored (terminal; not covered by "provable even against us"). Anchored — everything in Sealed + externally anchored (Rekor + DigiCert + Sectigo, quorum) — the only tier that is provable even against VDA. Enterprise — volume, SLA, and the higher-assurance customer-held-key tier.
Upgrading preserves everything. A tier flip keeps the same account id and the same chains — everything you sealed while evaluating stays yours and stays verifiable, and from the day you're anchored, it's anchored too.
⚠️ Billing isn't live yet — anchoring is enabled manually today. The 5,000/month Sealed allowance is measured and surfaced on every seal, but never enforced (over the limit it warns; an evidence trail is never blocked). Talk to us and we'll turn anchoring on.
For your tech team

The security architecture, in full — every claim above, made concrete.

🔐 Cryptographic core

Each decision is Ed25519-signed and hash-chained to the ones before it. Altering any field, or deleting/reordering any record, breaks verification.

Verification runs on standard crypto with no VDA dependency — a third party reproduces the signed bytes and checks the chain themselves.

🪪 Key identity & rotation

Signing keys are versioned verification methods under a published W3C DIDdid:web:witness.getvda.ai. Keys rotate and revoke transparently (an append-only rotation log).

Each record binds the DID + key version, so historical records verify against the key that was valid at signing time — rotations don't break old evidence.

⚓ External anchoring

On a fixed cadence (at least hourly), the chain head is anchored to two independent RFC-3161 timestamping authorities — DigiCert and Sectigo — and recorded in the public, append-only Sigstore Rekor transparency log (operated by the Linux Foundation).

Availability quorum: a window is validly anchored on Rekor + at least one TSA. Both TSAs are attempted and all attestations stored, so one authority being down never leaves a gap.

⏱️ The un-anchored window

Between anchors, a just-sealed record is already tamper-evident by signature + hash-chain, and is covered by the next anchor. The honest claim is "anchored within the cadence"; verification reports each record as anchored or pending — never an unstated asterisk.

🎯 Who would have to be compromised for VDA to rewrite history undetected?

Not us alone. VDA holds the key, so we can re-sign a fully valid alternate chain — but that changes the chain head, and the original head is pinned outside our systems. To rewrite a past record undetected, an attacker would have to compromise the public Sigstore/Rekor transparency log (and slip past its independent monitors) and get an independent commercial RFC-3161 timestamping authority to attest the forged head at the original time — simultaneously, none of it under VDA's control. The trail is anchored to Rekor plus DigiCert and Sectigo; a valid anchor requires Rekor + at least one TSA, so forgery means subverting Rekor and a TSA together. (A maximum-assurance option — anchoring to the Bitcoin blockchain via OpenTimestamps — is on the roadmap.)

✅ Verify it yourself — really (shipped v1.0.0)

Our open-source SDK verifies a record offline, with zero calls to VDA: npm i vda-witness or pip install "vda-witness[verify]". It checks the Ed25519 signature, the hash-chain, the DID key that was valid at signing time, and the anchor — the Rekor signed entry timestamp against Rekor's pinned key and the RFC-3161 token against a pinned TSA root (DigiCert today) — either fully air-gapped from a bundled proof or by re-fetching the Rekor inclusion from rekor.sigstore.dev directly. Never a Witness endpoint.

The verdict is one of three, so it can't over- or under-claim: ANCHORED_VALID, SIGNED_PENDING (signed, honestly not-yet-anchored), or BROKEN (with the reason). Identical result in JS and Python. MCP clients get 16 tools at /api/witness/mcp: the shaped seals (seal_hitl_decision, seal_agent_action, seal_attestation), admission credentials (issue_admission_credential, check_valid, revoke_admission_credential), whoami (cross-service key resolution), plus seal, verify, report, list_records, get_record, get_test_key, and the renew_* pair. Customer-controlled signing is a REST flow — prepare → sign → submit.

🧩 Per-tenant identity & isolation

Each account is an opaque, server-minted ID (a ULID) that is part of the signed record — not just a database column. A seal is bound to the account behind your API credential; there is nowhere in the request to name a different account, so cross-tenant forgery is structurally impossible, not merely rejected.

Reads are filtered to your authorized accounts at the data layer and re-checked against each record's signed account, so a tampered routing column still can't leak another tenant's records. Display names are mutable and DB-only; they never enter a signed record.

🔄 Self-sovereign agent identity

An agent binds an Ed25519 controller key it holds to a durable account. When its API key expires, it renews itself — challenge, sign (vda.witness.renew/1|<accountId>|<nonce>), fresh key — into the same account and the same chain, with no human and no standing long-lived secret. A leaked key dies within 24h; the account and its evidence chain never do.

📖 Read your own trail

list_records returns your chains and record summaries; get_record returns the full signed body — your agent's own reasoning, inputs, and actionProposed — everything needed to verify offline. Account-scoped and structurally isolated: there is nowhere to name another account.

🧭 Shaped evidence — reconstructable by design

Witness is opinionated about evidentiary completeness: instead of one generic seal, it publishes shaped skills that require what an auditor actually needs. seal_hitl_decision demands the cited policy and the system-of-record artifacts the human saw; seal_agent_action separates external evidence (content-addressed, hashed) from computed parameters; seal_attestation records a fact as-of a time. A human decision sealed with no evidence and no stated reason is rejected — the gap can't be sealed silently. This guidance lives in the agent card + tool schemas, so every caller sees the correct pattern by default.

🎫 Agent admission credentials

An admission credential is a sealed Witness record — not a separate document. Environment operators hold only the credential id and ask Witness check_valid, getting one canonical answer (valid / revoked / expired / not_found), so every enforcer is identically correct and the meaning of "valid" evolves in one place. Revocation is a new superseding record; validity is computed, never mutated. A credential can honestly record a provisional state (e.g. a sandbox that hasn't passed), not only a passing one — honesty over a schema that would force a lie.

✍️ Customer-controlled signing

For issuer-authenticity that is provable even against Witness, seal with your own key — Witness never holds it. prepare (Witness assembles the shaped body, so enforcement still holds) → sign locally → submit. Then check_valid resolves the issuer's did:web and confirms the signing key is published there, returning issuer_verified. Records still hash-chain and anchor, so you get both issuer-authenticity and tamper-evidence. This is how a credential authority proves a credential was signed by it, not merely by us.

📚 EU AI Act Article 12

The sealed trail is the record-keeping Article 12 requires. Witness generates an Article 12 Evidence Report mapping each decision to its governing rule, each line traceable to a signed, anchored record. The report is scopeable by chainKey (and date range), so an account with many chains gets a clean per-chain report. It is evidence, not a compliance certificate — attestation stays a human act.

Your AI can find and use Witness on its own. A signed A2A agent card at /.well-known/agent-card.json lets AI agents and orchestrators discover — and use — all of it on their own: the shaped seals (seal_hitl_decision/seal_agent_action/seal_attestation), admission credentials (issue_admission_credential/check_valid/revoke_admission_credential), reading their own trail, self-provisioning + no-human key renewal, and customer-controlled signing (prepare/sign/submit). Sibling suite services resolve a presented key via whoami (the sanctioned cross-service auth path). 16 MCP tools at /api/witness/mcp.

Get started — three ways

Write code, connect it to your AI with no code, or just ask your assistant.

Get your API key — free Sealed tier, instant

No human in the loop. To seal you need a key; verify is public, so you can succeed in 30 seconds with no key at all.

SEALED · signed + offline-verifiable · NOT externally anchored (terminal on this tier)

Bind a controller key (an Ed25519 public JWK your agent holds) and the account becomes durable — no auto-expiry — and self-renewable forever with no human. It's still Sealed (not anchored) — durability is the account surviving, not anchoring.

You're sealed — anchor it, and even we can't rewrite it. Want the Anchored tier (externally committed, provable even against us)? It's concierge-provisioned — Talk to us →

1

SDK

for developers
npm install vda-witness
pip install "vda-witness[verify]"
await witness.seal(decision, rule);
// verify offline — no VDA dependency:
import { offlineVerify } from "vda-witness/verify";
const v = await offlineVerify(bundle);
// v.state === "ANCHORED_VALID"

v1.0.0 live on npm & PyPI. Grab a Sealed-tier key above, then seal, read your own trail, and renew unattended. Sealing is fail-open; verifying is offline.

2

MCP server

for MCP-capable AI clients
zero code
https://witness.getvda.ai/api/witness/mcp

Add as a connector — 16 tools natively: an agent can self-provision a durable account, seal with the shaped skills, issue & check admission credentials, resolve its own key (whoami), read its own trail, renew unattended, verify & report — no human. Claude / Cursor / VS Code configs →

3

AI-assisted

for vibe coders
Add VDA Witness to my agent so every
decision is sealed to a tamper-evident
audit trail. Install vda-witness and wrap
my decision calls.
Docs: witness.getvda.ai/llms.txt

Govern the whole agent, not just the audit trail

Witness is the evidence layer of Verified Digital Agents — rules, enforcement, and audit-ready EU AI Act & GDPR evidence for your agents.