Consent receipt spec

This is a practical spec for a consent receipt: a portable permission artifact for AI agents that supports transaction-time YES/NO verification with replay safety and an auditable proof record.

Want to see the receipt layer in action?
Use the consent receipt + replay verifier lab prototype.
Open ACRRV lab Live verification demo

Goals

Receipt format

Receipt is canonical JSON. Signing should be deterministic (canonicalization required). The payload must be verifiable without network calls where possible.

Design rule: the verifier should be able to compute eligibility from receipt + context and return eligible plus a proof record.

Field reference

FieldTypeNotes
receipt_idstringStable unique ID. Use UUID or similar.
issuerstringWho issued/signed the receipt (authority).
delegatorstringUser/principal identifier (pseudonymous OK).
agent_idstringAgent identifier bound to keys/credentials.
scopearray[string]Allowed actions, e.g., payment.authorise.
constraintsobjectLimits: amount/currency, merchant/category, channel, etc.
nbfstring (ISO8601)Not-before time (optional).
expstring (ISO8601)Expiry time.
noncestringReplay protection value (single-use recommended for payments).
revocationobjectRevocation model: status endpoint ref, or revocation list ID.
signatureobjectKey ID + algorithm + signature over canonical payload.
offline_policyobjectOptional rules for offline verification (freshness window, sync requirements).

Constraints object (recommended)

Verification rules

  1. Signature validity: validate signature and key binding.
  2. Time validity: now ≥ nbf, now < exp.
  3. Revocation: receipt must not be revoked (online check or bounded offline).
  4. Scope match: requested action must be included in scope.
  5. Constraint match: context must satisfy constraints (amount/MCC/merchant/etc).
  6. Replay check: nonce semantics enforced (single-use or bounded-use).
  7. Output: return eligible YES/NO + proof record (hash/ID/policy version/context).

Replay protection

Receipts for payment-like actions should be single-use. The nonce must be checked against a ledger.

Offline policy

Offline verification is allowed when:

Example receipt

{
  "receipt_id": "cr_456",
  "issuer": "affixio",
  "delegator": "user_123",
  "agent_id": "agt_123",
  "scope": ["payment.authorise"],
  "constraints": { "max_amount": 5000, "currency": "GBP", "allowed_mcc": ["5411"] },
  "nbf": "2026-03-18T00:00:00Z",
  "exp": "2026-04-18T00:00:00Z",
  "nonce": "n_789",
  "revocation": { "type": "status_endpoint", "ref": "https://issuer.example/consent/status/cr_456" },
  "signature": { "alg": "Ed25519", "kid": "k_001", "sig": "base64:…" },
  "offline_policy": { "freshness_seconds": 3600, "require_sync_on_reconnect": true }
}

Related