Docs · preview
Evidence Record schema
Sixteen core fields, six addendum fields for the rails procurement pays on. Schema version enruta/0.
v0 is a draft. Field names are stable within v0; additions before 1.0 are listed in the changelog and never change the meaning of an existing field.
Core · 16
B2B addendum · 6
record
Identity of the record: a ULID with the rec_ prefix, the schema version, creation time and the sequence number inside the customer chain.
"record": {
"id": "rec_01J9Q2W6G5X8ZK3R7T1V9M4N2B",
"schema": "enruta/0",
"created_at": "2026-11-30T18:01:44Z",
"sequence": 4127
}Core
| # | Field | Contents |
|---|---|---|
| 1 | record | id (ULID with rec_ prefix), schema, created_at, sequence within the customer chain |
| 2 | principal | Organization that owns the funds and the policy; org_ id and display name |
| 3 | agent | agt_ id, the identity attestation reference (KYA) and the host it ran in |
| 4 | policy | pol_ id, version, and the hash of the signed policy document |
| 5 | request | Payee, amount, currency, purpose, checkout reference, evidence references with digests, idempotency_key |
| 6 | decision | allow / step_up / deny, reason codes, budget state before and after, checks run, decided_at |
| 7 | approval | Actor, method (passkey / link), the bound request hash, approved_at; null when no person was required |
| 8 | mandate | mnd_ id, scope (amount, payee, expiry), single_use, consumed_state |
| 9 | protocol | The upstream object mapped in: type (ap2_mandate, acp_allowance, ucp_consent, x402_offer, mpp_receipt, card_authorization, export) and its digest |
| 10 | execution | Rail, the instruction or credential reference (token, never a card number), executed_at |
| 11 | receipt | Merchant or rail receipt digest, order or transaction identifier |
| 12 | outcome | authorized / declined / refunded / disputed, amounts, posted_at |
| 13 | strength | third_party_signed / customer_attested / self_asserted, per claim group |
| 14 | seal | Canonicalization (rfc8785), hash algorithm, hash, prev record hash |
| 15 | keys | References to the snapshotted verification keys used at capture, each with a provenance tag |
| 16 | attestations | Pointer to the companion bundle: RFC 3161 tokens, daily-root inclusion proof, OpenTimestamps anchor, renewals |
B2B addendum
| Field | Contents |
|---|---|
settlement_rail | issuing_card, ramp, mercury, bill_com, ach, wire, x402, mpp; the account or program it ran on |
rail_authorization_record | The rail’s own authorization identifier and decision, and the time Enruta answered |
account_validation | How the payee’s account was validated and when |
rfp_context | Request-for-payment or invoice context: bill, purchase order, match status |
card_control_state | The controls compiled onto the card or limit at issuance: amount, merchant, MCC, expiry |
dispute_afterlife | Anything that happened after posting: retries, refunds, disputes, with references |
Example
{
"record": { "id": "rec_01J9Q2W6G5X8ZK3R7T1V9M4N2B", "schema": "enruta/0", "created_at": "2026-11-30T18:01:44Z", "sequence": 4127 },
"principal": { "id": "org_acme" },
"agent": { "id": "agt_procurement_02", "attestation": "kya_…", "host": "claude-code" },
"policy": { "id": "pol_office_supplies", "version": 7, "hash": "sha256:…" },
"request": { "payee": { "domain": "store.enruta.ai" }, "amount": "168.40", "currency": "USD",
"purpose": "20 reams A4 paper, 1 stapler", "checkout": { "protocol": "ucp", "reference": "chk_8f3…" },
"idempotency_key": "a3c9…" },
"decision": { "result": "step_up", "reasons": ["approval_required"], "decided_at": "2026-11-30T18:01:45Z" },
"approval": { "by": "usr_controller", "method": "passkey", "binds": "sha256:9f1c…2e4a", "approved_at": "2026-11-30T18:03:10Z" },
"mandate": { "id": "mnd_7c2a…d1f0", "amount": "168.40", "expires_at": "2026-11-30T18:18:10Z", "single_use": true, "consumed_state": "consumed" },
"protocol": { "type": "ucp_consent", "digest": "sha256:…" },
"execution": { "rail": "issuing_card", "credential_ref": "ic_…", "executed_at": "2026-11-30T18:03:12Z" },
"receipt": { "digest": "sha256:…", "order_id": "ord_2211" },
"outcome": { "status": "authorized", "amount": "168.40", "posted_at": "2026-12-01T02:10:00Z" },
"strength": { "approval": "third_party_signed", "receipt": "customer_attested" },
"seal": { "canon": "rfc8785", "alg": "sha256", "hash": "b0d4…71c9", "prev": "e91a…0c3d" },
"keys": ["key_org_acme_2026-09", "key_enruta_seal_2026-09"],
"attestations": { "bundle": "rec_01J9Q2W6G5X8ZK3R7T1V9M4N2B.bundle.json" },
"settlement_rail": "issuing_card",
"rail_authorization_record": { "id": "iauth_1S7…", "decision": "approved", "answered_in_ms": 41 },
"card_control_state": { "amount": "168.40", "merchant": "store.enruta.ai", "expiry": "2026-11-30T18:18:10Z" }
}The bundle
<record id>.bundle.json sits next to the record and holds everything that changes after sealing: time-stamp tokens, the inclusion proof in the daily root, the root’s signed checkpoint, renewals, and the key snapshots. The record’s hash never depends on the bundle.