| Internet-Draft | Attested Agent Payment Authorization | August 2026 |
| Hawkins | Expires 16 February 2027 | [Page] |
Autonomous software agents increasingly initiate payments on behalf of principals. Existing agent-payment mechanisms authenticate the human principal, the operator, or possession of a key; none of them establishes that the software authorized to spend is the software that was reviewed. A key held by a compromised or silently modified agent authenticates exactly as well as one held by an honest agent.¶
This document defines a payment authorization scope bound to a key whose protection properties are attested by hardware, and registers the resulting authorization as a Signed Statement on an SCITT Transparency Service. The binding reuses the EAT confirmation and key-attributes claims without modification; the contribution is the authorization scope, the verification procedure a payment executor performs before settlement, the transparency record that makes the authorization artifact and its registration auditable independently of the agent and of the executor, and an execution-record mechanism that makes the executor's aggregate accounting auditable on challenge. What is registered evidences the authorization; it does not evidence that the verification procedure was performed for any given settlement.¶
This Internet-Draft is submitted in full conformance with the provisions of BCP 78 and BCP 79.¶
Internet-Drafts are working documents of the Internet Engineering Task Force (IETF). Note that other groups may also distribute working documents as Internet-Drafts. The list of current Internet-Drafts is at https://datatracker.ietf.org/drafts/current/.¶
Internet-Drafts are draft documents valid for a maximum of six months and may be updated, replaced, or obsoleted by other documents at any time. It is inappropriate to use Internet-Drafts as reference material or to cite them other than as "work in progress."¶
This Internet-Draft will expire on 16 February 2027.¶
Copyright (c) 2026 IETF Trust and the persons identified as the document authors. All rights reserved.¶
This document is subject to BCP 78 and the IETF Trust's Legal Provisions Relating to IETF Documents (https://trustee.ietf.org/license-info) in effect on the date of publication of this document. Please review these documents carefully, as they describe your rights and restrictions with respect to this document. Code Components extracted from this document must include Revised BSD License text as described in Section 4.e of the Trust Legal Provisions and are provided without warranty as described in the Revised BSD License.¶
Protocols for agent-initiated payment have converged quickly. They differ in mechanism but agree on what they bind: the consent of a human principal, the identity of an operator, or possession of a private key. What none of them binds is the identity of the running program.¶
This distinction is not academic. Measurements of deployed agent-payment traffic over a 280-day window classify 21.20 percent of settlements as fictitious and 63.78 percent as internal settlement within a linked cluster -- 84.98 percent operator-internal in total [MEASURE]. An independent study of the ERC-8004 agent registries across three chains [ERC8004-STUDY] found that only 3% (Ethereum), 4% (BSC), and 15% (Base) of registered agents had a registration file that resolved, parsed as compliant, and declared at least one service endpoint; that reputation feedback was almost completely decoupled from economic activity (on Base, 93.8% of reviewers had never made a payment yet produced 94.9% of all feedback); and that the median cost of moving an agent's reputation score was $0.0027, against a median agent payment volume of $0.70. Possession of a key is compatible with all of these outcomes: it demonstrates that some party controls a secret, not that a particular program is running, nor that its behavior is the behavior that was authorized.¶
The same study reports that the registry standard's own Validation Registry -- the component its specification reserves for independent attestations, naming stake-secured re-execution, zkML proofs, and TEE attestation -- had no confirmed mainnet deployment through May 2026. The ecosystem has, in other words, already named the place where evidence stronger than self-reported feedback belongs, and left it empty. A track record answers whether an agent has behaved well and can be moved for fractions of a cent; an attestation answers whether the running code is the endorsed code, right now, and is structural from the first transaction. This document specifies the second kind of evidence for the payment-authorization decision in particular.¶
Meanwhile the primitives needed to close the gap exist and are specified. [I-D.reddy-rats-key-binding] binds a subject key to an attested execution environment using the EAT "cnf" claim [RFC8747] and a "key-attributes" claim describing key protection properties. [RFC9943] defines a Transparency Service on which signed statements about an artifact can be registered and later audited. Nothing joins them: no specification makes hardware attestation normative for a payment authorization decision, and no deployed system consults an attestation before releasing funds.¶
This document defines that join. It is deliberately small: it adds no new attestation format, no new key binding, and no new transparency mechanism. It specifies (1) what an authorization scope contains, (2) the verification a payment executor MUST perform, and (3) what is registered so that a third party can later audit an authorization without trusting either the agent or the party that executed the payment.¶
This specification does not:¶
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all capitals, as shown here.¶
An agent operating in an attested environment generates a key pair inside that environment and obtains an Entity Attestation Token (EAT) [RFC9711] carrying the "cnf" claim for the public key and the "key-attributes" claim describing its protection properties, per [I-D.reddy-rats-key-binding].¶
The agent's principal (or an operator acting for it) issues an Authorization Scope naming that key and the bounds within which it may spend. The scope, a reference to the authorization-time evidence, and the endorsed software identity are registered together as a Signed Statement on a Transparency Service [RFC9943], yielding a Receipt. At payment time the executor additionally obtains transaction-time evidence under its own nonce; the two evidence classes are defined in Section 1.2 and consumed by different checks of Section 4.¶
When the agent later instructs a payment, the Payment Executor verifies the attestation, verifies that the instruction is signed by the APK, verifies that the payment falls within the scope, and verifies the Receipt before settling. Each of these is a pre-execution check: the authorization decision is made before funds move, not reconstructed afterward from logs.¶
An Authorization Scope is a CBOR map, encoded in the deterministic encoding of Section 4.2.1 of [RFC8949]; the scope digest is computed over exactly those bytes. Determinism here is load-bearing, not hygienic: the digest is how a scope is referenced -- in Receipts, in executor reports, and in the binding of a held payment to the scope it was opened under -- and identical scopes that hash differently across encoders would quietly break every one of those references. The following members are defined; unknown members not named in "crit" MUST be ignored (see "crit" below for why blanket ignoring alone would be too permissive for authorization constraints).¶
Selects the issuer's disposition when the supersession check cannot be completed (Check 9 of Section 4). Absent this member, the disposition is "refuse": an indeterminate supersession result fails closed, because settling on it would be proceeding on unknown current authority. The member MAY move off that default to one of two named modes.¶
The scope is defined by the following CDDL; the prose above states intent, this definition is the algorithm's input contract:¶
authorization-scope = {
"apk": bstr, ; RFC 9679 thumbprint, SHA-256
"code": software-identity,
"limits": spending-limits,
"expiry": uint, ; epoch seconds
? "rails": [+ tstr], ; namespace: rail profiles
? "payees": [+ tstr], ; namespace: rail profiles
? "executor": tstr, ; REQUIRED with an aggregate bound
? "on_indeterminate": on-indeterminate,
? "crit": [+ tstr],
* tstr => any ; unknown; refused if named in crit
}
software-identity = {
"alg": tstr, ; e.g. "sha-256", "sha-384"
"artifact": tstr, ; measured-artifact class, from the
; attestation-technology profile
"digest": bstr
}
spending-limits = {
"currency": tstr, ; asset identifier
"scale": uint, ; smallest-unit scale declaration
"per_payment": uint, ; integer count of smallest unit
? "aggregate": uint,
? "window": uint ; rolling seconds ending at
; evaluation time; REQUIRED with
; "aggregate"
}
on-indeterminate = {
"mode": "hold" / "bounded-fail-open",
? "deadline": uint ; epoch seconds; MUST NOT exceed
; "expiry"; meaningful for "hold"
}
¶
An Authorization Scope MUST NOT be widened by any party other than its issuer, and an agent MUST NOT be able to widen its own scope by any means, including by presenting a newer attestation. Narrowing MAY be performed by the executor.¶
Before executing a payment presented under this specification, a Payment Executor MUST perform all of the following checks. Checks 1 through 8 are completeness checks: the executor MUST NOT settle if any of them fails or cannot be completed. Check 9 (supersession) is a positive-signal check whose distinct semantics are stated in that item and in Section 6.¶
This profile uses the combined model of [I-D.reddy-rats-key-binding]: a single EAT whose "cnf" claim carries the Subject Key. The split model (a PAT carrying the KAK and a KAT carrying the Subject Key, with its distinct verification sequence) is out of scope at this revision; "the evidence" below is therefore unambiguous.¶
The checks above establish that the reviewed program made the payment decision only if signatures by the APK cannot originate outside it. All use of the APK for payment signing MUST be mediated by the component covered by the "code" measurement, such that unmeasured software cannot cause an APK payment signature except through the authorization checks performed by that measured component. A signing interface inside the attested environment that accepts requests from unmeasured software defeats the design while passing every per-payment check: the signature is valid, the key is never-extractable, the attestation verifies, and the payment decision was still not made by the reviewed program. Deployments MUST NOT expose such an interface, and Registration Policies SHOULD require the Issuer to assert this property at registration. Without it, the step from key-bound-to-environment to payment-decision-bound-to-reviewed-agent -- this document's thesis -- is not established.¶
An executor MUST distinguish, in whatever it reports to the instructing party, between "authorization refused" and "authorization could not be evaluated". Collapsing the two allows an outage in an attestation or transparency service to be indistinguishable from a policy decision, which in practice produces pressure to fail open. Where a scope names "on_indeterminate" (Section 3), the executor MUST record in that report the action taken under it -- refused, held until a stated time, or re-evaluated and settled. A hold is a policy decision, and the distinction this section requires exists precisely so that a policy decision and an outage cannot be confused; an unrecorded hold would reintroduce that confusion. The executor SHOULD additionally record the disposition in force, so that the issuer's intent and the executor's action appear on the same record rather than the executor's action alone.¶
Executors MUST fail closed. An executor that cannot complete checks 1 through 8 MUST NOT settle. An indeterminate supersession result (Check 9) is fail-closed by default -- the executor refuses, or, where the scope so selects, holds for a determinate result. It settles on an indeterminate result only where the scope has explicitly selected the "bounded-fail-open" mode of "on_indeterminate" (Section 3), which trades revocation-safety for liveness within "expiry" and is documented as such in Section 7. Absent that explicit selection, an indeterminate result MUST NOT settle.¶
The Authorization Scope, together with a reference to the attestation evidence and the endorsed software identity, is registered as a Signed Statement per [RFC9943]. The resulting Transparent Statement and Receipt make three properties available to parties who were not present at authorization time:¶
A Transparency Service accepting these statements records what was submitted; it does not adjudicate it. Registration Policy SHOULD NOT condition acceptance on the referenced attestation evidence verifying, and a service MUST NOT label a registration as attested or otherwise vouch for the evidence it references: verification is the relying party's act (Section 4), and a log that grades what it stores has acquired exactly the interest in characterization that the bullet above disclaims for it. What Registration Policy SHOULD require is well-formedness -- that the statement parses as an Authorization Scope per Section 3 and that its evidence references are digest-bearing.¶
Evidence and scopes SHOULD be referenced by digest rather than by location alone, so that a later auditor can detect substitution of the artifact a Receipt refers to.¶
The Receipt proves that a scope predated a payment. It does not prove that any specific settled payment was counted against the scope's aggregate bound: an executor's private spending record is a claim no party outside the executor can check, and this document's own position is that such a claim is treated as absent. The aggregate bound is therefore made checkable as follows.¶
For each payment settled under a scope, the executor MUST compute an execution digest over the settled payment's fixed fields: amount, payee, settlement timestamp, and the scope digest under which it was authorized. The execution digest is distinct from the scope digest and not derivable from it; any party holding the settled payment's terms can recompute it without the executor's cooperation.¶
The executor MUST maintain, per scope, the enumeration of execution digests counted against the scope's aggregate bound, and MUST produce that enumeration when challenged by the issuer or by an auditor. The sum over the enumerated payments is what a challenger compares against the aggregate limit, and a settled payment whose execution digest is absent from the enumeration is the discoverable failure. Without the enumeration requirement, a recomputable digest establishes only that a payment could have been counted, which is the same self-report one step removed.¶
The two digests are deliberately independent: neither is derived from the other, and each is discoverable alone. A chained construction, in which the execution record embeds the digest of the authorization it answers, achieves pairing and is deployed in at least one running system [I-D.sirkkavaara-vaara-receipt]; this document requires independence instead, because a chained second record that the executor withholds leaves the first record with no visible evidence that an answer was ever owed, whereas an independently anchored execution digest can be found by any party that holds the settled payment's terms, whether or not the executor cooperates.¶
Authorization under this specification is short-lived by construction. A scope SHOULD have an "expiry" no longer than is operationally necessary, and issuers SHOULD prefer reissuance to long lifetimes.¶
This is a deliberate design choice. Revocation that depends on a signal reaching an executor in time is only as reliable as that signal; expiry requires no message to arrive, no service to be reachable, and no action by the revoking party. An issuer that stops reissuing has revoked, and the maximum exposure is bounded by the remaining lifetime.¶
Where an explicit revocation signal is also available, it MAY be registered as a superseding statement on the Transparency Service. Executors SHOULD consult it, but MUST NOT rely on its arrival as the only bound on exposure. A Transparency Service that advertises supersession queries MUST return signed responses carrying the log inclusion position or checkpoint they were computed against, and an executor MUST treat an unsigned or position-less answer as the log not having answered -- which is an indeterminate result under Check 9 of Section 4, never a determinate absence. Services that do not advertise the query are out of scope by construction. The requirement is deliberately placed on the party making the claim: a weaker recommendation here would reopen the gap it closes, since every service that skipped it would return exactly the ambiguous silence the executor cannot act on, and a determinate "none present" would again have no stated basis.¶
Supersession is evaluable only if statements about one scope form a sequence, so this profile defines the sequencing. The "sub" of the scope's Signed Statement is the scope sequence identifier: for a new authorization it is the scope digest of the initial scope in the sequence, and it remains constant across reissuance, narrowing, and revocation. A superseding or revoking statement MUST carry the same ("iss", "sub") pair as the statements it joins; a statement under a different pair supersedes nothing. Precedence within a sequence is established by an explicit monotonic sequence number carried in each Signed Statement, never by registration order: [RFC9943] warns that order on a ledger cannot be assumed to match issuance order absent policy, so position on the log is not authority. An executor discovers the current statement of a sequence by querying the Transparency Service over the ("iss", "sub") pair, and a determinate "no superseding statement" (Check 9) means a signed, position-carrying answer showing the scope's own statement as the highest sequence number registered for that pair. Expiry bounds the duration of exposure; it does not establish that a payment remains authorized, since a revocation may have occurred that the executor cannot observe. An executor that cannot determine whether a superseding statement exists therefore fails closed by default (Check 9 of Section 4): to settle regardless would be to proceed on unknown current authority. An issuer MAY direct a different indeterminate disposition per scope through "on_indeterminate" (Section 3), including the explicit "bounded-fail-open" mode, which accepts that exposure knowingly.¶
None of these choices is novel to payments; each restates a lesson from network policy control, where the same failure modes were worked through in production decades ago. Preferring reissuance to long lifetimes is the soft-state discipline of RSVP [RFC2205]: authorization that expires unless refreshed needs no revocation signal to arrive. Re-running the whole of Section 4 before a held payment settles is per-command re-authorization as practiced by TACACS+ [RFC8907], which caches no approval across requests. Binding a hold to the scope in force at settlement is the revalidation discipline of BGP prefix origin validation [RFC6811], under which acceptance does not survive a change in the authorization set it was computed from. And the question "on_indeterminate" answers -- what an enforcement point does when its decision point cannot be reached -- is the question COPS [RFC2748] was chartered to standardize. These references are informative; this specification implements none of them.¶
Implementers are warned that revoking authorization stops subsequent authorized payments; it does not by itself reverse or cancel obligations already created on a settlement system. Documents profiling this specification for a particular rail SHOULD state precisely what revocation does and does not undo on that rail.¶
Attestation proves provenance, not correctness. A verified attestation establishes that the running software is the endorsed software. It does not establish that the software is free of defects, that its authorization logic is sound, or that its behavior is desirable. Systems that present attested execution as a correctness guarantee will mislead the parties relying on them. Where the endorsed code is itself the authorization logic, the value of attestation is exactly that the logic cannot be silently replaced -- no more.¶
Extractable keys void the property. If the private component of the APK can leave the attested environment, then a payment signed by it evidences nothing about where it was signed. This is why the "key-attributes" check in Section 4 is mandatory rather than advisory.¶
Attestation freshness. An attestation not bound to a freshness value supplied by the verifying party can be replayed by any party that has observed it, including after the attested environment has stopped running. The "eat_nonce" check is not optional.¶
Scope inflation. The most likely deployment error is a scope broad enough to be operationally convenient -- unbounded aggregate, no expiry, no payee constraint -- which preserves the appearance of attested authorization while removing its effect. Registration Policies SHOULD reject unbounded scopes.¶
Transparency is not confidentiality. Registering scopes publicly may disclose commercially sensitive information about an agent's spending authority. Implementers SHOULD register digests rather than plaintext where disclosure is a concern, and SHOULD consider that the existence and timing of registrations is itself observable.¶
Verifier and Transparency Service availability. Because executors MUST fail closed, an unavailable verifier or Transparency Service denies service rather than degrading security: whenever a check cannot be completed -- for a Transparency Service, whenever the Receipt (Check 8) cannot be obtained or the supersession status (Check 9) cannot be determined -- the default is refusal. Deployments SHOULD plan for this explicitly. Uncontrolled failing open under load -- settling because a check could not be completed, with no issuer having chosen that behavior -- is worse than denial and MUST NOT be implemented. The single exception is the "bounded-fail-open" mode of "on_indeterminate" (Section 3): an issuer MAY, per scope, direct that an indeterminate supersession result settle within "expiry", knowingly trading revocation-safety for availability. That mode is bounded (by "expiry"), explicit (issuer-selected, never a default), and named for the exposure it accepts; it is the only circumstance under which an incomplete supersession check settles, and it MUST NOT be applied to the completeness checks (1 through 8), which always fail closed.¶
The log is not disinterested by assumption. A Transparency Service can be operated by an interested party, and nothing in a Receipt evidences otherwise. Deployments SHOULD require that the service's checkpoints be countersigned by a quorum of independent witnesses, so that a service presenting different views to different parties is detectable by comparing countersigned checkpoints. An executor SHOULD treat a supersession answer (Section 6) computed against an unwitnessed checkpoint as weaker evidence than one computed against a witnessed checkpoint, and a Registration Policy SHOULD state which witnesses countersign its checkpoints.¶
Enumeration does not close omission. The execution-digest enumeration of Section 5.1 makes deletion and reordering of counted payments detectable. It does not close omission: a payment that never entered the enumeration leaves no gap to find, so an enumeration the executor produces remains the executor's word about completeness, one layer down. Closing omission requires enumerating from a vantage the executor does not control -- for example, from the settlement rail itself, with each record bound to the settled transaction's own digest, so that a missing leg is visible to whichever party holds that leg. Rail-side enumeration is out of scope for this document; profiles binding this specification to a particular rail SHOULD state whether and how the rail's own records can serve that role.¶
The Attester is trusted. This specification inherits the trust model of [RFC9334]: relying parties trust the Attester's hardware root and its endorsers. A compromise of that root compromises every authorization derived from it.¶
Attestation evidence can be highly identifying, potentially including platform and firmware detail beyond what a payment decision requires. Deployments SHOULD convey to executors only the claims their policy consumes, and Transparency Service registrations SHOULD reference evidence by digest rather than embedding it.¶
Correlation across payments is possible where the same APK is reused. Where unlinkability matters, issuers SHOULD scope keys narrowly and rotate them, accepting the additional attestation cost.¶
This document has no IANA actions at this revision. A future revision is expected to request a CBOR tag or media type for the Authorization Scope, and registration of any new EAT claims should further revisions require them; the present design deliberately reuses existing claims.¶
This section is to be removed before publishing as an RFC.¶
Per [RFC7942]. The author operates a payment facilitator in which the settlement key is generated inside an Intel TDX confidential computing environment and never exists outside it; the environment's software identity is endorsed on-chain and an open verifier checks the attestation, the endorsement, and the key binding before the service is treated as attested. A second deployment issues short-lived credentials gating access to a permissioned trading venue, where the issuing key is likewise generated inside the attested environment and credential lifetime is the bound on exposure, as described in Section 6.¶
These deployments predate this document and do not implement it as written; they are offered as evidence that the pattern is operable, not as a conformant implementation.¶
Independently of the author, Colin Winter (Markovian Protocol) registered an Authorization Scope statement against the -00 registration flow on a public transparency log (leaf 7235 of log.markovianprotocol.com), with verification code published alongside it. That exercise surfaced the deterministic-encoding, integer-amount, and single-expiry-form requirements now normative in Section 3: three ways identical scopes could hash differently or diverge across encoders, each found by attempting an implementation rather than by review.¶
This document exists because two specifications were written and not connected. The key binding it depends on is the work of the authors of [I-D.reddy-rats-key-binding], and the transparency model is that of [RFC9943]. Reviewers in the x402 community materially improved the author's understanding of what payment executors can and cannot verify in practice.¶
Vernon Wharff (Sigilcore) identified that the -00 supersession step carried three different normative strengths across Sections 4 and 6, and that "fail closed" conflates two distinct behaviors -- terminal refusal and a bounded hold -- that the issuer, who signs the scope and chose its expiry, had no way to select between. The split of Checks 8 and 9 and the on_indeterminate scope member follow from that review. Iman Schrock (EMILIA) identified that the resulting fallback default for an indeterminate supersession result was bounded fail-open -- settling on unknown current authority, with expiry bounding only the duration of exposure -- and that it contradicted Section 7's own requirements. The refuse-by-default repair and the Section 7 realignment follow from that correction.¶
Tiago Pinto (donttrustverify.pt) reviewed the -00 in full against pinned artifacts, together with its normative dependencies, and applied the test a profile lives or dies by: whether two independent implementations, given the same artifacts and inputs, evaluate the same predicates the same way. Eight blocking findings from that review -- thumbprint comparability, the key-attributes and evidence-class profiles, the "code" semantics and the mediation requirement, executor binding and atomicity for the aggregate bound, instruction identity, constraint enforcement, and supersession sequencing -- account for most of the normative distance between -00 and this revision, and his calibration of the citations corrected both a title and a misattributed claim. The narrowing of Section 6's signed-answer requirement to a MUST on services that advertise supersession queries is likewise his: the requirement sits on the party making the claim, which is where load-bearing distinctions belong.¶
Colin Winter (Markovian Protocol) attempted a registration rather than a reading, and the deterministic-encoding, integer- amount, and single-expiry-form requirements of Section 3 are the result; his registration appears in the Implementation Status. Joel Hillier (Certisyn) identified that scope selection by APK alone is ambiguous the moment two live scopes share a key, that a null Transparency Service answer is indeterminate rather than a determinate absence, and that signed, position-carrying answers are what make a determinate absence auditable; all three are now in the text. Pablo Etcheverry identified that the -00 aggregate check was the executor attesting to itself from records nobody else sees -- the exact class of claim this document argues should be treated as absent -- and the execution-digest construction and enumeration requirement of Section 5.1 follow from that finding. Henri Sirkkavaara (Vaara) named the limit of that construction, recorded in Security Considerations: an executor-produced enumeration detects deletion, not omission.¶