Public Evidence Verification
Public Evidence Verification is part of the core audit layer and is available on every plan. This page is readable without signing in so external verifiers can land on it.
What this is
Every Behavry audit event is hash-chained (see Decision Trace). That means any party who holds an event hash can prove two things without needing to read the event contents:
- Existence — the event hash is in the Behavry audit log for some tenant, at some timestamp
- Integrity — the chain from that event back to an earlier anchor is intact (no tampering)
Public Evidence Verification (PEV) exposes this as a rate-limited, unauthenticated HTTP endpoint. Auditors, regulators, customers, and downstream verifiers can confirm an event without needing credentials for the tenant that generated it.
The endpoint
GET /api/v1/public/verify?hash={event_hash}
- No authentication required
- Rate-limited (per-IP, 60 requests per minute by default)
- Returns no event content — only existence + integrity
Response
{
"found": true,
"tenant_public_id": "acme",
"timestamp": "2026-04-08T14:23:11Z",
"chain_intact": true,
"anchor_hash": "a3f2...",
"anchor_timestamp": "2026-04-08T14:00:00Z"
}
found— whether the hash exists in the log at alltenant_public_id— the tenant's public-facing slug (not the internal UUID)timestamp— when the event was writtenchain_intact— whether the hash chain from the event back to the nearest anchor is uninterruptedanchor_hash/anchor_timestamp— the nearest periodic chain anchor, so a verifier can compute an independent hash and cross-check
Not found
{ "found": false }
Returned when the hash isn't in the log. Rate-limited the same as found responses to prevent enumeration attacks.
What this does not expose
PEV returns zero event content. No payload, no DLP findings, no identities, no policy reasons, no targets. A third party can prove an event exists; they cannot read what it was about.
This is the right default for a public endpoint. Tenants that want to expose event content to specific verifiers do it through the authenticated API under admin approval.
Periodic anchors
To make independent verification practical, Behavry writes a chain anchor every hour:
- An anchor is a pair
{timestamp, hash}wherehashis the current head of the audit chain - Anchors are published to a tenant-configurable anchor endpoint (by default, none — tenants opt in)
- Public verifiers compare
anchor_hashfrom a PEV response against an independently-received anchor to confirm the chain hasn't been rewritten after the fact
Use cases
- Auditors verifying that a specific compliance event exists
- Customers confirming that their vendor actually produced a Decision Trace they were told about
- Regulators asking for cryptographic proof of record-keeping without network access to the tenant
- Incident responders confirming a specific action happened and wasn't spoofed
Rate limiting and abuse
- Per-IP rate limit (configurable, default 60/min)
- Per-tenant rate limit across all IPs (prevents a single tenant's logs from being probed into DoS)
- No batch endpoint; each request checks one hash
- Enumeration is infeasible: the hash space is 2^256
Related
- Decision Trace — where the hash comes from
- Audit Integrity — the chain mechanism
- SIEM Connectors — forward hashes into your SIEM so you can cross-verify