<?xml version="1.0" encoding="UTF-8"?>
  <?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
  <!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.39 (Ruby 3.4.7) -->


<!DOCTYPE rfc  [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">

]>


<rfc ipr="trust200902" docName="draft-kavian-aep-platform-hosted-identity-01" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true">
  <front>
    <title abbrev="AEP Platform">AEP Platform Hosted Identity</title>

    <author initials="N." surname="Kavian" fullname="N. Kavian">
      <organization>Jarwin, Inc. (InFlow)</organization>
      <address>
        <email>nas@inflowpay.ai</email>
      </address>
    </author>

    <date year="2026" month="September" day="04"/>

    
    
    

    <abstract>


<?line 47?>

<t>This document defines interoperable hosted identity behavior for Agent
Enrollment Protocol (AEP) Platforms. It lets a Platform provision
Service-scoped Agent <spanx style="verb">did:web</spanx> identities, publish DID documents, custody
signing keys, and produce AEP client assertion JWTs through delegated signing
operations.</t>



    </abstract>



  </front>

  <middle>


<?line 55?>

<section anchor="introduction"><name>Introduction</name>

<t>The Agent Enrollment Protocol defines how an Agent enrolls and authenticates
with a Service. The AEP core also names Platform as a role that can host Agent
identity material, but it does not define an interoperable Platform API.</t>

<t>This document defines AEP Platform Hosted Identity. A conforming Platform
provisions an Agent identity that is scoped to a supplied Service DID, publishes
the Agent DID document, and signs AEP client assertions for the Agent. The
Agent presents those assertions to the Service. The Service verifies the
assertion locally by resolving the Agent DID and applying AEP core verification
rules.</t>

<t>This specification does not make the Platform a Service. Service Inspect,
Enroll, Status, Grant, and Revoke remain Service endpoints defined by AEP core.
The Platform endpoints defined here help an Agent obtain and operate the
Service-scoped Agent identity that it uses with those Service endpoints.</t>

<t>This specification does not define verifier orchestration, attestation
issuance, Owner recovery procedures, private-key import, or private-key export.
Those functions can be implemented by a Platform, but they are separate from
the hosted identity API defined here.</t>

</section>
<section anchor="requirements-language"><name>Requirements Language</name>

<t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" 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>

<?line -18?>

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

<t>This document uses the Agent, Service, Platform, Owner, DID, and client
assertion terms from AEP core <xref target="AEP-CORE"/>. JSON values are encoded as
described by <xref target="RFC8259"/>. <spanx style="verb">did:web</spanx> resolution follows <xref target="AEP-DID-WEB"/>.</t>

<dl>
  <dt>Service-Scoped Agent DID:</dt>
  <dd>
    <t>A <spanx style="verb">did:web</spanx> identifier minted by a Platform for one Agent to use with one
supplied Service DID. The identifier is opaque outside the Platform and is not
reused across unrelated Services.</t>
  </dd>
  <dt>Platform Discovery:</dt>
  <dd>
    <t>A well-known JSON document that describes Platform API endpoint locations,
supported algorithms, DID publication templates, hosted verification support,
and key custody guarantees.</t>
  </dd>
  <dt>Delegated Signing:</dt>
  <dd>
    <t>A Platform operation that signs an AEP client assertion JWT for a managed
Service-scoped Agent DID without returning private signing material.</t>
  </dd>
</dl>

</section>
<section anchor="hosted-identity-overview"><name>Hosted Identity Overview</name>

<t>A Platform implementation follows this sequence:</t>

<t><list style="numbers" type="1">
  <t>Publish Platform Discovery at <spanx style="verb">/.well-known/aep-platform</spanx>.</t>
  <t>Accept an authenticated provisioning request that names a target
<spanx style="verb">service_did</spanx>.</t>
  <t>Mint or return a Service-scoped Agent DID for the authenticated Agent and
target Service DID.</t>
  <t>Publish a DID document for that Agent DID.</t>
  <t>Accept delegated signing requests for that Agent DID and target Service DID.</t>
  <t>Return signed AEP client assertion JWTs that can be verified by the target
Service using AEP core and the Agent DID document.</t>
</list></t>

</section>
<section anchor="role-and-trust-boundaries"><name>Role And Trust Boundaries</name>

<t>A Platform is not on the Service-facing AEP command path. An Agent uses the
Platform API to obtain and operate a Service-scoped Agent DID, then uses AEP
core commands directly with the Service. Services verify client assertions by
resolving the Agent DID and applying AEP core verification rules.</t>

<t>A Service <bcp14>MUST NOT</bcp14> require use of the hosted verification endpoint defined by
this document as a condition of accepting an otherwise valid AEP client
assertion. Hosted verification is optional and requires a separate
out-of-band trust relationship between the caller and the Platform.</t>

<t>A legal entity that operates both a Service and a Platform <bcp14>MUST</bcp14> keep those roles
logically separate. If both roles publish DIDs, the Service DID and Platform DID
<bcp14>MUST</bcp14> be distinct, and Service-role records <bcp14>MUST</bcp14> remain independent from
Platform-role identity records.</t>

</section>
<section anchor="platform-discovery"><name>Platform Discovery</name>

<t>A Platform that implements this specification <bcp14>MUST</bcp14> publish a discovery
document at <spanx style="verb">/.well-known/aep-platform</spanx> on the HTTPS origin used for Platform
APIs. The response media type is <spanx style="verb">application/aep+json</spanx>. HTTP semantics follow
<xref target="RFC9110"/>.</t>

<t>The <spanx style="verb">aep_version</spanx> member follows the version syntax and compatibility rules in
the AEP core specification. A Platform client <bcp14>MUST</bcp14> reject a discovery document
whose major version it does not support and <bcp14>MUST</bcp14> accept supported-major minor
versions according to the core compatibility rules.</t>

<t>The discovery document has this structure:</t>

<figure><sourcecode type="json"><![CDATA[
{
  "aep_version": "1.0",
  "platform": {
    "did": "did:web:p.example",
    "hosted_verification": true,
    "name": "Example Platform"
  },
  "http": {
    "endpoint_base": "/v1/aep"
  },
  "identity": {
    "did_methods": ["did:web"],
    "did_url_template": "https://p.example/a/{agent_did_id}/did.json"
  },
  "signing": {
    "algorithms": ["ES256"],
    "default_lifetime_seconds": "300"
  },
  "endpoints": {
    "hosted_verification": "/v1/aep/verifications",
    "lifecycle": "/v1/aep/agent-identities/{agent_identity_id}",
    "list": "/v1/aep/agent-identities",
    "provision": "/v1/aep/agent-identities",
    "sign": "/v1/aep/agent-identities/{agent_identity_id}/sign"
  }
}
]]></sourcecode></figure>

<t><spanx style="verb">platform.did</spanx> is <bcp14>OPTIONAL</bcp14>. If present, it <bcp14>MUST</bcp14> be a DID controlled by the
Platform. <spanx style="verb">identity.did_url_template</spanx> <bcp14>MUST</bcp14> describe where the Platform publishes
Service-scoped Agent DID documents. <spanx style="verb">signing.algorithms</spanx> lists the JOSE signing
algorithms the Platform can use for delegated signing. Values <bcp14>MUST</bcp14> be AEP core
signing algorithms or algorithms defined by registered extensions.</t>

<t><spanx style="verb">signing.default_lifetime_seconds</spanx> is the default lifetime, in seconds, for
delegated client assertions when a signing request does not include
<spanx style="verb">lifetime_seconds</spanx>. This field is an AEP-owned numeric value and is therefore
represented as a JSON string. The Platform <bcp14>MUST</bcp14> enforce the AEP core maximum
assertion validity interval of 300 seconds. A Platform <bcp14>MAY</bcp14> enforce a shorter
local maximum.</t>

<t>Platforms <bcp14>SHOULD</bcp14> send <spanx style="verb">Cache-Control</spanx>, <spanx style="verb">ETag</spanx>, and <spanx style="verb">Last-Modified</spanx> metadata on Discovery responses. Agents <bcp14>MUST</bcp14> honor usable freshness, validators, conditional requests, and <spanx style="verb">304 Not Modified</spanx>. <spanx style="verb">no-cache</spanx> requires revalidation and <spanx style="verb">no-store</spanx> prohibits persistence or reuse beyond the current fetch. When no shorter usable freshness policy is supplied, Agents <bcp14>SHOULD</bcp14> use 300 seconds. Cache keys use the advertised Discovery URL and <bcp14>MUST</bcp14> track the final URL after an accepted safe redirect. Discovery redirects <bcp14>MUST</bcp14> remain HTTPS, <bcp14>MUST NOT</bcp14> contain user information, and <bcp14>MUST</bcp14> satisfy implementation redirect, byte, and completion-time bounds.</t>

</section>
<section anchor="provisioning"><name>Provisioning</name>

<t>Provisioning creates or retrieves a Service-scoped Agent DID for an
authenticated Platform API caller acting for an Agent or Owner. Platform API
caller authentication is out of scope for this document, but the Platform <bcp14>MUST</bcp14>
authenticate and authorize the caller before processing the request. The
provisioning endpoint is relative to <spanx style="verb">http.endpoint_base</spanx> and is advertised by
<spanx style="verb">endpoints.provision</spanx>.</t>

<t>The request body is:</t>

<figure><sourcecode type="json"><![CDATA[
{
  "service_did": "did:web:api.service.example"
}
]]></sourcecode></figure>

<t>Provisioning uses <spanx style="verb">POST</spanx> and <bcp14>MUST</bcp14> carry a non-empty <spanx style="verb">Idempotency-Key</spanx> header.</t>

<t>The Platform <bcp14>MUST</bcp14> validate that <spanx style="verb">service_did</spanx> is syntactically a DID. For
<spanx style="verb">did:web</spanx>, the Platform <bcp14>MUST</bcp14> resolve the DID before first delegated signing
unless local policy explicitly permits deferred resolution.</t>

<t>The Platform <bcp14>MUST</bcp14> mint a distinct Agent DID for each unrelated <spanx style="verb">service_did</spanx>
used by the same Agent. The DID path component <bcp14>MUST</bcp14> be opaque to external
observers and <bcp14>MUST NOT</bcp14> reveal the Agent, Owner, tenant, account, target
Service, or derivation inputs. A Platform <bcp14>MUST NOT</bcp14> reuse one public Agent DID
across unrelated Services unless explicit Owner policy requires reuse.</t>

<t>An observer comparing two Service-scoped Agent DIDs for the same Agent at
different Services <bcp14>MUST</bcp14> see no common structure beyond the Platform-controlled
origin or DID method prefix. A Platform <bcp14>MAY</bcp14> derive Service-scoped Agent DID
identifiers using a Platform-secret keyed derivation over internal Agent and
Service identifiers, but the derivation inputs and key material <bcp14>MUST NOT</bcp14> be
disclosed.</t>

<t>A successful response is:</t>

<figure><sourcecode type="json"><![CDATA[
{
  "agent_identity_id": "pai_01J0AEPPLATFORM000000000001",
  "agent_did": "did:web:p.example:a:4Yf7p2xQd9",
  "created_at": "2026-07-06T12:00:00Z",
  "did_document_url": "https://p.example/a/4Yf7p2xQd9/did.json",
  "key_id": "did:web:p.example:a:4Yf7p2xQd9",
  "service_did": "did:web:api.service.example",
  "signing_algorithms": ["ES256"],
  "status": "active",
  "updated_at": "2026-07-06T12:00:00Z"
}
]]></sourcecode></figure>

<t>The Platform <bcp14>MUST</bcp14> return the same response for an exact replay as defined in
the Platform Idempotency section.</t>

</section>
<section anchor="listing-agent-identities"><name>Listing Agent Identities</name>

<t>The Platform <bcp14>MUST</bcp14> expose a listing endpoint for the authenticated caller's
Service-scoped Agent identities. The listing endpoint is relative to
<spanx style="verb">http.endpoint_base</spanx> and is advertised by <spanx style="verb">endpoints.list</spanx>.</t>

<t>The listing endpoint uses <spanx style="verb">GET</spanx> and <bcp14>MUST</bcp14> support these optional query
parameters:</t>

<texttable>
      <ttcol align='left'>Query parameter</ttcol>
      <ttcol align='left'>Meaning</ttcol>
      <c><spanx style="verb">descending</spanx></c>
      <c>Return records in descending creation order when <spanx style="verb">true</spanx>; otherwise ascending creation order.</c>
      <c><spanx style="verb">limit</spanx></c>
      <c>Maximum number of records to return.</c>
      <c><spanx style="verb">offset</spanx></c>
      <c>Number of matching records to skip before returning data.</c>
      <c><spanx style="verb">service_did</spanx></c>
      <c>Return only identities scoped to this Service DID.</c>
      <c><spanx style="verb">status</spanx></c>
      <c>Return only identities in this lifecycle state.</c>
</texttable>

<t>The Platform <bcp14>MUST</bcp14> apply deterministic ordering before applying <spanx style="verb">offset</spanx> and
<spanx style="verb">limit</spanx>. Unless a Platform publishes a stronger ordering contract, ordering is
by creation time and then by a stable Platform-local identifier. The Platform
<bcp14>SHOULD</bcp14> bound <spanx style="verb">limit</spanx> to protect service availability.</t>

<t>A successful response is:</t>

<figure><sourcecode type="json"><![CDATA[
{
  "count": "1",
  "data": [
    {
      "agent_identity_id": "pai_01J0AEPPLATFORM000000000001",
      "agent_did": "did:web:p.example:a:4Yf7p2xQd9",
      "created_at": "2026-07-06T12:00:00Z",
      "did_document_url": "https://p.example/a/4Yf7p2xQd9/did.json",
      "key_id": "did:web:p.example:a:4Yf7p2xQd9",
      "service_did": "did:web:api.service.example",
      "signing_algorithms": ["ES256"],
      "status": "active",
      "updated_at": "2026-07-06T12:00:00Z"
    }
  ],
  "total": "1"
}
]]></sourcecode></figure>

<t>The Platform <bcp14>MUST</bcp14> only return Agent identities the authenticated caller is
authorized to inspect. <spanx style="verb">count</spanx> is the number of records in <spanx style="verb">data</spanx>. <spanx style="verb">total</spanx> is
the total number of records matching the query before <spanx style="verb">offset</spanx> and <spanx style="verb">limit</spanx> are
applied. Both fields are AEP-owned numeric values and are therefore represented
as JSON strings containing non-negative integers.</t>

<t>An Agent <bcp14>MAY</bcp14> use the listing endpoint with <spanx style="verb">service_did</spanx> to recover a missing
local reference to a Platform-hosted Agent identity. The presence of an identity
in the Platform proves that the identity was provisioned; it does not prove that
the Service currently recognizes the identity. The Agent uses the Service Status
command to determine the Service enrollment lifecycle state.</t>

</section>
<section anchor="did-document-publication"><name>DID Document Publication</name>

<t>The Platform <bcp14>MUST</bcp14> publish a DID document for each active Service-scoped Agent
DID. The DID document <bcp14>MUST</bcp14> contain public verification material suitable for
AEP client assertion verification by the target Service.</t>

<t>The Platform <bcp14>SHOULD</bcp14> use an opaque path component that does not reveal the
Agent, Owner, tenant, account, or target Service DID.</t>

<t>The Platform <bcp14>MUST</bcp14> maintain an internal mapping from the authenticated Agent or
Owner account and target Service DID to the Service-scoped Agent DID. A Service
does not need to know that the DID is Service-scoped and <bcp14>MUST</bcp14> be able to verify
the DID as an ordinary <spanx style="verb">did:web</spanx> Agent DID.</t>

</section>
<section anchor="delegated-signing"><name>Delegated Signing</name>

<t>Delegated signing produces an AEP client assertion JWT for an Agent identity
managed by the Platform. The signing endpoint is relative to <spanx style="verb">http.endpoint_base</spanx>
and is advertised by <spanx style="verb">endpoints.sign</spanx>.</t>

<t>The request body is:</t>

<figure><sourcecode type="json"><![CDATA[
{
  "jti": "01J0AEPASSERTION0000000001",
  "lifetime_seconds": "300",
  "op": "enroll",
  "platform_context": {"authorization_handle": "opaque-value"},
  "service_did": "did:web:api.service.example"
}
]]></sourcecode></figure>

<t>Delegated signing uses <spanx style="verb">POST</spanx> and <bcp14>MUST</bcp14> carry a non-empty <spanx style="verb">Idempotency-Key</spanx>
header. <spanx style="verb">platform_context</spanx> is an optional, free-form JSON object whose members
are defined by Platform policy or a Platform profile. It is Platform-local
authorization or custody input. It <bcp14>MUST NOT</bcp14> be copied into client-assertion
claims, included in assertion signature inputs, or otherwise alter the
assertion semantics defined by AEP core. When returned, it remains opaque to
the Agent and <bcp14>SHOULD</bcp14> be transported unchanged.</t>

<t>The Platform <bcp14>MUST</bcp14> authenticate the caller and verify that the caller is
authorized to sign for the requested Agent identity and <spanx style="verb">service_did</spanx>. The
Platform <bcp14>MUST</bcp14> reject signing requests for inactive, suspended, terminated, or
revoked Agent identities.</t>

<t>If <spanx style="verb">lifetime_seconds</spanx> is present, it <bcp14>MUST</bcp14> be a string-encoded positive integer
and <bcp14>MUST NOT</bcp14> exceed 300 seconds. If <spanx style="verb">lifetime_seconds</spanx> is omitted, the Platform
uses <spanx style="verb">signing.default_lifetime_seconds</spanx>. The effective lifetime <bcp14>MUST NOT</bcp14> exceed
300 seconds. A Platform <bcp14>MAY</bcp14> reject values above a shorter local maximum.</t>

<t>When <spanx style="verb">op</spanx> is <spanx style="verb">authenticate</spanx>, the request <bcp14>MUST</bcp14> include <spanx style="verb">resource</spanx> with the absolute HTTPS protected-resource URI and the Platform <bcp14>MUST</bcp14> include that value in the assertion. For every other operation, <spanx style="verb">resource</spanx> <bcp14>MUST</bcp14> be absent.</t>

<t>A completed response uses <spanx style="verb">200 OK</spanx>:</t>

<figure><sourcecode type="json"><![CDATA[
{
  "agent_did": "did:web:p.example:a:4Yf7p2xQd9",
  "client_assertion": "eyJhbGciOiJFUzI1NiIsImtpZCI6Ii4uLiJ9...",
  "expires_at": "2026-07-06T12:05:00Z",
  "issued_at": "2026-07-06T12:00:00Z",
  "jti": "01J0AEPASSERTION0000000001",
  "platform_context": {"authorization_handle": "opaque-value"},
  "service_did": "did:web:api.service.example",
  "status": "completed"
}
]]></sourcecode></figure>

<t>When signing has not completed, the Platform returns <spanx style="verb">202 Accepted</spanx>:</t>

<figure><sourcecode type="json"><![CDATA[
{
  "platform_context": {"authorization_handle": "opaque-value"},
  "retry_after_seconds": "5",
  "status": "pending"
}
]]></sourcecode></figure>

<t><spanx style="verb">retry_after_seconds</spanx> is required on a pending response and is a decimal string
from <spanx style="verb">"1"</spanx> through <spanx style="verb">"300"</spanx>. It controls polling cadence, not the total operation
deadline. The Platform <bcp14>MUST NOT</bcp14> send <spanx style="verb">Retry-After</spanx> for this contract. A pending
or completed response <bcp14>MAY</bcp14> contain <spanx style="verb">platform_context</spanx>; it <bcp14>SHOULD</bcp14> be omitted when
there is no context to return.</t>

<t>The JWT claims <bcp14>MUST</bcp14> satisfy AEP core client assertion requirements. The <spanx style="verb">iss</spanx>
and <spanx style="verb">sub</spanx> claims <bcp14>MUST</bcp14> be the Service-scoped Agent DID. The <spanx style="verb">aud</spanx> claim <bcp14>MUST</bcp14> be
the target Service DID. The <spanx style="verb">op</spanx> claim <bcp14>MUST</bcp14> be the AEP operation for which the
assertion is intended. For Platform-hosted <spanx style="verb">did:web</spanx> identities, the JOSE <spanx style="verb">kid</spanx>
header <bcp14>MUST</bcp14> identify the Service-scoped Agent DID carried in <spanx style="verb">key_id</spanx>. Platform
Hosted Identity does not use DID verification-method fragments such as
<spanx style="verb">#key-1</spanx>.</t>

<t>The Platform <bcp14>MUST</bcp14> apply an explicitly registered signing policy to every <spanx style="verb">op</spanx>.
The operations defined by AEP core are <spanx style="verb">enroll</spanx>, <spanx style="verb">grant</spanx>, <spanx style="verb">revoke</spanx>, <spanx style="verb">status</spanx>,
and <spanx style="verb">authenticate</spanx>; Inspect is unauthenticated and does not use delegated signing. An
unrecognized operation, or an operation for which the Platform has no policy,
<bcp14>MUST</bcp14> fail closed and <bcp14>MUST NOT</bcp14> produce an assertion. Extensions <bcp14>MAY</bcp14> register
additional operation policies without redefining Inspect as permanently
unsigned.</t>

</section>
<section anchor="lifecycle"><name>Lifecycle</name>

<t>The Platform <bcp14>MUST</bcp14> expose lifecycle state for each managed Agent identity. This
specification defines these states:</t>

<texttable>
      <ttcol align='left'>State</ttcol>
      <ttcol align='left'>Meaning</ttcol>
      <c><spanx style="verb">active</spanx></c>
      <c>The identity can publish DID documents and sign.</c>
      <c><spanx style="verb">revoked</spanx></c>
      <c>The identity is permanently revoked and cannot sign.</c>
      <c><spanx style="verb">suspended</spanx></c>
      <c>The identity is temporarily blocked from signing.</c>
      <c><spanx style="verb">terminated</spanx></c>
      <c>The identity is permanently terminated by Platform rule.</c>
</texttable>

<t>State names are lowercase ASCII strings. A Platform <bcp14>MUST NOT</bcp14> sign for
<spanx style="verb">revoked</spanx>, <spanx style="verb">suspended</spanx>, or <spanx style="verb">terminated</spanx> identities.</t>

<t>Key rotation changes verification material or key references; it is not a
Platform lifecycle state. This document does not define Platform key rotation
behavior or a key-rotation endpoint. Rotation of Agent-controlled key material
is performed by Agent-side tooling or a separate identity-management surface,
not by the Platform API defined here. Services continue to verify the resulting
DID document according to AEP core and the <spanx style="verb">did:web</spanx> identity method.</t>

<t>The lifecycle endpoint is relative to <spanx style="verb">http.endpoint_base</spanx> and is advertised by
<spanx style="verb">endpoints.lifecycle</spanx>. The endpoint identifies one Platform-local Agent identity
with an <spanx style="verb">{agent_identity_id}</spanx> path parameter. The Platform <bcp14>MUST</bcp14> authenticate the
caller and verify that the caller is authorized to inspect or modify that Agent
identity before returning state or changing state.</t>

<t>The Platform <bcp14>MUST</bcp14> support <spanx style="verb">GET</spanx> on the lifecycle endpoint to return the Agent
identity object described in the Provisioning section.</t>

<t>The Platform <bcp14>MUST</bcp14> support <spanx style="verb">PATCH</spanx> on the lifecycle endpoint to update the
identity lifecycle state. The request body is:</t>

<figure><sourcecode type="json"><![CDATA[
{
  "status": "suspended"
}
]]></sourcecode></figure>

<t>A successful <spanx style="verb">PATCH</spanx> response is the updated Agent identity object:</t>

<figure><sourcecode type="json"><![CDATA[
{
  "agent_identity_id": "pai_01J0AEPPLATFORM000000000001",
  "agent_did": "did:web:p.example:a:4Yf7p2xQd9",
  "created_at": "2026-07-06T12:00:00Z",
  "did_document_url": "https://p.example/a/4Yf7p2xQd9/did.json",
  "key_id": "did:web:p.example:a:4Yf7p2xQd9",
  "service_did": "did:web:api.service.example",
  "signing_algorithms": ["ES256"],
  "status": "suspended",
  "updated_at": "2026-07-06T12:10:00Z"
}
]]></sourcecode></figure>

<t>This specification defines the state values that are carried on the wire. It
does not define a universal state-transition graph. A Platform defines its own
permitted transitions according to policy, custody model, and compliance
requirements.</t>

</section>
<section anchor="hosted-verification"><name>Hosted Verification</name>

<t>Hosted verification is <bcp14>OPTIONAL</bcp14>. If supported, the Platform advertises the
endpoint in <spanx style="verb">endpoints.hosted_verification</spanx> and sets
<spanx style="verb">platform.hosted_verification</spanx> to <spanx style="verb">true</spanx>.</t>

<t>Hosted verification does not replace local Service verification. A Service can
verify a client assertion locally by resolving the Agent DID and applying AEP
core verification rules. A Service <bcp14>MUST NOT</bcp14> require hosted verification as a
condition of accepting otherwise valid AEP client assertions. Hosted
verification is an optional convenience API for deployments that have an
out-of-band trust relationship with the Platform.</t>

<t>The hosted verification endpoint uses <spanx style="verb">POST</spanx> and <bcp14>MUST</bcp14> carry a non-empty
<spanx style="verb">Idempotency-Key</spanx> header. The request body is:</t>

<figure><sourcecode type="json"><![CDATA[
{
  "client_assertion": "eyJhbGciOiJFUzI1NiIsImtpZCI6Ii4uLiJ9...",
  "op": "enroll",
  "service_did": "did:web:api.service.example"
}
]]></sourcecode></figure>

<t>The Platform <bcp14>MUST</bcp14> verify the assertion signature, time bounds, <spanx style="verb">jti</spanx> replay
status, <spanx style="verb">op</spanx>, <spanx style="verb">aud</spanx>, <spanx style="verb">iss</spanx>, <spanx style="verb">sub</spanx>, and the current lifecycle state of the
managed Agent identity. The Platform <bcp14>MUST</bcp14> reject assertion replay according to
the same replay policy it applies to local delegated-signing audit records.</t>

<t>For <spanx style="verb">authenticate</spanx>, the hosted verification request <bcp14>MUST</bcp14> include <spanx style="verb">resource</spanx>, and the Platform <bcp14>MUST</bcp14> verify that it equals the assertion claim and intended protected-resource target. For other operations, <spanx style="verb">resource</spanx> <bcp14>MUST</bcp14> be absent.</t>

<t>A successful response for a recognized assertion is:</t>

<figure><sourcecode type="json"><![CDATA[
{
  "agent_did": "did:web:p.example:a:4Yf7p2xQd9",
  "agent_identity_id": "pai_01J0AEPPLATFORM000000000001",
  "op": "enroll",
  "reason": "verified",
  "service_did": "did:web:api.service.example",
  "status": "active",
  "verified": true
}
]]></sourcecode></figure>

<t>A response for an assertion the Platform cannot recognize or validate is:</t>

<figure><sourcecode type="json"><![CDATA[
{
  "reason": "not_recognized",
  "service_did": "did:web:api.service.example",
  "verified": false
}
]]></sourcecode></figure>

<t>Hosted verification responses <bcp14>MUST NOT</bcp14> disclose whether a private Agent,
Owner, tenant, Service-scoped identity, or signing record exists unless the
request is authorized to learn that fact. A Platform <bcp14>MAY</bcp14> return a generic
unrecognized response instead of identity-specific failure detail when revealing
the distinction would create an enumeration risk.</t>

</section>
<section anchor="platform-idempotency"><name>Platform Idempotency</name>

<t>Provisioning, delegated signing, and hosted verification <bcp14>MUST</bcp14> support safe
retry through the <spanx style="verb">Idempotency-Key</spanx> HTTP header. Listing and lifecycle <spanx style="verb">GET</spanx>
requests do not use this header. Lifecycle <spanx style="verb">PATCH</spanx> remains naturally idempotent
while it only requests a target state.</t>

<t>The Platform <bcp14>MUST</bcp14> scope idempotency lookup by a stable authenticated principal,
including tenant scope where necessary, plus the key. It <bcp14>MUST</bcp14> retain the
complete replayable HTTP result for at least one hour. Exact retries <bcp14>MUST</bcp14> return
the stored result, including pending results. Durable operation invariants <bcp14>MUST</bcp14>
continue to prevent duplicate identities or other unsafe effects after the
retention period expires.</t>

<t>Each record <bcp14>MUST</bcp14> bind the normalized operation and a cryptographic hash of a
canonical representation of material path parameters and request content.
Authentication credentials, transport-only values, the <spanx style="verb">Idempotency-Key</spanx>
itself, and server-generated timestamps <bcp14>MUST</bcp14> be excluded. Reuse by the same
principal for another operation or changed material input <bcp14>MUST</bcp14> return <spanx style="verb">409
Conflict</spanx> with code <spanx style="verb">idempotency_conflict</spanx>.</t>

<t>An initial Sign request and a later completion request have different material
input and therefore <bcp14>MUST</bcp14> use distinct idempotency keys. Retries within either
stage reuse that stage's key.</t>

</section>
<section anchor="error-handling"><name>Error Handling</name>

<t>Platform endpoints use <spanx style="verb">application/problem+json</spanx> for errors. Implementations
<bcp14>SHOULD</bcp14> reuse AEP core Problem Details shape and error codes where the semantics
match. Problem <spanx style="verb">type</spanx> values <bcp14>SHOULD</bcp14> use the <spanx style="verb">urn:aep:error:&lt;code&gt;</spanx> form defined
by AEP core. Errors <bcp14>MUST NOT</bcp14> disclose whether a private Agent, Owner, tenant,
or Service-scoped identity exists unless the authenticated caller is authorized
to know that fact.</t>

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

<t>This document requests registration of <spanx style="verb">aep-platform</spanx> in the Well-Known URI
Registry established by <xref target="RFC8615"/>.</t>

<texttable>
      <ttcol align='left'>Field</ttcol>
      <ttcol align='left'>Value</ttcol>
      <c>URI suffix</c>
      <c><spanx style="verb">aep-platform</spanx></c>
      <c>Change controller</c>
      <c>AEP Foundation</c>
      <c>Specification document</c>
      <c>This document</c>
      <c>Related information</c>
      <c>Agent Enrollment Protocol Platform discovery</c>
</texttable>

<t>This document does not request creation of an AEP Platform endpoint registry or
an AEP Platform lifecycle-state registry. The endpoint names and lifecycle
state values defined here are closed over this document.</t>

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

<t>The Platform is a high-value key custody system. Platforms <bcp14>MUST</bcp14>
authenticate callers, authorize every provisioning and signing operation, audit
signing operations, rate-limit state-changing endpoints, and protect replay
inputs such as <spanx style="verb">jti</spanx> and <spanx style="verb">Idempotency-Key</spanx>.</t>

<t>Platforms <bcp14>SHOULD</bcp14> use hardware-backed keys for production custody. If an
implementation uses software-encrypted keys, it <bcp14>MUST</bcp14> separate key encryption
keys from encrypted signing-key records and <bcp14>MUST</bcp14> fail closed when production
custody configuration is incomplete.</t>

<t>Platforms <bcp14>MUST NOT</bcp14> return private signing material through the endpoints
defined by this document. Platforms <bcp14>SHOULD</bcp14> expose audit records for delegated
signing operations to the authorized Agent or Owner through an authenticated
management surface.</t>

<t>Platforms <bcp14>MUST NOT</bcp14> import or export private signing material through the
endpoints defined by this document. Recovery of a Platform account, Owner
credential, or Agent management credential is out of scope for this document.</t>

</section>
<section anchor="privacy-considerations"><name>Privacy Considerations</name>

<t>Service-scoped Agent DIDs reduce cross-Service correlation. Platforms <bcp14>MUST NOT</bcp14>
reuse the same public Agent DID across unrelated Service DIDs unless explicit
Owner policy requires reuse. DID URLs and opaque identifiers <bcp14>SHOULD</bcp14> avoid
embedding account names, tenant names, Service hostnames, or other correlatable
business identifiers.</t>

<t>The Platform itself can correlate all Services for which it has provisioned
Service-scoped Agent DIDs. Agents or Owners that require unlinkability from the
Platform need a self-custody identity model rather than hosted identity.</t>

</section>


  </middle>

  <back>



    <references title='Normative References' anchor="sec-normative-references">



<reference anchor="RFC8259">
  <front>
    <title>The JavaScript Object Notation (JSON) Data Interchange Format</title>
    <author fullname="T. Bray" initials="T." role="editor" surname="Bray"/>
    <date month="December" year="2017"/>
    <abstract>
      <t>JavaScript Object Notation (JSON) is a lightweight, text-based, language-independent data interchange format. It was derived from the ECMAScript Programming Language Standard. JSON defines a small set of formatting rules for the portable representation of structured data.</t>
      <t>This document removes inconsistencies with other specifications of JSON, repairs specification errors, and offers experience-based interoperability guidance.</t>
    </abstract>
  </front>
  <seriesInfo name="STD" value="90"/>
  <seriesInfo name="RFC" value="8259"/>
  <seriesInfo name="DOI" value="10.17487/RFC8259"/>
</reference>
<reference anchor="RFC9110">
  <front>
    <title>HTTP Semantics</title>
    <author fullname="R. Fielding" initials="R." role="editor" surname="Fielding"/>
    <author fullname="M. Nottingham" initials="M." role="editor" surname="Nottingham"/>
    <author fullname="J. Reschke" initials="J." role="editor" surname="Reschke"/>
    <date month="June" year="2022"/>
    <abstract>
      <t>The Hypertext Transfer Protocol (HTTP) is a stateless application-level protocol for distributed, collaborative, hypertext information systems. This document describes the overall architecture of HTTP, establishes common terminology, and defines aspects of the protocol that are shared by all versions. In this definition are core protocol elements, extensibility mechanisms, and the "http" and "https" Uniform Resource Identifier (URI) schemes.</t>
      <t>This document updates RFC 3864 and obsoletes RFCs 2818, 7231, 7232, 7233, 7235, 7538, 7615, 7694, and portions of 7230.</t>
    </abstract>
  </front>
  <seriesInfo name="STD" value="97"/>
  <seriesInfo name="RFC" value="9110"/>
  <seriesInfo name="DOI" value="10.17487/RFC9110"/>
</reference>
<reference anchor="RFC8615">
  <front>
    <title>Well-Known Uniform Resource Identifiers (URIs)</title>
    <author fullname="M. Nottingham" initials="M." surname="Nottingham"/>
    <date month="May" year="2019"/>
    <abstract>
      <t>This memo defines a path prefix for "well-known locations", "/.well-known/", in selected Uniform Resource Identifier (URI) schemes.</t>
      <t>In doing so, it obsoletes RFC 5785 and updates the URI schemes defined in RFC 7230 to reserve that space. It also updates RFC 7595 to track URI schemes that support well-known URIs in their registry.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="8615"/>
  <seriesInfo name="DOI" value="10.17487/RFC8615"/>
</reference>

<reference anchor="AEP-CORE" target="https://datatracker.ietf.org/doc/draft-kavian-agent-enrollment-protocol/">
  <front>
    <title>The Agent Enrollment Protocol</title>
    <author initials="N." surname="Kavian" fullname="N. Kavian">
      <organization></organization>
    </author>
    <date year="2026" month="August" day="27"/>
  </front>
  <seriesInfo name="Internet-Draft" value="draft-kavian-agent-enrollment-protocol-04"/>
</reference>
<reference anchor="AEP-DID-WEB" target="https://datatracker.ietf.org/doc/draft-kavian-aep-did-web-identity-method/">
  <front>
    <title>did:web Identity Method for the Agent Enrollment Protocol</title>
    <author initials="N." surname="Kavian" fullname="N. Kavian">
      <organization></organization>
    </author>
    <date year="2026" month="June" day="27"/>
  </front>
  <seriesInfo name="Internet-Draft" value="draft-kavian-aep-did-web-identity-method-00"/>
</reference>


<reference anchor="RFC2119">
  <front>
    <title>Key words for use in RFCs to Indicate Requirement Levels</title>
    <author fullname="S. Bradner" initials="S." surname="Bradner"/>
    <date month="March" year="1997"/>
    <abstract>
      <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
    </abstract>
  </front>
  <seriesInfo name="BCP" value="14"/>
  <seriesInfo name="RFC" value="2119"/>
  <seriesInfo name="DOI" value="10.17487/RFC2119"/>
</reference>
<reference anchor="RFC8174">
  <front>
    <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
    <author fullname="B. Leiba" initials="B." surname="Leiba"/>
    <date month="May" year="2017"/>
    <abstract>
      <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
    </abstract>
  </front>
  <seriesInfo name="BCP" value="14"/>
  <seriesInfo name="RFC" value="8174"/>
  <seriesInfo name="DOI" value="10.17487/RFC8174"/>
</reference>



    </references>





  </back>

<!-- ##markdown-source:
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

-->

</rfc>

