<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type='text/xsl' href='rfc2629.xslt' ?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude"
     ipr="trust200902"
     docName="draft-gudlab-agentid-protocol-00"
     category="std"
     submissionType="IETF"
     consensus="true"
     tocInclude="true"
     sortRefs="true"
     symRefs="true"
     version="3">

  <front>
    <title abbrev="AgentID Protocol">AgentID: An Identity Protocol for Autonomous AI Agents</title>

    <seriesInfo name="Internet-Draft" value="draft-gudlab-agentid-protocol-00"/>

    <author fullname="Tim Uzua" initials="T." surname="Uzua">
      <organization>GudLab</organization>
      <address>
        <email>tim@gudlab.org</email>
        <uri>https://gudlab.org</uri>
      </address>
    </author>

    <date year="2026" month="March" day="14"/>

    <area>Security</area>
    <workgroup>Web Authorization Protocol</workgroup>

    <keyword>agent identity</keyword>
    <keyword>AI agent</keyword>
    <keyword>authentication</keyword>
    <keyword>JWT</keyword>
    <keyword>delegation</keyword>
    <keyword>MCP</keyword>

    <abstract>
      <t>This document defines the AgentID Protocol, an open standard for
      establishing, verifying, and managing the identity of autonomous AI
      agents operating across the Internet. As AI agents increasingly
      interact with web services, APIs, and each other on behalf of humans
      and organisations, the industry lacks a universal mechanism to
      determine which agent is making a request, who is accountable for
      it, and what it is permitted to do.</t>

      <t>AgentID introduces the Agent Identity Token (AIT), a signed JWT
      carrying agent identity, owner verification, capability, and
      delegation chain claims. The protocol defines agent registration,
      owner verification levels, service-side access tiers, and
      transparent delegation chains with scope attenuation. It builds on
      existing standards including OAuth 2.0, OpenID Connect, JSON Web
      Token (JWT), and JSON Web Key (JWK), adapting them to the unique
      requirements of non-human autonomous actors.</t>
    </abstract>
  </front>

  <middle>
    <!-- ============================================================ -->
    <section anchor="introduction">
      <name>Introduction</name>

      <t>Today's Internet authentication infrastructure was designed for
      humans interacting with services through browsers. OAuth 2.0
      <xref target="RFC6749"/> enables a user to grant an application
      limited access to their resources. OpenID Connect
      <xref target="OpenID.Core"/> enables a user to prove their identity
      across services. Neither protocol was designed for autonomous
      software agents that:</t>

      <ul>
        <li>Operate independently without a human in the loop</li>
        <li>Chain together in multi-step workflows where Agent A
        dispatches tasks to Agent B</li>
        <li>Make decisions and take actions at machine speed on behalf of
        principals who may not be present</li>
      </ul>

      <t>The result is a proliferation of ad-hoc solutions: raw API keys
      with no ownership tracing, OAuth tokens repurposed beyond their
      design intent, workload identity frameworks such as
      <xref target="SPIFFE"/> that address service-to-service
      authentication but not agent-specific concerns like owner
      accountability and delegation chains, and proprietary agent
      authentication schemes that fragment the ecosystem.</t>

      <t>AgentID addresses this gap by providing a lightweight,
      cryptographically secure identity layer purpose-built for
      autonomous AI agents. It answers three questions that no existing
      standard addresses comprehensively:</t>

      <ol>
        <li>Which agent is this?</li>
        <li>Who is accountable for it?</li>
        <li>What is it permitted to do?</li>
      </ol>

      <section anchor="terminology">
        <name>Terminology</name>

        <t>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
        <xref target="RFC2119"/>
        <xref target="RFC8174"/>
        when, and only when, they appear in all capitals, as shown
        here.</t>

        <dl>
          <dt>Agent</dt>
          <dd>An autonomous software system that interacts with services
          on behalf of a principal (human user or another agent).</dd>

          <dt>Agent Identity Token (AIT)</dt>
          <dd>A signed JWT that an agent presents to authenticate itself
          to a service.</dd>

          <dt>Owner</dt>
          <dd>The human or organisation legally accountable for an
          agent's actions.</dd>

          <dt>Principal</dt>
          <dd>The entity on whose behalf an agent acts. May be a user,
          an organisation, or another agent.</dd>

          <dt>Delegation Chain</dt>
          <dd>The ordered sequence of principals and agents through which
          authority was delegated, from the original authoriser to the
          acting agent.</dd>

          <dt>Registry</dt>
          <dd>A service that stores agent identities, public keys, and
          owner verification records.</dd>

          <dt>Scope Attenuation</dt>
          <dd>The principle that each link in a delegation chain can only
          have equal or fewer permissions than the previous link.</dd>

          <dt>Verification Level</dt>
          <dd>A numeric indicator (0-3) of the rigour of identity
          verification performed on an agent's owner.</dd>
        </dl>
      </section>
    </section>

    <!-- ============================================================ -->
    <section anchor="threat-model">
      <name>Threat Model</name>

      <t>Without a standardised agent identity layer, services face the
      following threats:</t>

      <dl>
        <dt>Unattributable Abuse</dt>
        <dd>An anonymous agent submits large volumes of spam, books fake
        appointments, or scrapes content. The service has no way to
        trace the actor or hold anyone accountable.</dd>

        <dt>Impersonation</dt>
        <dd>A malicious agent claims to act on behalf of a reputable
        organisation without any verifiable proof.</dd>

        <dt>Privilege Escalation</dt>
        <dd>An agent granted read access to a resource exploits loose
        controls to perform write or delete operations.</dd>

        <dt>Delegation Opacity</dt>
        <dd>Agent A spawns Agent B which spawns Agent C. A service
        receiving a request from Agent C has no visibility into the
        delegation chain or the original authorising principal.</dd>

        <dt>Rate-Limit Evasion</dt>
        <dd>Without stable agent identity, rate limiting falls back to
        IP addresses, which agents trivially rotate.</dd>
      </dl>
    </section>

    <!-- ============================================================ -->
    <section anchor="requirements">
      <name>Protocol Requirements</name>

      <t>The protocol MUST satisfy the following requirements:</t>

      <ol>
        <li><strong>Verifiable Identity:</strong> A service MUST be able
        to cryptographically verify an agent's identity without a
        synchronous call to a central authority.</li>

        <li><strong>Owner Accountability:</strong> Every agent identity
        MUST be traceable to a verified human or organisational
        owner.</li>

        <li><strong>Granular Access Control:</strong> Services MUST be
        able to define policies based on agent identity, owner identity,
        verification level, and declared capabilities.</li>

        <li><strong>Delegation Transparency:</strong> When an agent acts
        on behalf of another agent or a human, the full chain of
        delegation MUST be inspectable.</li>

        <li><strong>Revocability:</strong> Compromised or abusive agent
        identities MUST be revocable in real time.</li>

        <li><strong>Interoperability:</strong> The protocol MUST work
        across agent frameworks, programming languages, and deployment
        models.</li>

        <li><strong>Performance:</strong> Token verification MUST be
        possible offline using cached public keys, with registry lookups
        reserved for enhanced checks.</li>
      </ol>
    </section>

    <!-- ============================================================ -->
    <section anchor="ait">
      <name>Agent Identity Token (AIT)</name>

      <t>The Agent Identity Token is a signed JSON Web Token (JWT)
      conforming to <xref target="RFC7519"/>, with a custom claim set
      designed for agent identification. The token is self-contained:
      any service with access to the issuer's public key can verify the
      token without contacting the registry.</t>

      <section anchor="ait-header">
        <name>Token Header</name>

        <t>The AIT JOSE header MUST contain the following parameters:</t>

        <dl>
          <dt>alg</dt>
          <dd>REQUIRED. MUST be "ES256" (ECDSA using P-256 and
          SHA-256, per <xref target="RFC7518"/> Section 3.4).</dd>

          <dt>typ</dt>
          <dd>REQUIRED. MUST be "AIT+jwt".</dd>

          <dt>kid</dt>
          <dd>REQUIRED. Key identifier for key rotation, corresponding
          to a key in the registry's JWKS
          <xref target="RFC7517"/>.</dd>
        </dl>

        <figure>
          <name>AIT Header Example</name>
          <sourcecode type="json"><![CDATA[
{
  "alg": "ES256",
  "typ": "AIT+jwt",
  "kid": "agentidp-2026-03-01"
}
]]></sourcecode>
        </figure>
      </section>

      <section anchor="ait-claims">
        <name>Token Claims</name>

        <t>The AIT payload contains the following claims organised
        into four groups:</t>

        <section anchor="identity-claims">
          <name>Identity Claims</name>
          <dl>
            <dt>agent_id</dt>
            <dd>REQUIRED. String. Globally unique agent identifier
            assigned by the registry.</dd>

            <dt>agent_name</dt>
            <dd>REQUIRED. String. Human-readable name of the agent.</dd>

            <dt>agent_version</dt>
            <dd>RECOMMENDED. String. Semantic version of the agent
            software.</dd>

            <dt>agent_description</dt>
            <dd>OPTIONAL. String. Brief description of the agent's
            purpose.</dd>
          </dl>
        </section>

        <section anchor="owner-claims">
          <name>Owner Claims</name>
          <dl>
            <dt>owner_id</dt>
            <dd>REQUIRED. String. Unique identifier for the agent's
            owner in the registry.</dd>

            <dt>owner_type</dt>
            <dd>REQUIRED. String. Either "person" or "org".</dd>

            <dt>owner_name</dt>
            <dd>REQUIRED. String. Display name of the owner.</dd>

            <dt>verification_level</dt>
            <dd>REQUIRED. Integer (0-3). See
            <xref target="verification-levels"/>.</dd>
          </dl>
        </section>

        <section anchor="capability-claims">
          <name>Capability Claims</name>
          <dl>
            <dt>capabilities</dt>
            <dd>OPTIONAL. Array of strings. Declared capabilities
            using the namespace convention defined in
            <xref target="capability-namespace"/>.</dd>
          </dl>
        </section>

        <section anchor="delegation-claims">
          <name>Delegation Claims</name>
          <dl>
            <dt>delegation_chain</dt>
            <dd>OPTIONAL. Array of delegation objects. See
            <xref target="delegation"/>.</dd>
          </dl>
        </section>

        <section anchor="standard-claims">
          <name>Standard JWT Claims</name>
          <dl>
            <dt>iss</dt>
            <dd>REQUIRED. String. The registry URL that issued the
            agent identity.</dd>

            <dt>sub</dt>
            <dd>REQUIRED. String. Same value as agent_id.</dd>

            <dt>aud</dt>
            <dd>RECOMMENDED. String. The target service URL.</dd>

            <dt>iat</dt>
            <dd>REQUIRED. NumericDate. Time at which the token was
            issued.</dd>

            <dt>exp</dt>
            <dd>REQUIRED. NumericDate. Expiration time. MUST NOT
            exceed 24 hours after iat. A lifetime of 1 hour or less
            is RECOMMENDED for high-security contexts.</dd>

            <dt>jti</dt>
            <dd>REQUIRED. String. Unique token identifier for replay
            prevention.</dd>
          </dl>
        </section>
      </section>

      <section anchor="ait-example">
        <name>AIT Example</name>
        <t>The following is an example AIT payload:</t>
        <figure>
          <name>AIT Payload Example</name>
          <sourcecode type="json"><![CDATA[
{
  "agent_id": "ag_7xK9m2nP4qRtL8",
  "agent_name": "AcmeBookingAgent",
  "agent_version": "1.2.0",
  "owner_id": "own_T1mR4xBq9",
  "owner_type": "org",
  "owner_name": "Acme Inc",
  "verification_level": 2,
  "capabilities": ["calendar:read", "calendar:write"],
  "delegation_chain": [{
    "principal_type": "user",
    "principal_id": "usr_abc123",
    "granted_at": "2026-03-01T10:00:00Z",
    "scopes": ["calendar:read"]
  }],
  "iss": "https://registry.agentidp.dev",
  "sub": "ag_7xK9m2nP4qRtL8",
  "aud": "https://api.example.com",
  "iat": 1740000000,
  "exp": 1740003600,
  "jti": "tok_unique_nonce_123"
}
]]></sourcecode>
        </figure>
      </section>

      <section anchor="crypto">
        <name>Cryptographic Requirements</name>

        <t>All Agent Identity Tokens MUST be signed using ES256
        (ECDSA with the P-256 curve and SHA-256) as defined in
        <xref target="RFC7518"/> Section 3.4. This algorithm provides
        strong security with compact signatures suitable for
        high-frequency agent-to-service communication.</t>

        <t>Agent key pairs are generated during registration and the
        public key is published via the registry's JWKS endpoint
        <xref target="RFC7517"/>. Services verify tokens by fetching
        the public key from the JWKS endpoint, with aggressive caching
        (RECOMMENDED TTL: 24 hours).</t>
      </section>

      <section anchor="token-lifetime">
        <name>Token Lifetime</name>

        <t>AIT tokens MUST have a maximum lifetime of 24 hours (the
        difference between exp and iat MUST NOT exceed 86400 seconds).
        For high-security contexts, a lifetime of 1 hour or less is
        RECOMMENDED. Short-lived tokens limit the blast radius of key
        compromise. Agents MUST implement automatic token refresh
        using their private key.</t>
      </section>
    </section>

    <!-- ============================================================ -->
    <section anchor="verification-levels">
      <name>Owner Verification Levels</name>

      <t>The protocol defines four verification levels providing
      increasing assurance about the agent owner's identity. Services
      can set minimum verification requirements per endpoint.</t>

      <dl>
        <dt>Level 0 - Unverified</dt>
        <dd>Email address confirmed only. Suitable for testing,
        development, and open-access services.</dd>

        <dt>Level 1 - Email</dt>
        <dd>Email and phone verification. Suitable for low-risk
        public services.</dd>

        <dt>Level 2 - Domain</dt>
        <dd>DNS TXT record or well-known file verification at the
        owner's domain. Suitable for business APIs and partner
        integrations.</dd>

        <dt>Level 3 - Organisation</dt>
        <dd>Know Your Business (KYB) verification including company
        registration and legal entity verification. Suitable for
        financial services, healthcare, and regulated industries.</dd>
      </dl>
    </section>

    <!-- ============================================================ -->
    <section anchor="registration">
      <name>Agent Registration</name>

      <t>Agent registration is a two-phase process: owner verification
      (performed once) followed by agent creation (performed per
      agent). A single verified owner MAY register multiple agents.</t>

      <section anchor="owner-registration">
        <name>Phase 1: Owner Registration</name>
        <ol>
          <li>Owner registers at an AgentID-compliant registry with
          email and authenticating credentials.</li>
          <li>Owner completes verification to their desired level
          (email, domain DNS, or KYB document submission).</li>
          <li>Registry issues an owner_id and management
          credentials.</li>
        </ol>
      </section>

      <section anchor="agent-creation">
        <name>Phase 2: Agent Creation</name>
        <ol>
          <li>Owner calls POST /v1/agents with agent name, description,
          and declared capabilities.</li>
          <li>Registry generates an ES256 key pair, stores the public
          key, and returns the agent_id, private key (in JWK format
          per <xref target="RFC7517"/>), and the kid.</li>
          <li>Agent uses the private key to self-sign AIT tokens. The
          private key MUST NOT be retained by the registry after
          delivery to the owner.</li>
        </ol>

        <t>Owners MUST immediately store the agent private key in a
        secure secrets manager. If the private key is lost, the agent
        MUST be re-registered with a new key pair.</t>
      </section>
    </section>

    <!-- ============================================================ -->
    <section anchor="access-tiers">
      <name>Service-Side Access Control</name>

      <t>Services consuming AgentID tokens implement access policies
      based on the claims present in the AIT. The protocol defines
      three standard access tiers:</t>

      <dl>
        <dt>Open</dt>
        <dd>Any agent may access. No AIT required. Rate limiting is
        IP-based only. Suitable for public read-only endpoints.</dd>

        <dt>Authenticated</dt>
        <dd>A valid AIT from any registered agent is required. Token
        signature and revocation status are verified. Rate limiting
        is per agent_id. Suitable for general-purpose APIs.</dd>

        <dt>Permissioned</dt>
        <dd>A valid AIT is required AND the agent_id or owner_id
        MUST be on an explicit allowlist maintained by the service.
        Rate limiting is per agent_id. Suitable for partner
        integrations and sensitive data.</dd>
      </dl>

      <section anchor="policy-expression">
        <name>Policy Expression</name>

        <t>Services define policies as a set of rules evaluated
        against AIT claims. The protocol RECOMMENDS the following
        policy structure:</t>

        <figure>
          <name>Access Policy Example</name>
          <sourcecode type="json"><![CDATA[
{
  "resource": "/api/bookings",
  "access_tier": "authenticated",
  "min_verification_level": 2,
  "required_capabilities": ["calendar:write"],
  "rate_limit": {
    "requests_per_hour": 100,
    "scope": "agent_id"
  },
  "allowlist": null,
  "denylist": ["ag_known_bad_actor"]
}
]]></sourcecode>
        </figure>
      </section>
    </section>

    <!-- ============================================================ -->
    <section anchor="delegation">
      <name>Delegation Chain</name>

      <t>When Agent A instructs Agent B to perform an action, or when
      a human user authorises an agent to act on their behalf, the
      delegation chain is encoded in the AIT so that the receiving
      service can inspect the full provenance of the request.</t>

      <section anchor="delegation-structure">
        <name>Delegation Chain Structure</name>

        <t>The delegation_chain claim is an ordered array of delegation
        objects, from the original principal (index 0) to the most
        recent delegator. Each entry records who delegated, when, and
        with what scope restrictions.</t>

        <figure>
          <name>Delegation Chain Example</name>
          <sourcecode type="json"><![CDATA[
{
  "delegation_chain": [
    {
      "principal_type": "user",
      "principal_id": "usr_john_abc",
      "granted_at": "2026-03-01T10:00:00Z",
      "scopes": ["calendar:read", "calendar:write"],
      "evidence": "oauth2:token_exchange"
    },
    {
      "principal_type": "agent",
      "principal_id": "ag_orchestrator_1",
      "granted_at": "2026-03-01T10:00:05Z",
      "scopes": ["calendar:read"],
      "evidence": "ait:delegation"
    }
  ]
}
]]></sourcecode>
        </figure>

        <t>Each delegation object contains:</t>

        <dl>
          <dt>principal_type</dt>
          <dd>REQUIRED. String. Either "user" or "agent".</dd>

          <dt>principal_id</dt>
          <dd>REQUIRED. String. Identifier of the delegating
          principal.</dd>

          <dt>granted_at</dt>
          <dd>REQUIRED. String (datetime). When the delegation was
          granted.</dd>

          <dt>scopes</dt>
          <dd>REQUIRED. Array of strings. The scopes granted in
          this delegation step.</dd>

          <dt>evidence</dt>
          <dd>OPTIONAL. String. Reference to the mechanism used to
          establish the delegation (e.g., "oauth2:token_exchange"
          per <xref target="RFC8693"/>, "ait:delegation").</dd>
        </dl>
      </section>

      <section anchor="scope-attenuation">
        <name>Scope Attenuation</name>

        <t>Each link in the delegation chain MUST have scopes that are
        equal to or a strict subset of the previous link's scopes. A
        delegate MUST NOT grant more permissions than it received.
        This is enforced by both the issuing agent (when constructing
        the token) and the verifying service (when validating
        claims).</t>

        <t>If a verifying service detects a scope attenuation
        violation, it MUST reject the token with error code
        AID-009 (DELEGATION_INVALID).</t>
      </section>
    </section>

    <!-- ============================================================ -->
    <section anchor="registry">
      <name>Agent Registry</name>

      <t>The Agent Registry is the trust anchor of the AgentID
      ecosystem. It stores agent public keys, owner verification
      records, and revocation status.</t>

      <section anchor="registry-api">
        <name>Registry API</name>

        <t>A compliant registry MUST implement the following
        endpoints:</t>

        <table>
          <thead>
            <tr><th>Method</th><th>Endpoint</th><th>Description</th></tr>
          </thead>
          <tbody>
            <tr><td>POST</td><td>/v1/owners</td><td>Register a new owner</td></tr>
            <tr><td>POST</td><td>/v1/owners/{id}/verify</td><td>Submit verification evidence</td></tr>
            <tr><td>POST</td><td>/v1/agents</td><td>Register a new agent</td></tr>
            <tr><td>GET</td><td>/v1/agents/{agent_id}</td><td>Public agent lookup</td></tr>
            <tr><td>GET</td><td>/v1/agents/{agent_id}/public-key</td><td>Fetch agent public key (JWK)</td></tr>
            <tr><td>DELETE</td><td>/v1/agents/{agent_id}</td><td>Revoke an agent</td></tr>
            <tr><td>GET</td><td>/.well-known/jwks.json</td><td>Registry JWKS endpoint</td></tr>
            <tr><td>GET</td><td>/v1/agents/{agent_id}/status</td><td>Real-time revocation check</td></tr>
          </tbody>
        </table>
      </section>

      <section anchor="revocation">
        <name>Revocation</name>

        <t>Agent revocation MUST be immediate. When an owner revokes an
        agent or the registry suspends one, the agent status is set to
        "revoked".</t>

        <ul>
          <li>Services implementing real-time checks SHOULD call the
          status endpoint.</li>
          <li>Services relying on cached public keys SHOULD implement
          a maximum cache TTL of 1 hour and MUST honour Cache-Control
          headers returned by the registry.</li>
        </ul>
      </section>
    </section>

    <!-- ============================================================ -->
    <section anchor="oauth-integration">
      <name>Relationship to OAuth 2.0</name>

      <t>AgentID is designed to complement, not replace, OAuth 2.0
      <xref target="RFC6749"/>. For services that already use OAuth
      for user authentication, AgentID adds the agent identity layer.
      A typical integration pattern is:</t>

      <ol>
        <li>The user grants an OAuth token to the agent (user
        delegation).</li>
        <li>The agent includes the OAuth grant reference in the AIT
        delegation chain via the "evidence" field
        (e.g., "oauth2:token_exchange").</li>
        <li>The service verifies both the agent's identity (AgentID)
        and the user's authorisation (OAuth).</li>
      </ol>

      <t>This layered approach allows services to answer "which agent
      is this?" (AgentID) independently from "what is this user
      allowing?" (OAuth), providing complete request provenance.</t>
    </section>

    <!-- ============================================================ -->
    <section anchor="security">
      <name>Security Considerations</name>

      <section anchor="key-management">
        <name>Key Management</name>
        <t>Agent private keys MUST be stored in hardware security
        modules (HSMs) or cloud secret managers in production. Key
        rotation is supported via key versioning: owners can generate
        a new key pair without changing the agent_id. Both old and new
        keys are valid during a configurable overlap period (default:
        72 hours).</t>
      </section>

      <section anchor="replay-prevention">
        <name>Replay Prevention</name>
        <t>Every AIT includes a unique jti claim. Services SHOULD
        maintain a jti cache (e.g., with TTL matching token expiry)
        and reject tokens with previously seen jti values. For
        stateless verification, the short token lifetime provides an
        acceptable trade-off.</t>
      </section>

      <section anchor="abuse-mitigation">
        <name>Abuse Mitigation</name>
        <t>Registries SHOULD implement automated abuse detection
        monitoring for anomalous patterns. Services can report abusive
        agent_ids to the registry. A graduated response model is
        RECOMMENDED: warning, temporary suspension, permanent
        revocation, owner-level ban.</t>
      </section>

      <section anchor="privacy">
        <name>Privacy Considerations</name>
        <t>Registries store owner identity information subject to
        applicable data protection regulations (GDPR, etc.). Owner
        personal data MUST NOT be exposed via the public agent lookup
        API unless the owner explicitly opts in. The minimum public
        disclosure is: owner_type, verification_level, and (for
        Level 2+) verified_domain.</t>
      </section>
    </section>

    <!-- ============================================================ -->
    <section anchor="iana">
      <name>IANA Considerations</name>

      <section anchor="media-type">
        <name>Media Type Registration</name>
        <t>This document requests registration of the "AIT+jwt" media
        type subtype in the "JSON Web Token Types" sub-registry of the
        "JSON Web Token (JWT)" registry.</t>

        <dl>
          <dt>Type name:</dt><dd>AIT+jwt</dd>
          <dt>Subtype name:</dt><dd>N/A</dd>
          <dt>Required parameters:</dt><dd>N/A</dd>
          <dt>Optional parameters:</dt><dd>N/A</dd>
          <dt>Reference:</dt><dd>This document</dd>
        </dl>
      </section>

      <section anchor="jwt-claims-reg">
        <name>JWT Claims Registration</name>
        <t>This document requests registration of the following claims
        in the "JSON Web Token Claims" registry:</t>

        <ul>
          <li>agent_id - Globally unique agent identifier</li>
          <li>agent_name - Human-readable agent name</li>
          <li>agent_version - Agent software version</li>
          <li>agent_description - Agent purpose description</li>
          <li>owner_id - Agent owner identifier</li>
          <li>owner_type - Owner type (person or org)</li>
          <li>owner_name - Owner display name</li>
          <li>verification_level - Owner verification level (0-3)</li>
          <li>delegation_chain - Delegation provenance chain</li>
        </ul>
      </section>
    </section>
  </middle>

  <back>
    <references>
      <name>References</name>

      <references>
        <name>Normative References</name>

        <reference anchor="RFC2119" target="https://www.rfc-editor.org/info/rfc2119">
          <front><title>Key words for use in RFCs to Indicate Requirement Levels</title>
          <author fullname="S. Bradner"/><date year="1997" month="March"/></front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
        </reference>

        <reference anchor="RFC8174" target="https://www.rfc-editor.org/info/rfc8174">
          <front><title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
          <author fullname="B. Leiba"/><date year="2017" month="May"/></front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
        </reference>

        <reference anchor="RFC7519" target="https://www.rfc-editor.org/info/rfc7519">
          <front><title>JSON Web Token (JWT)</title>
          <author fullname="M. Jones"/><author fullname="J. Bradley"/><author fullname="N. Sakimura"/>
          <date year="2015" month="May"/></front>
          <seriesInfo name="RFC" value="7519"/>
        </reference>

        <reference anchor="RFC7517" target="https://www.rfc-editor.org/info/rfc7517">
          <front><title>JSON Web Key (JWK)</title>
          <author fullname="M. Jones"/><date year="2015" month="May"/></front>
          <seriesInfo name="RFC" value="7517"/>
        </reference>

        <reference anchor="RFC7518" target="https://www.rfc-editor.org/info/rfc7518">
          <front><title>JSON Web Algorithms (JWA)</title>
          <author fullname="M. Jones"/><date year="2015" month="May"/></front>
          <seriesInfo name="RFC" value="7518"/>
        </reference>

        <reference anchor="RFC6749" target="https://www.rfc-editor.org/info/rfc6749">
          <front><title>The OAuth 2.0 Authorization Framework</title>
          <author fullname="D. Hardt"/><date year="2012" month="October"/></front>
          <seriesInfo name="RFC" value="6749"/>
        </reference>
      </references>

      <references>
        <name>Informative References</name>

        <reference anchor="OpenID.Core" target="https://openid.net/specs/openid-connect-core-1_0.html">
          <front><title>OpenID Connect Core 1.0</title>
          <author fullname="N. Sakimura"/><author fullname="J. Bradley"/>
          <author fullname="M. Jones"/><author fullname="B. de Medeiros"/>
          <author fullname="C. Mortimore"/>
          <date year="2014" month="November"/></front>
        </reference>

        <reference anchor="RFC8693" target="https://www.rfc-editor.org/info/rfc8693">
          <front><title>OAuth 2.0 Token Exchange</title>
          <author fullname="M. Jones"/><author fullname="A. Nadalin"/>
          <author fullname="B. Campbell"/><author fullname="J. Bradley"/>
          <author fullname="C. Mortimore"/>
          <date year="2020" month="January"/></front>
          <seriesInfo name="RFC" value="8693"/>
        </reference>

        <reference anchor="SPIFFE" target="https://spiffe.io/docs/latest/spiffe-about/overview/">
          <front><title>SPIFFE: Secure Production Identity Framework for Everyone</title>
          <author><organization>CNCF</organization></author>
          <date year="2024"/></front>
        </reference>
      </references>
    </references>

    <!-- ============================================================ -->
    <section anchor="capability-namespace">
      <name>Capability Namespace Convention</name>

      <t>Capabilities follow a resource:action format:</t>

      <sourcecode type="text"><![CDATA[
form:submit          Submit form data
form:read            Read form structure/schema
calendar:read        Read calendar events
calendar:write       Create/update events
calendar:delete      Delete events
email:send           Send emails
email:read           Read inbox
storage:read         Read files
storage:write        Upload/modify files
payment:initiate     Start a payment
payment:confirm      Confirm a payment
]]></sourcecode>

      <t>Service providers MAY define custom capabilities using
      reverse-domain notation (e.g., "com.example.booking:create").</t>
    </section>

    <!-- ============================================================ -->
    <section anchor="error-codes">
      <name>Error Codes</name>

      <table>
        <thead>
          <tr><th>Code</th><th>Name</th><th>Description</th></tr>
        </thead>
        <tbody>
          <tr><td>AID-001</td><td>INVALID_TOKEN</td><td>AIT signature verification failed</td></tr>
          <tr><td>AID-002</td><td>TOKEN_EXPIRED</td><td>AIT has exceeded its exp claim</td></tr>
          <tr><td>AID-003</td><td>AGENT_REVOKED</td><td>Agent has been revoked</td></tr>
          <tr><td>AID-004</td><td>AGENT_SUSPENDED</td><td>Agent is temporarily suspended</td></tr>
          <tr><td>AID-005</td><td>INSUFFICIENT_VERIFICATION</td><td>Owner verification level below minimum</td></tr>
          <tr><td>AID-006</td><td>CAPABILITY_DENIED</td><td>Agent lacks required capability</td></tr>
          <tr><td>AID-007</td><td>RATE_LIMIT_EXCEEDED</td><td>Per-agent rate limit exceeded</td></tr>
          <tr><td>AID-008</td><td>NOT_ON_ALLOWLIST</td><td>Agent not on service allowlist</td></tr>
          <tr><td>AID-009</td><td>DELEGATION_INVALID</td><td>Scope attenuation violated</td></tr>
          <tr><td>AID-010</td><td>REPLAY_DETECTED</td><td>Token jti previously used</td></tr>
        </tbody>
      </table>
    </section>

    <section anchor="acknowledgements" numbered="false">
      <name>Acknowledgements</name>
      <t>The authors wish to thank the contributors to the AgentID
      Protocol specification on GitHub, and the broader community
      working on AI agent identity and authentication standards.</t>
    </section>
  </back>
</rfc>
