Enruta

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

#FieldContents
1recordid (ULID with rec_ prefix), schema, created_at, sequence within the customer chain
2principalOrganization that owns the funds and the policy; org_ id and display name
3agentagt_ id, the identity attestation reference (KYA) and the host it ran in
4policypol_ id, version, and the hash of the signed policy document
5requestPayee, amount, currency, purpose, checkout reference, evidence references with digests, idempotency_key
6decisionallow / step_up / deny, reason codes, budget state before and after, checks run, decided_at
7approvalActor, method (passkey / link), the bound request hash, approved_at; null when no person was required
8mandatemnd_ id, scope (amount, payee, expiry), single_use, consumed_state
9protocolThe upstream object mapped in: type (ap2_mandate, acp_allowance, ucp_consent, x402_offer, mpp_receipt, card_authorization, export) and its digest
10executionRail, the instruction or credential reference (token, never a card number), executed_at
11receiptMerchant or rail receipt digest, order or transaction identifier
12outcomeauthorized / declined / refunded / disputed, amounts, posted_at
13strengththird_party_signed / customer_attested / self_asserted, per claim group
14sealCanonicalization (rfc8785), hash algorithm, hash, prev record hash
15keysReferences to the snapshotted verification keys used at capture, each with a provenance tag
16attestationsPointer to the companion bundle: RFC 3161 tokens, daily-root inclusion proof, OpenTimestamps anchor, renewals

B2B addendum

FieldContents
settlement_railissuing_card, ramp, mercury, bill_com, ach, wire, x402, mpp; the account or program it ran on
rail_authorization_recordThe rail’s own authorization identifier and decision, and the time Enruta answered
account_validationHow the payee’s account was validated and when
rfp_contextRequest-for-payment or invoice context: bill, purchase order, match status
card_control_stateThe controls compiled onto the card or limit at issuance: amount, merchant, MCC, expiry
dispute_afterlifeAnything 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.