Network Working Group Y. Narvaneni Internet-Draft S. P. Ravi Intended status: Standards Track Independent Researcher Expires: 23 April 2027 20 October 2026 The agent URI Scheme and Verifiable Agent Identity draft-narvaneni-agent-uri-04 Abstract Software agents increasingly act on the Internet on behalf of people and organizations: they call APIs, browse websites, and delegate work to other agents. Protocols such as A2A and MCP define how agents communicate, but there is no interoperable way to answer a prior question: _which agent is this, and how can its claims be verified?_ This document defines the agent URI scheme as a stable, human- readable identifier for an agent, a deterministic mapping from that identifier to an HTTPS-hosted Agent Identity Document, anchoring of the agent's keys to a web origin or a Decentralized Identifier, and signed statements that bind the agent to its protocol metadata. It also defines profiles that let an agent prove its identity on HTTP requests, building on HTTP Message Signatures for automated traffic, and that let short-lived agent instances act under the agent's identity using the WIMSE Workload Identity Token format. It deliberately does not define how agents communicate, describe their capabilities, or are invoked. Status of This Memo 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 23 April 2027. Narvaneni & Ravi Expires 23 April 2027 [Page 1] Internet-Draft agent-uri October 2026 Copyright Notice 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. Table of Contents 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 3 1.1. Design Principles . . . . . . . . . . . . . . . . . . . . 4 1.2. Non-Goals . . . . . . . . . . . . . . . . . . . . . . . . 5 2. Conventions and Terminology . . . . . . . . . . . . . . . . . 6 3. Overview . . . . . . . . . . . . . . . . . . . . . . . . . . 6 4. The agent URI Scheme . . . . . . . . . . . . . . . . . . . . 7 4.1. Syntax . . . . . . . . . . . . . . . . . . . . . . . . . 7 4.2. Normalization and Comparison . . . . . . . . . . . . . . 8 4.3. Dereferencing . . . . . . . . . . . . . . . . . . . . . . 9 4.4. Fragments . . . . . . . . . . . . . . . . . . . . . . . . 10 5. Agent Identity Document . . . . . . . . . . . . . . . . . . . 10 5.1. Format . . . . . . . . . . . . . . . . . . . . . . . . . 10 5.2. Key Identifiers . . . . . . . . . . . . . . . . . . . . . 11 5.3. Key Purposes . . . . . . . . . . . . . . . . . . . . . . 12 5.4. Links . . . . . . . . . . . . . . . . . . . . . . . . . . 12 5.5. Example . . . . . . . . . . . . . . . . . . . . . . . . . 13 5.6. Retrieval and Validation . . . . . . . . . . . . . . . . 14 6. Anchoring . . . . . . . . . . . . . . . . . . . . . . . . . . 15 6.1. Origin-Anchored Agents . . . . . . . . . . . . . . . . . 15 6.2. DID-Anchored Agents . . . . . . . . . . . . . . . . . . . 16 6.3. Lifecycle, Rotation, and Revocation . . . . . . . . . . . 17 7. Agent Statements . . . . . . . . . . . . . . . . . . . . . . 17 7.1. Verification . . . . . . . . . . . . . . . . . . . . . . 18 8. Profile: Request Signing . . . . . . . . . . . . . . . . . . 19 8.1. Signing . . . . . . . . . . . . . . . . . . . . . . . . . 19 8.2. Verification . . . . . . . . . . . . . . . . . . . . . . 20 9. Profile: Agent Instances . . . . . . . . . . . . . . . . . . 21 10. Profile: Authorization . . . . . . . . . . . . . . . . . . . 23 10.1. The Agent as an OAuth Client . . . . . . . . . . . . . . 23 10.2. Delegation . . . . . . . . . . . . . . . . . . . . . . . 25 10.3. Protected Resources . . . . . . . . . . . . . . . . . . 25 11. Discovery . . . . . . . . . . . . . . . . . . . . . . . . . . 25 Narvaneni & Ravi Expires 23 April 2027 [Page 2] Internet-Draft agent-uri October 2026 12. Relationship to Other Protocols . . . . . . . . . . . . . . . 26 13. Security Considerations . . . . . . . . . . . . . . . . . . . 26 13.1. Trust Model . . . . . . . . . . . . . . . . . . . . . . 26 13.2. Handle Reassignment . . . . . . . . . . . . . . . . . . 27 13.3. Operator Claims . . . . . . . . . . . . . . . . . . . . 27 13.4. Verifier-Initiated Fetches . . . . . . . . . . . . . . . 27 13.5. Request Content and Replay . . . . . . . . . . . . . . . 28 13.6. Key Compromise and Key Separation . . . . . . . . . . . 28 13.7. Cross-Origin Metadata . . . . . . . . . . . . . . . . . 29 13.8. Confusable Names . . . . . . . . . . . . . . . . . . . . 29 14. Privacy Considerations . . . . . . . . . . . . . . . . . . . 29 15. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 29 15.1. URI Scheme Registration . . . . . . . . . . . . . . . . 29 15.2. Well-Known URI Registration . . . . . . . . . . . . . . 30 15.3. Media Types . . . . . . . . . . . . . . . . . . . . . . 30 15.4. Signature-Agent Type . . . . . . . . . . . . . . . . . . 31 15.5. Link Relations . . . . . . . . . . . . . . . . . . . . . 31 15.6. OAuth Client Metadata . . . . . . . . . . . . . . . . . 31 15.7. JSON Web Key Parameters . . . . . . . . . . . . . . . . 31 15.8. JSON Web Token Claims . . . . . . . . . . . . . . . . . 31 16. References . . . . . . . . . . . . . . . . . . . . . . . . . 31 16.1. Normative References . . . . . . . . . . . . . . . . . . 31 16.2. Informative References . . . . . . . . . . . . . . . . . 35 Appendix A. Test Vectors: Agent URI Processing . . . . . . . . . 36 A.1. Parsing and Canonicalization . . . . . . . . . . . . . . 37 A.2. Mapping to AID URLs . . . . . . . . . . . . . . . . . . . 39 A.3. Reverse Mapping of Signature-Agent Values . . . . . . . . 39 A.4. AID Origin Comparison . . . . . . . . . . . . . . . . . . 40 Appendix B. Open Issues . . . . . . . . . . . . . . . . . . . . 40 Appendix C. Changes from draft-narvaneni-agent-uri-03 . . . . . 41 Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . . . 42 Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 42 1. Introduction Agents are now first-class actors on the Internet. A single user task can cause an agent to call dozens of APIs and other agents, each of which needs to decide whether to serve the request. Today those services can see a TLS client, an IP address, perhaps an OAuth access token issued to _some_ client, and a User-Agent string that anyone can forge. They cannot reliably tell which agent is calling, or whether the protocol metadata it advertises was really published by whoever controls it. Narvaneni & Ravi Expires 23 April 2027 [Page 3] Internet-Draft agent-uri October 2026 Communication protocols already exist. [A2A] defines agent-to-agent interaction and an Agent Card; [MCP] defines how agents reach tools and publishes server metadata; OpenAPI describes HTTP APIs. Each of these describes _how to talk to_ an endpoint. None of them defines a portable answer to _who_ an agent is that works across all of them. This document defines that missing identity layer. Its *core* (Section 4 to Section 7) is: 1. *A name.* The agent URI (e.g., agent://example.com/planner) is a stable, human-readable identifier for an agent (Section 4). 2. *A document.* Every agent URI maps deterministically to an HTTPS URL that serves an Agent Identity Document listing the agent's claimed operator, public keys, and links to its protocol metadata (Section 5). 3. *An anchor.* The agent's keys are trusted because of where the document is served (the origin derived from the agent URI) or because of a Decentralized Identifier bound to the agent URI (Section 6). 4. *Statements.* The agent signs statements binding itself to specific protocol metadata, so that metadata can be hosted, mirrored, or indexed anywhere (Section 7). On top of the core, this document defines *profiles* that are deliberately separable and are expected to track related IETF work: * a request-signing profile of [WEB-BOT-AUTH] (Section 8); * an agent-instance profile that reuses the WIMSE Workload Identity Token format [WIMSE-CREDS] with AID-based trust (Section 9); and * OAuth 2.0 bindings (Section 10). 1.1. Design Principles * *Identify, do not invoke.* An agent URI names an agent. It is not a locator for an endpoint and carries no invocation parameters. * *Reuse before invent.* Every mechanism is a profile of an existing or in-progress standard: HTTPS and well-known URIs [RFC8615], JWK [RFC7517], JWS [RFC7515], HTTP Message Signatures [RFC9421] as profiled by [WEB-BOT-AUTH], the WIMSE Workload Identity Token format [WIMSE-CREDS], OAuth 2.0, and DIDs [DID-CORE]. Narvaneni & Ravi Expires 23 April 2027 [Page 4] Internet-Draft agent-uri October 2026 * *Anchor trust outside the document being verified.* A key is trusted because of the origin or DID it is published under, never because a document names it about itself. * *Separate the name from the long-lived identity when needed.* Domains change hands; agents get renamed and sold. The scheme supports a stable cryptographic identifier behind the human- readable name, with continuity for verifiers that have seen it before (Section 6.2). * *Authenticate keys, not claims.* Verification establishes control of keys anchored to an agent URI. Everything else an agent says about itself, including who operates it, remains a claim. * *Work for agents that live for seconds.* Most agent executions are ephemeral. Instances act under the identity of their agent without being individually published. 1.2. Non-Goals The following are explicitly out of scope: * Communication semantics, message formats, task lifecycles, and invocation. These belong to A2A, MCP, OpenAPI-described APIs, and similar protocols. * Capability, skill, or tool description. Protocol metadata documents (for example, an A2A Agent Card or an MCP server card) remain authoritative for these. * Transport bindings. * Verification of organizations. This document does not verify that the operator an agent claims is real or actually operates it. * Search, ranking, or registry services. This document makes identity verifiable so that any registry can index agents without being trusted. * Reputation, pricing, payments, and service levels. * Authorization policy. Knowing who an agent is does not grant it anything. Narvaneni & Ravi Expires 23 April 2027 [Page 5] Internet-Draft agent-uri October 2026 2. Conventions and Terminology 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. This document uses the terms "JSON object", "member", and "string" from [RFC8259], and "Dictionary", "Item", and "String" from [RFC9651]. Agent: A software system that acts autonomously or semi- autonomously, typically on behalf of a person or organization. Operator: The person or organization that an agent claims is accountable for it. Agent URI: An agent URI as defined in Section 4. The human-readable name of an agent. Agent Identity Document (AID): A JSON document, retrieved by dereferencing an agent URI, that lists the agent's claimed operator, keys, and links (Section 5). AID URL: The HTTPS URL that an agent URI maps to (Section 4.3). AID Origin: The tuple ("https", canonical host, effective port) of the AID URL, where the effective port is 443 when no port is present. Agent Key: A public key anchored to an agent (Section 6). Key Identifier: The JWK SHA-256 Thumbprint of an Agent Key (Section 5.2). Instance: A running, typically short-lived execution of an agent that holds its own key pair and acts under the agent's identity (Section 9). Verifier: Any party that checks an agent's identity: a website or API receiving requests, an authorization server, a registry, or another agent. 3. Overview Narvaneni & Ravi Expires 23 April 2027 [Page 6] Internet-Draft agent-uri October 2026 agent://example.com/planner (name) | | deterministic mapping v https://example.com/.well-known/agent/planner (AID URL) | +--------------------+---------------------+ | | | operator (claim) keys (JWK Set) links (rel, href) | | origin-anchored: trusted via HTTPS A2A Agent Card, DID-anchored: keys from DID document MCP server card, OAuth client metadata Figure 1: From agent URI to verifiable identity A typical verification, for a request received by an API: 1. The request carries an HTTP message signature and a Signature- Agent member whose value is the AID URL of agent://example.com/ planner. 2. The verifier derives the agent URI from the AID URL and retrieves the AID (or uses a cached copy). 3. The verifier finds the anchored key identified by the signature and verifies the signature and the request content. 4. The verifier now knows that the request was made by a holder of a key anchored to agent://example.com/planner. It also has the operator the agent _claims_, which it must not treat as verified (Section 13.3). Whether to serve the request remains a policy decision. 4. The agent URI Scheme 4.1. Syntax The following ABNF [RFC5234] uses fragment from [RFC3986] and ALPHA and DIGIT from [RFC5234]. Narvaneni & Ravi Expires 23 April 2027 [Page 7] Internet-Draft agent-uri October 2026 agent-uri = "agent://" agent-host [ name-path ] [ "#" fragment ] agent-host = dns-name [ ":" port ] dns-name = label 1*( "." label ) label = let-dig [ *61( let-dig / "-" ) let-dig ] let-dig = ALPHA / DIGIT port = %x31-39 *4DIGIT ; 1-65535, no leading zero name-path = 1*8( "/" name-segment ) name-segment = lc-let-dig [ *61( lc-let-dig / "-" ) lc-let-dig ] lc-let-dig = %x61-7A / DIGIT ; a-z, 0-9 Figure 2: ABNF for the agent URI Additional constraints: * dns-name MUST contain at least two labels (as required by the ABNF), MUST NOT exceed 253 octets, and its final label MUST contain at least one ALPHA character. This excludes IPv4 addresses in dotted-decimal form and single-label names such as localhost. * Internationalized domain names MUST be represented as A-labels [RFC5890] [RFC5891]. IP literals and userinfo are not permitted. * port MUST NOT exceed 65535. * An agent URI MUST NOT contain a query component. * An agent URI with an empty name-path (e.g., agent://planner.example.com) identifies the domain's root agent. Examples: * agent://example.com/planner * agent://planner.example.com * agent://example.com/acme/billing-assistant * agent://example.com/ planner#kPrK_qmxVWaYVA9wwBF6Iuo3vVzz7TxHCTwXBygrS4k (a reference to one of the agent's keys; see Section 4.4) 4.2. Normalization and Comparison The canonical form of an agent URI is produced by: Narvaneni & Ravi Expires 23 April 2027 [Page 8] Internet-Draft agent-uri October 2026 1. Lowercasing the scheme and dns-name. 2. Converting any U-labels to A-labels. 3. Removing a port equal to 443, and removing a ":" followed by an empty port. 4. Removing a single trailing "/" if present. Parsers MAY accept input that differs from the ABNF only by the deviations corrected above, and MUST normalize it. Any other deviation (uppercase in name-path, percent-encoding, dot-segments, a query, a trailing "." on the host) MUST be rejected. Two agent URIs identify the same agent if and only if their canonical forms, with any fragment removed, are identical octet strings. In particular, agent://example.com/planner and agent://planner.example.com are different agents, even if the same operator runs both. Agent URIs in AIDs, statements, credentials, and tokens MUST be in canonical form and MUST NOT contain a fragment, unless a fragment is explicitly permitted. 4.3. Dereferencing An agent URI is dereferenced by mapping it to its AID URL: https:///.well-known/agent (named agent) https:///.well-known/agent/_ (root agent) For example: Narvaneni & Ravi Expires 23 April 2027 [Page 9] Internet-Draft agent-uri October 2026 +=============================+====================================+ | Agent URI | AID URL | +=============================+====================================+ | agent://example.com/planner | https://example.com/.well- | | | known/agent/planner | +-----------------------------+------------------------------------+ | agent://example.com/acme/ | https://example.com/.well- | | billing-assistant | known/agent/acme/billing-assistant | +-----------------------------+------------------------------------+ | agent://planner.example.com | https://planner.example.com/.well- | | | known/agent/_ | +-----------------------------+------------------------------------+ | agent://example.com:8443/ | https://example.com:8443/.well- | | planner | known/agent/planner | +-----------------------------+------------------------------------+ Table 1: Agent URI to AID URL mapping The root agent uses the reserved segment _, which cannot appear in a name-segment. This allows the root AID and named AIDs to coexist on static file hosting. The mapping is purely syntactic and is reversible: an HTTPS URL is an AID URL if and only if it has no query or fragment and applying the reverse mapping yields an agent URI that is valid and canonical. No registry or index needs to be fetched to dereference an agent URI. 4.4. Fragments A fragment in an agent URI identifies an Agent Key by its Key Identifier (Section 5.2). No other fragment semantics are defined. 5. Agent Identity Document 5.1. Format An AID is a JSON object [RFC8259] served with media type application/ agent-id+json (Section 15.3). It has the following members: id: REQUIRED. String. The canonical agent URI that this document describes. operator: REQUIRED. Object stating who the agent claims is accountable for it, with members name (REQUIRED, string) and url (OPTIONAL, string, HTTPS URL). These values are self-asserted (Section 13.3). keys: REQUIRED for origin-anchored agents; MUST be absent for DID- Narvaneni & Ravi Expires 23 April 2027 [Page 10] Internet-Draft agent-uri October 2026 anchored agents. A JWK Set [RFC7517] containing the agent's public keys (Section 6.1). did: OPTIONAL. String. A DID [DID-CORE] whose DID document is the anchor for this agent's keys (Section 6.2). name: OPTIONAL. String. A display name for people. It has no identity semantics. status: OPTIONAL. String. One of "active" (default), "suspended", or "retired" (Section 6.3). links: OPTIONAL. Array of link objects (Section 5.4). updated: OPTIONAL. String. The time the document was last changed, as an RFC 3339 [RFC3339] timestamp. Members not defined here MUST be ignored by verifiers that do not understand them. Extension member names SHOULD be namespaced (e.g., "acme_tier") to avoid collision with future versions of this document. An AID MUST NOT exceed 64 KiB. 5.2. Key Identifiers Every Agent Key is identified by its *Key Identifier*: the base64url- encoded JWK SHA-256 Thumbprint [RFC7638] of the key, computed as specified in [RFC7638] for EC keys and in Appendix A.3 of [RFC8037] for OKP keys. This is the same identifier [WEB-BOT-AUTH] uses for keyid. Key Identifiers are used everywhere a key is named in this document: in the kid of JWKs in an AID, in agent URI fragments, in the JWS kid header of statements and Workload Identity Tokens, and in the keyid signature parameter of request signatures. Verifiers MUST compute the thumbprint of each candidate key themselves and select keys by comparing it with the presented Key Identifier. They MUST NOT rely on an operator-supplied kid or DID verification method id to select a key. For DID-anchored agents, each verification method is converted to a JWK before the thumbprint is computed: * a publicKeyJwk value is used as-is (private members MUST NOT be present); Narvaneni & Ravi Expires 23 April 2027 [Page 11] Internet-Draft agent-uri October 2026 * a publicKeyMultibase value that is a Multikey encoding of an Ed25519 public key (base58btc with the 0xed01 header, as defined in [CID]) is converted to an OKP JWK with "crv": "Ed25519"; and * verification methods in any other representation MAY be supported; those a verifier cannot convert are ignored. 5.3. Key Purposes Agent Keys are used for two purposes: Assertion: Signing Agent Statements (Section 7) and Workload Identity Tokens for instances (Section 9). Authentication: Signing HTTP requests directly as the agent (Section 8). For DID-anchored agents, a key is usable for assertion only if it is referenced from the DID document's assertionMethod relationship, and for authentication only if it is referenced from authentication [DID-CORE]. Verifiers MUST enforce these relationships. For origin-anchored agents, a JWK in keys MAY carry an agent_use member (Section 15.7): an array containing one or both of the strings "assertion" and "authentication". A key is usable only for the purposes listed; a key without agent_use is usable for both. Verifiers MUST enforce agent_use. A key whose agent_use is not an array of strings (for example, a bare string), or contains no recognized value, MUST be ignored; it is never treated as unrestricted. An AID in which two JWKs have the same Key Identifier MUST be rejected, so that purposes cannot be combined across entries for the same key material. Operators SHOULD give every key a single purpose, so that a key held by a running agent for request signing cannot mint Workload Identity Tokens or sign statements (Section 13.6). 5.4. Links Each link object has the following members, with the semantics of Web Linking [RFC8288]: rel: REQUIRED. String. A registered link relation type or a URI. href: REQUIRED. String. An absolute HTTPS URL. type: OPTIONAL. String. The media type of the target. statement: OPTIONAL. String. An Agent Statement (Section 7) about Narvaneni & Ravi Expires 23 April 2027 [Page 12] Internet-Draft agent-uri October 2026 the target. Link relations expected to be common include: +=======================+===================================+ | Relation | Target | +=======================+===================================+ | agent-card | The agent's [A2A] Agent Card | +-----------------------+-----------------------------------+ | mcp-server-card | The agent's [MCP] server metadata | +-----------------------+-----------------------------------+ | service-desc | An OpenAPI or other API | | | description [RFC9727] | +-----------------------+-----------------------------------+ | oauth-client-metadata | The agent's OAuth Client ID | | | Metadata Document (Section 10.1) | +-----------------------+-----------------------------------+ Table 2: Common link relations A link whose href has the *same origin as the AID Origin* is trusted to the same degree as the AID itself. To compare, the verifier lowercases the href host, converts it to A-labels, and uses port 443 if none is present; the result must equal the AID Origin exactly (Appendix A.4). No other normalization is applied; in particular, a trailing "." is not removed from the host. A link to any other origin MUST carry a statement, and verifiers MUST ignore cross-origin links without a valid statement (Section 7.1). Because verifier- initiated fetches never follow redirects (Section 13.4), a same- origin href cannot acquire the same-origin exemption for content served from another origin. For DID-anchored agents the same-origin exemption does not apply: every link MUST carry a statement signed with a key from the DID document's assertionMethod, and verifiers MUST ignore links without one. Otherwise whoever controls the origin could replace linked metadata, such as an OAuth client metadata document containing client keys, without holding any key authorized by the DID (Section 13.1). 5.5. Example Narvaneni & Ravi Expires 23 April 2027 [Page 13] Internet-Draft agent-uri October 2026 { "id": "agent://example.com/planner", "name": "Example Trip Planner", "operator": { "name": "Example Travel Ltd", "url": "https://example.com" }, "keys": { "keys": [ { "kty": "OKP", "crv": "Ed25519", "x": "11qYAYKxCrfVS_7TyWQHOg7hcvPapiMlrwIaaPcHURo", "kid": "kPrK_qmxVWaYVA9wwBF6Iuo3vVzz7TxHCTwXBygrS4k", "alg": "EdDSA", "use": "sig" } ] }, "links": [ { "rel": "agent-card", "href": "https://example.com/planner/agent-card.json", "type": "application/json" }, { "rel": "mcp-server-card", "href": "https://cdn.example.net/planner/server.json", "statement": "eyJ0eXAiOiJhZ2VudC1zdGF0ZW1lbnQrand0Ii..." }, { "rel": "oauth-client-metadata", "href": "https://example.com/planner/oauth-client.json" } ], "updated": "2026-10-20T09:00:00Z" } Figure 3: Example Agent Identity Document (origin-anchored) 5.6. Retrieval and Validation To obtain the AID for an agent URI, a verifier: 1. Parses and canonicalizes the agent URI (Section 4.2), rejecting it on failure. 2. Constructs the AID URL (Section 4.3). Narvaneni & Ravi Expires 23 April 2027 [Page 14] Internet-Draft agent-uri October 2026 3. Applies the fetch policy of Section 13.4. 4. Sends an HTTPS GET with Accept: application/agent-id+json, validating the server certificate for dns-name. 5. Treats any status code other than 200 (OK) [RFC9110], and other than 304 (Not Modified) received in response to a conditional request revalidating a cached copy [RFC9111], as a retrieval failure. Redirects are always failures. 6. Rejects responses larger than 64 KiB, or that are not valid JSON objects. Verifiers MUST NOT reject a response solely because its media type is application/json (to support static hosting) but MUST reject any other media type. 7. Rejects the document unless its id member is identical to the canonical agent URI. 8. Performs the anchoring checks of Section 6, including the DID binding and pinning checks of Section 6.2 when applicable. Verifiers SHOULD cache AIDs according to HTTP caching [RFC9111]. Operators SHOULD NOT set a freshness lifetime longer than 24 hours, so that key removal takes effect promptly (Section 6.3). Verifiers SHOULD cache failures for a short period to limit repeated fetches. 6. Anchoring An Agent Key is _anchored_ when the verifier has established that whoever controls the agent URI published it. This document defines two anchoring modes. An AID uses exactly one. 6.1. Origin-Anchored Agents The AID contains keys and no did. The keys are anchored by the HTTPS retrieval of Section 5.6: control of the AID Origin is control of the agent's identity. Each JWK in keys MUST: * contain only public key parameters; * have a kid equal to its Key Identifier (Section 5.2); * have an alg member; and * be usable for signatures ("use": "sig", or a key_ops containing "verify"). Narvaneni & Ravi Expires 23 April 2027 [Page 15] Internet-Draft agent-uri October 2026 Implementations MUST support EdDSA (Ed25519) and ES256. Algorithms MUST be restricted as described in [RFC8725]; in particular, none and symmetric algorithms MUST NOT be accepted. This mode needs nothing beyond a web server. Its weakness is that identity is exactly as durable as control of the domain (Section 13.2). 6.2. DID-Anchored Agents The AID contains a did member and no keys. The agent's keys are the verification methods of the DID document, with the purposes defined in Section 5.3. The binding between the agent URI and the DID MUST be bidirectional: * the AID retrieved for the agent URI names the DID in did; and * the DID document lists the canonical agent URI in its alsoKnownAs property [DID-CORE]. Verifiers MUST check both directions and MUST treat the agent as unverified if either is missing. *Pinning.* A verifier that has previously verified an agent URI as DID-anchored and recorded its DID MUST NOT attribute a later AID for that agent URI to the same agent unless it names the same DID. An AID that is origin-anchored or names a different DID MUST be treated as a different identity (for example, by rejecting it, or by treating it as a new agent with no history), not as a key rotation. Verifiers that record identities SHOULD record the DID. *Continuity and its limits.* For a verifier that has pinned the DID, DID anchoring preserves identity across a rename or domain move: the operator publishes an AID under the new agent URI and adds that URI to alsoKnownAs. For a verifier with no prior state, DID anchoring gives no more assurance than origin anchoring, because whoever controls the agent URI's origin can publish an origin-anchored AID instead (Section 13.1). Narvaneni & Ravi Expires 23 April 2027 [Page 16] Internet-Draft agent-uri October 2026 *DID methods.* A DID whose resolution depends on the same host as the agent URI (for example, did:web on that host) adds no independence from the origin. Operators SHOULD NOT use such a DID for DID anchoring, and verifiers MUST NOT treat it as providing assurance beyond origin anchoring. DID methods that support verifiable key- rotation history (for example, [DID-WEBVH] hosted independently of the agent URI's host) are RECOMMENDED. Verifiers MUST maintain an allowlist of DID methods they support and MUST reject any other method. Network requests made by DID resolvers are subject to Section 13.4. 6.3. Lifecycle, Rotation, and Revocation Removing a key from the AID (or DID document) revokes it: every statement and Workload Identity Token it signed stops verifying once verifiers' cached copies expire. Rotation and revocation are therefore the same operation, and operators rotate as follows: 1. Publish the new key alongside the old one. 2. Re-issue all statements and credentials signed by the old key, including statements carried in AIDs copied by mirrors and registries. 3. Remove the old key once re-issued statements have propagated. Statements about metadata that changes SHOULD carry an exp so that copies held by third parties are refreshed regularly. If status is "suspended" or "retired", verifiers MUST treat all signatures, statements, and credentials from the agent as invalid. A retired agent URI SHOULD NOT be reassigned to a different agent. Operators that need auditable key history MAY additionally record their AIDs and statements in a transparency service [RFC9943]. This document does not require it. 7. Agent Statements An Agent Statement is a JWS [RFC7515] in compact serialization, signed with an Agent Key usable for assertion, that binds the agent to a specific version of a resource such as an Agent Card. It allows protocol metadata to be served from any origin, mirrored, or included in registries without losing its link to the agent. The JWS Protected Header MUST contain: * typ: "agent-statement+jwt"; Narvaneni & Ravi Expires 23 April 2027 [Page 17] Internet-Draft agent-uri October 2026 * alg: the algorithm of the signing key; * kid: the Key Identifier of the signing key (Section 5.2). The payload is a JWT Claims Set [RFC7519] with: iss: REQUIRED. The canonical agent URI, without a fragment. sub: REQUIRED. The URL of the resource the statement is about. resource_digest: REQUIRED. An object with members alg ("sha-256"), canon ("jcs" or "none"), and value (the base64url-encoded digest). With "jcs", the digest is computed over the resource canonicalized per [RFC8785]; with "none", over the exact bytes of the representation. iat: REQUIRED. Issue time. exp: OPTIONAL. Expiry time. 7.1. Verification To verify a statement carried in a link of an AID, a verifier: 1. Checks that typ is "agent-statement+jwt". 2. Checks that iss is identical to the AID's id, and checks the AID's status (Section 6.3). 3. Checks that sub is identical to the link's href. A statement whose sub differs MUST be rejected, even if it is otherwise valid. 4. Selects an anchored key usable for assertion whose Key Identifier equals kid, and verifies the signature. 5. Checks iat and, if present, exp. 6. Obtains the resource at sub, either by fetching it under the policy of Section 13.4 or by using a copy, and compares its digest with resource_digest. Statements obtained other than through an AID link (for example, from a registry) are verified in the same way, except that step 2 uses the AID retrieved for iss and step 3 compares sub with the URL the verifier intends to use. Narvaneni & Ravi Expires 23 April 2027 [Page 18] Internet-Draft agent-uri October 2026 A statement protects only the bytes of the resource it names. It does not extend to other resources that resource refers to, such as a jwks_uri in OAuth client metadata: each such resource needs its own statement before it can be relied on with the same assurance. Protocol metadata documents that support extension fields SHOULD include a reference back to the agent URI, so that a client starting from the metadata can find the identity. How that reference is expressed is defined by each protocol (see Appendix B). 8. Profile: Request Signing 8.1. Signing An agent proves its identity on an HTTP request by signing it as specified in [WEB-BOT-AUTH], with the additional requirements in this section. A request signed this way is a conforming [WEB-BOT-AUTH] request; this profile adds a new Signature-Agent member type and constrains the signature further. The request MUST include a Signature-Agent Dictionary member, keyed by the signature label, whose value is the AID URL derived from the agent's canonical agent URI (Section 4.3) and which carries the parameter type=agent-id: Signature-Agent: sig1="https://example.com/.well-known/agent/planner" ;type=agent-id Figure 4: Signature-Agent member (line break for display only) The signature MUST: * cover @method, @authority, @target-uri, and "signature- agent";key="