← Back to Signals
Schema Reference
Public Edition

EVIDE Minimum Intake JSON

Evidentiary Intake Structure and Interoperability Model
Schema v2.1 · Public Specification v2.2 · November 2026
This public edition describes the EVIDE evidentiary intake structure and interoperability model. Operational access details are available to certified API partners only.
What EVIDE Is

EVIDE (External Evidentiary Deposit) is a structured evidentiary intake layer designed to anchor AI-assisted or human decisions to an independent, cryptographically verifiable record. Each intake transforms a closed decision into a portable evidentiary object that can be validated outside the originating system, without requiring operational access to the source system, its logs, or its infrastructure.

"EVIDE does not standardise how a decision is made.
It standardises the minimum evidentiary object that can survive outside the source system."

EVIDE does not:

  • verify whether the declared authority was legitimate
  • validate the correctness of the decision
  • introduce admissibility logic
  • replace governance frameworks
  • operate inside the decision pipeline
Boundary Semantics

EVIDE operates at a specific and bounded layer. Understanding what it does and does not do prevents misuse and misinterpretation.

  • EVIDE records closure state, not runtime execution
  • EVIDE anchors the externally visible responsibility state at the moment a decision becomes final
  • EVIDE preserves admissibility visibility without enforcing admissibility
  • EVIDE is evidentiary, not supervisory
  • EVIDE does not replay decisions — it anchors closure objects
  • EVIDE does not verify declared oversight — it makes the declaration persistent, portable, and independently verifiable

Behavioral completion vs. Responsibility closure

A finalized decision without a bound authority represents behavioral completion only — the system produced an outcome, but no accountable actor is formally attached to it.

A finalized decision with a bound authority and declared human oversight represents responsibility closure — the outcome is not only produced, but explicitly attributable.

The Layer 2 → Layer 3 boundary requires responsibility closure, not behavioral completion.

Identity-Bound Access Model

EVIDE access provisioning requires DAPI identity verification. This requirement exists because EVIDE operates as an evidentiary responsibility layer. The intake infrastructure must be able to attribute API activity to a verifiable identity source, even when deposited payloads contain declared or non-verified authority states.

DAPI therefore functions as the identity-bound access layer of the EVIDE intake infrastructure, separating:

  • infrastructure access attribution
  • payload-declared authority
  • evidentiary responsibility visibility

Account binding at intake. On the API intake, authority.dapi_number is required and must match the DAPI identity bound to the API key. Missing value: 422 missing_field; non-matching value: 403 dapi_mismatch; key not bound to a user identity: 403 missing_user_binding. The check binds the deposit to the authenticated account; it does not verify the declared authority, role or powers.

Access provisioning details are confidential and available to certified API partners only. Contact info@certifywebcontent.com to request access.

Section 1
1. Schema Structure

The EVIDE intake payload is a JSON object submitted via POST. Its decoded form is canonicalized and hashed deterministically at intake (Section 4). The current schema version is "2.1", the only value accepted by the API today. Earlier values ("1.8", "1.9", "2.0") are historical — see Section 5 for their evolution — and are no longer accepted.

Required fields
  • evide_schema — must be "2.1". Earlier values ("1.8", "1.9", "2.0") are historical and no longer accepted.
  • source_system — name of the originating system
  • source_reference — unique decision identifier in the source system
  • source_timestamp_utc — ISO 8601 UTC timestamp of decision production
  • decision.type — decision category (e.g. candidate_evaluation, risk_classification)
  • decision.status — must be "finalized"
  • decision.closure_timestamp_utc — UTC timestamp of closure
  • decision.summary — natural-language description of the decision
  • authority.id — authority identifier in the source system
  • authority.role — role of the authority
  • authority.dapi_number — required on the API intake; must match the DAPI identity bound to the API key used for the request, cross-checked server-side at intake time (errors: see Account binding at intake).
Notable optional fields
  • authority.verification — declared textual reference, not validated server-side. When present, evidentiary_profile.identity returns "claimed" instead of "declared", without verifying identity, role or powers; separate from the authority.dapi_number check.
  • intervention.type — override / approval / rejection / escalation
  • intervention.classification_context — upstream governance structure visibility (introduced v1.7). Required.
  • human_oversight.is_declared + declared_level — L1 / L2 / L3
  • fedis_requested — requests evaluation for optional FEDIS forensic certification
  • chain — links this intake to a previous one, forming a verifiable evidentiary chain (introduced v1.0 as a base-schema field, extended v2.1 with matter_reference). chain.parent_evide_id — EVIDE ID of the previous record. chain.chain_type — free text describing the continuation (e.g. litigation_hold, internal_investigation). chain.matter_reference — optional, inherited from the parent if omitted; if declared on both sides it must match. Validation is strict: the parent must exist, belong to the same evidentiary domain, be in an accepted status, and — if a matter_reference is declared — match it. There is no silent fallback: an invalid parent_evide_id fails the request rather than silently starting a new chain. See Evidentiary Continuity for the full model.
  • handoff — boundary state declaration for L3 intake. Required. boundary_readiness is a structured object with four canonical states (introduced v2.0). See Section 3.
  • extensions — array of strings declaring which optional schema extensions this payload carries. Registered extensions: evidence_references, declarations. An extension must be declared here to be accepted (v2.1).
  • evidence_references — array of declared external artifact references (screenshots, video, sensor logs, documents), anchored without EVIDE storing the underlying file. Optional integrity hash per artifact, declared by the submitter. Requires "extensions": ["evidence_references"] on the same payload. (v2.1)
  • declarations — array of explicit, attributable, time-bound statements of the operational perimeter (environment, privileges, purpose, tools, prohibited operations, agent configuration) an agent was authorized within, before it acted. EVIDE preserves the declaration only — it never verifies its correctness, applies it as policy, or compares it against observed behavior. Requires "extensions": ["declarations"] on the same payload. See EVIDE ANCHOR. (v2.1)
Extensions are opt-in in both directions. An optional block carried in the payload but not listed in extensions is rejected, and an extension listed in extensions with no corresponding content is rejected as well. Nothing enters the evidentiary object without having been announced, and nothing is announced without being present. This follows the same validation discipline used throughout EVIDE: declarations and payload content must remain mutually consistent. Documented defaults exist — an omitted chain.matter_reference inherits the parent’s — but an inconsistency between what is declared and what is present is never repaired by inference. No silent fallback is performed.
Chain validation refusals

The chain guarantees above are enforced at intake, not reconciled afterwards. Each condition returns its own code, so an integrator can tell a data error from an authorization refusal without parsing prose:

StatusErrorCondition
422invalid_fieldchain.parent_evide_id is not a well-formed EVIDE ID. Checked before any database lookup.
422chain_parent_not_foundThe ID is well-formed but matches no existing record.
403chain_parent_not_ownedThe parent exists but lies outside the evidentiary domain authorized by this API key. The only refusal in this family that is an authorization decision rather than a payload error.
422chain_parent_invalid_statusThe parent is not in an accepted status. Reachable only when chaining to a record you own — for any other parent the ownership refusal above takes precedence.
422chain_matter_mismatchBoth sides declare a matter_reference and the two differ.
Refusals do not disclose other domains. Probing with arbitrary identifiers returns chain_parent_not_found for records that do not exist and chain_parent_not_owned for records outside your domain — neither response confirms who owns a record, what status it is in, or whether it exists at all beyond that distinction.
Hash provenance principle. EVIDE never computes or independently verifies the integrity hash of an External Artifact reference, since the underlying file itself is never submitted to EVIDE. Any integrity hash attached to an External Artifact reference is anchored exactly as declared by the submitter (see hashed_by) and is never presented as an integrity verification performed by EVIDE. This differs from the intake hash described in Section 4, which EVIDE computes over the canonical form of the submitted payload. The optional content_hash is also a client-side declaration: EVIDE does not compare it with its own computation.
Minimal payload example (v2.1)
"evide_schema": "2.1", "source_system": "Example Governance Systems Ltd", "source_reference": "CDR-2026-00421", "source_timestamp_utc": "2026-04-07T09:15:00Z", "decision": { "type": "candidate_evaluation", "status": "finalized", "closure_timestamp_utc": "2026-04-07T09:15:00Z", "summary": "AI recommendation overridden by human authority" }, "authority": { "id": "user_87421", "role": "HR Reviewer", "dapi_number": "DAPI-0000000001" // required on the API intake }, "intervention": { "type": "override", "classification_context": { // required "taxonomy_reference": "https://example.org/taxonomies/rationale-types-v1.0", "threshold_reference": "https://example.org/rules/hr-review-threshold-v1", "threshold_status": "met" } }, "handoff": { "boundary_readiness": { // structured object "status": "candidate", "readiness_gate": null, "visibility_surface": null, "unresolved_signals": [] }, "reconstruction_independence": "declared", "submission_status": "not_submitted", "acceptance_status": "not_claimed" }

Full schema reference: app.certifywebcontent.com/json

Section 2
2. classification_context (v1.7 + v1.8)

The classification_context object exposes whether the classification act was supported by an upstream taxonomy and threshold structure at the moment of recording. It does not validate the threshold — it makes the presence or absence of such a structure externally visible. Required.

threshold_status values
  • met — threshold was defined and the decision satisfied it
  • not_met — threshold was defined but not satisfied
  • unknown — threshold may exist but state is not verifiable at deposit time
  • not_defined — no threshold was formally defined for this classification
Governance gap signal: threshold_status: "not_defined" does not indicate an operational error. It signals that at the moment of decision, no formally defined governance structure existed — a governance gap made externally visible, not a system failure.
threshold_authority (v1.8)

Exposes whether the threshold had a structurally attributable source of authority at closure. attribution_status is required when threshold_authority is present.

  • attributed — single identifiable authority defined at closure
  • fragmented — threshold defined across multiple sources, no single attributable authority
  • implicit — threshold present in practice but not formally defined or attributable
  • unknown — threshold authority not verifiable at the moment of closure
Section 3
3. handoff (v2.0)

The handoff object defines the boundary state of a closure object before EVIDE accepts it for external anchoring. Required. boundary_readiness is a structured object with four canonical states (promoted from a plain string in v2.0).

v1.9 made the boundary explicit. v2.0 makes the evidentiary quality of the boundary explicit.
boundary_readiness object (v2.0)
  • status — required. One of: candidate, verified, verified_partial, unverifiable.
  • readiness_gate.identifier — required when status ≠ candidate. Name or ID of the gate system that performed the assessment.
  • readiness_gate.scope_reference — required when status ≠ candidate. URL or hash of the gate policy document. Makes verified non-self-referential.
  • visibility_surface — categorical declaration of the gate's observational coverage: null (candidate), partial, declared_complete, insufficient.
  • unresolved_signals — string array of signal identifiers the gate could not resolve. Empty for candidate and verified. Minimum one element for verified_partial and unverifiable.
Canonical state combinations
  • candidate — readiness_gate: null, visibility_surface: null, unresolved_signals: []. No gate has operated. Upstream declaration only.
  • verified — readiness_gate: present, visibility_surface: declared_complete, unresolved_signals: []. Gate confirmed stability across complete visibility.
  • verified_partial — readiness_gate: present, visibility_surface: partial, unresolved_signals: [min. 1]. Gate confirmed what it could see. Gaps declared explicitly.
  • unverifiable — readiness_gate: present, visibility_surface: insufficient, unresolved_signals: [min. 1]. Gate operated but surface was below minimum threshold. Records the declared visibility limit and the gate reference; it is neither proof of diligence nor a failure.
Other handoff fields (unchanged from v1.9)
  • reconstruction_independence — must be declared for EVIDE intake.
  • submission_status — must be not_submitted when sent by the upstream system.
  • acceptance_status — must be not_claimed when sent by the upstream system.
Boundary rule: no downstream step should require reconstruction of intent from audit logs, human memory, or system-specific context. The object must be self-contained and independently verifiable before submission.

After a successful intake, EVIDE returns the updated handoff state with submission_status: "submitted" and acceptance_status: "accepted". In v2.0, boundary_readiness is returned as a structured object. The response also includes evidentiary_profile — a server-computed eleven-dimensional read of the intake object (profile_version: "1.1"). The profile is not part of the submitted payload and is not included in the canonical hash. The payload is stored as decoded by the server, and its hash is computed on the canonical form described in Section 4.

boundary_readiness and runtime conditions - architectural note (v2.0)

EVIDE anchors closure states, not runtime states. It does not monitor conditions after anchoring and does not introduce runtime governance.

"They come from anchoring something that was already drifting at the moment it was externalized."

In v2.0, this failure mode is addressed more precisely. The gate's own observational capacity becomes part of the evidentiary record. What the gate could not see is declared explicitly in unresolved_signals — it is no longer a hidden assumption but a documented variable.

A system cannot self-certify boundary_readiness.status = "verified". That evaluation must come from an independent gate declared in readiness_gate.identifier. If the gate's visibility was incomplete, the honest state is verified_partial with declared gaps — not verified.

unverifiable is not a failure state. It is the most forensically honest state when an independent gate operated but the source system was too opaque to confirm boundary stability.

Gate independence is a governance qualification, not a self-declared payload field in v2.0. Formal gate qualification is deferred to the v2.x Gate Qualification Framework.

Epistemic Stabilization Buffer (ESB) — v2.1. For decisions that require observation over time before the evidentiary boundary is crossed — a condition that may evolve before closure, rather than being final at submission — EVIDE offers an additional intake profile: the Epistemic Stabilization Buffer. ESB is part of EVIDE Schema v2.1 and does not require a separate payload schema. Operational endpoint details for ESB are available to certified API partners only — see Identity-Bound Access Model above.
Section 4
4. Canonicalization and Hashing

Before computing the SHA-256 intake hash, the server canonicalizes the decoded payload with the rules below, as specified in the technical note Payload Canonicalization. Changing only JSON whitespace outside string values, or using alternative escape sequences that decode to the same string value, does not change the hash, and object key order is normalized. This is not an equivalence for every semantically identical payload: any difference in values, in the order of arrays not reordered below, or in details normalized by the decoder can produce a different hash.

Algorithm
  • Remove the top-level content_hash node if present. A content_hash key nested inside another object is not removed.
  • Sort object keys recursively at every nesting level, by byte-wise string comparison (PHP ksort with SORT_STRING): uppercase letters sort before lowercase letters.
  • Sort arrays named extensions by value with the PHP <=> operator: byte-wise for the registered extension names; numeric strings are compared as numbers, non-strings as empty strings.
  • Sort arrays named evidence_references by the composite key artifact_type, pointer, declared_origin, hash.value, compared byte-wise in that order. A missing component counts as an empty string, and no other field is considered. Items with equal sort keys keep their submitted order; swapping them can change the hash if their canonical representations differ.
  • Keep the submitted element order of every other array. Each element is canonicalized recursively.
  • Serialize as minified JSON with PHP json_encode and the flags JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES: UTF-8 characters and slashes are not escaped.
  • Compute SHA-256 of the resulting bytes, expressed as lowercase hexadecimal.
Effects of server-side decoding. The server decodes the payload before canonicalizing it, so the hash covers the bytes it re-encodes, not the bytes the client sent. For example, an empty object {} is serialized as []; when a member name appears twice, only the last value is kept; numbers written with a decimal point or an exponent are re-serialized by PHP. With PHP's default serialize_precision (-1), 1.0 becomes 1, 1.50 becomes 1.5 and 1e2 becomes 100; these examples assume that setting. A client computing content_hash has to reproduce these effects.
Key ordering inside classification_context: taxonomy_reference → threshold_authority → threshold_reference → threshold_status.

Key ordering inside handoff.boundary_readiness (v2.0): readiness_gate → status → unresolved_signals → visibility_surface.

These orderings are enforced by recursive ksort and must be respected when computing content_hash on the source side.
Reference value: the intake hash returned in the API response is the fingerprint computed by EVIDE. The source-declared content_hash is optional and EVIDE never compares it with its own computation: the client compares it with the returned intake hash to check that the payload it sent was received and canonicalized as intended. Detecting a later change requires a reference digest kept separately and reliably; if content and stored digest are altered together, an internal comparison can still match.
Section 5
5. Schema Evolution

EVIDE follows a strict backward-compatible evolution model. Each version adds optional fields or response attributes without breaking existing integrations.

VersionAddition
1.0Base schema — decision, authority, intervention, human_oversight, chain
1.1created_at_utc, object_class, content_hash
1.2intervention.rationale_type
1.3intervention.taxonomy_version — enables classification replay in audit
1.4fedis_requested — requests evaluation for optional FEDIS forensic certification
1.5authority_verification_status (response) — claimed vs declared
1.6intervention.classification_status — stable / provisional / contested
1.7intervention.classification_context — upstream governance structure visibility
1.8classification_context.threshold_authority — threshold ownership attributability
1.9handoff — boundary-ready schema, universal handoff contract for L3 intake. boundary_readiness as string: candidate | verified.
2.0handoff.boundary_readiness promoted from string to structured object. Four canonical states: candidate, verified, verified_partial, unverifiable. Adds readiness_gate (identifier + scope_reference), visibility_surface, unresolved_signals. intervention.classification_context required. decision.status must be "finalized". Response includes evidentiary_profile (server-computed, profile_version 1.1) with eleven evidentiary dimensions. Dimension 9 (continuity) inferred via Forensic Cross-Check (classification x runtime_visibility) — anti-Synthetic-Coherence sensor. Dimension 10 (decision_wave_compression / DWC) inferred: runtime_visibility x boundary_readiness x unresolved_signals. Dimension 11 (formal_accountability_collapse / FAC) inferred: authority x threshold_attribution x continuity_state. States for dim 10-11: not_detected | detected | critical | unknown. Superseded by 2.1 — no longer a currently accepted evide_schema value.
2.1Adds extensions array declaring active schema extensions, and evidence_references array for declaring external artifacts (screenshots, video, sensor logs, documents) anchored without EVIDE storing the underlying file. Each reference carries artifact_type (free text), pointer, declared_origin, declared_description, and an optional hash object, declared by the submitter and never independently verified by EVIDE. The additions are non-breaking at the payload structure level — both fields are omitted entirely on payloads that do not use them. Adds chain.matter_reference and strict server-side validation of chain continuations (parent must exist, same evidentiary domain, accepted status, matching matter — never a silent fallback). Later within 2.1, adds declarations array (EVIDE ANCHOR) for explicit, attributable, time-bound statements of the operational perimeter an agent was authorized within, before it acted — each entry returns a server-computed declaration_digest, never sent by the client. "2.1" is the current and only evide_schema value accepted by the API.

Full architectural backlog: app.certifywebcontent.com/docs/evide-v2-roadmap/

Section 6
6. Interoperability

EVIDE is designed to receive structured closure objects from any system — AI pipelines, workflow engines, governance platforms, runtime agent systems — without requiring integration inside the decision pipeline.

The minimal boundary requirements for the source system are:

  • an explicit closure state (not only behavioral completion)
  • an identified authority bound to that closure
  • an explicit responsibility declaration
  • a stable reference to the upstream trace
  • a coherent classification context (even if initially internal)
Source identity field mapping
  • evidence_id → source_reference (primary object identity)
  • event_id → intervention.trace.reference (runtime event identity)
  • trace_reference → intervention.trace.reference (upstream trace continuity)

Reference implementation: RANKIGI × EVIDE Interface Mapping (v0.4.1)

Section 7
7. FEDIS Compatibility

FEDIS (Forensic Evidence Declaration & Integrity Statement) is a forensic document that references an EVIDE intake record and is intended to support its later examination. It is not a default system artifact but the optional output of a separate certification process. Setting fedis_requested: true submits a request for evaluation and a separate quote. It does not generate or issue FEDIS. The platform generates the document only after the certifier explicitly initiates generation.

Reference: certifywebcontent.com — FEDIS

A FEDIS-ready EVIDE record must include:

  • cryptographically fixed closure state (SHA-256 intake hash)
  • independent UTC intake timestamp
  • declared authority bound to the closure
  • classification context sufficient for external interpretation
  • stable upstream trace reference

Once the certifier initiates generation, the platform generates the FEDIS document for the certifier's signature. The document states the SHA-256 fingerprints of the intake record (the Canonical Intake Record JSON for structured intakes, the received artifact for file, text and URL intakes) and of the frozen Evidentiary Artifact Record (EAR), and documents the chain of custody. The certifier signs it with a qualified electronic signature (eIDAS Art. 25), and, as a distinct step, the document receives a qualified electronic time stamp (eIDAS Art. 41) issued by a third-party qualified trust service provider. The time stamp attests the moment at which it is applied to the FEDIS document: it does not make the intake timestamp qualified, does not date the original event and does not prove that the content is true.

FEDIS is intended to support examination in audit, regulatory and judicial contexts. It does not guarantee admissibility or the evidentiary weight a court or competent authority may assign to it.

Architecture in three layers
  • Source system — produces the decision and surfaces the closure object
  • EVIDE — anchors the closure object externally with integrity and timestamp
  • FEDIS — documents the anchored record in a signed forensic statement intended to support later examination
One closure.
Three layers.
One independent record.
For operational access, contact info@certifywebcontent.com