Approvals

ATAP's core contribution: multi-signature authorization proofs with 2 or 3 independent signatures.

The approval is ATAP's sole protocol contribution. It is a portable, self-contained document carrying independent cryptographic signatures from all parties — verifiable by anyone, offline, without callback to any server.

Two-party and three-party approvals

FlowPartiesSignaturesUse case
Two-partyfrom, to2Human grants agent permission, peer-to-peer delegation
Three-partyfrom, via, to3Purchase, booking, or action mediated by a system

The via field is optional. When present, the three-party signing sequence applies.

Signing sequence

Three-party (with via)

Step 1: from signs
  Requester creates approval, signs it.
  Sends approval/1.0/request via DIDComm to via.

Step 2: via validates and co-signs (or rejects)
  System validates subject and payload.
  If accepted: adds signature, sends approval/1.0/cosigned to to.
  If refused: sends approval/1.0/rejected to from.

Step 3: to signs (approves or declines)
  Approver reviews rendered template or fallback.
  Signs approval response.
  Sends approval/1.0/response via DIDComm to from and via.

Two-party (without via)

Step 1: from signs
  Requester creates approval, signs it.
  Sends approval/1.0/request via DIDComm to to.

Step 2: to signs (approves or declines)
  Approver reviews and signs.
  Sends approval/1.0/response via DIDComm to from.

Approval format

{
  "atap_approval": "1",
  "id": "apr_01JQXYZ...",
  "created_at": "2026-03-12T14:30:00Z",
  "from": "did:web:example.com:agent:01jd7xk3m9",
  "to": "did:web:example.com:human:x7k9m2w4p3n8j5q2",
  "via": "did:web:merchant.com:machine:checkout",
  "subject": {
    "type": "com.merchant.purchase",
    "label": "Order #ORD-7X9K — €129.90",
    "reversible": false,
    "payload": { ... }
  },
  "signatures": {
    "from": "<JWS>",
    "via": "<JWS>"
  }
}

Key fields

FieldRequiredDescription
atap_approvalYesMust be "1"
idYesapr_ prefix + ULID
fromYesRequester DID
toYesApprover DID
viaNoMediating system DID
valid_untilNoAbsent = single-use approval. ISO 8601 = Standing Approval
subjectYesWhat is being approved
signaturesYesJWS signatures keyed by role

Approvals vs. Standing Approvals

valid_untilTypeBehavior
Absent/nullApprovalSingle use. Default TTL 60 min. Transitions to consumed after use.
ISO 8601 dateStanding ApprovalValid for repeated use until expiration. Revocable at any time.

Standing Approvals are subject to the receiving server's max_approval_ttl policy.

Signatures

Each signature is a JWS Compact Serialization with Detached Payload. The signed payload is the UTF-8 encoding of the JCS-serialized approval document (excluding the signatures field).

The JWS Protected Header must contain:

  • alg — Algorithm identifier (e.g., EdDSA)
  • kid — Fully qualified DID URL (e.g., did:web:example.com:agent:01jd7xk3m9#key-1)

Lifecycle

requested → approved → consumed     (single-use approval)
requested → approved → revoked      (standing approval)
requested → declined                (final)
requested → expired                 (final)
requested → rejected                (three-party: via refuses co-signature)

Chained approvals

An approval may reference a parent approval ID. The system should verify the parent's validity before accepting the child. Revoking a parent invalidates all children.

This enables delegation hierarchies — for example, a manager delegates a budget, then a team lead sub-delegates part of it to an agent.