HCS-14: Universal Agent IDs for Web2 and Web3
HCS-14 gives AI agents a single, portable identifier (UAID) across Web2 APIs, EVM networks, and Hedera. Learn how to create deterministic AIDs, wrap existing DIDs, and resolve agent identities with the Standards SDK.
Hashgraph Online has published HCS-14 (Universal Agent Identifier), a draft standard and SDK that gives AI agents a single, portable identifier across Web2 APIs, Web3 networks, and hybrid systems. HCS-14 works alongside self-sovereign identity by wrapping existing DIDs where they exist and providing deterministic identifiers where they do not, enabling reliable discovery and routing across protocols.
Status: Draft. We welcome feedback from the community in the HCS‑14 discussion.
HCS‑14 is network‑agnostic. It works across Web2 (A2A/REST), EVM/ETH, and more. Hedera support is optional. We start with Web2 and EVM, then cover Hedera.
TL;DR
Why Agent Identification Needs to Be Universal
Agents live across different stacks and transports. One team ships a help desk assistant behind a REST endpoint, another deploys a market making bot with an EVM address, and a third lists an MCP server in a registry. You end up juggling three naming schemes for one concept. That makes discovery brittle and cross‑protocol routing harder than it should be.
HCS‑14 cuts through the noise with a compact identifier that stays stable as endpoints change and plays well with existing standards. Fewer glue scripts. Fewer mismatched IDs. Easier interop.
What HCS-14 Is
HCS-14 defines a universal agent identifier (UAID) with two complementary targets:
1. Deterministic AID (for agents without an existing DID)
2. UAID wrapping a DID (for agents that already have a DID)
Both forms accept a minimal set of routing parameters (for example, uid, protocol, native network ID) to make discovery straightforward without bloating the identifier.
HCS‑11 Primer: Profiles on Hedera
HCS‑11 defines a profile document for agents and MCP servers. Profiles live on Hedera as messages in a topic, so you can update them over time without changing the identifier. A Hedera account memo holds a compact pointer to the profile topic.
How it fits together
hcs-11:hcs://1/0.0.123456 so wallets and tools can find the profile quickly.Minimal examples
Account memo → hcs-11:hcs://1/0.0.123456
{
"version": "1.0",
"type": 1,
"display_name": "HCS-10 Demo Agent",
"alias": "hcs-10_demo_agent",
"bio": "Demo created via HCS-10 createAgent (with UAID attached)",
"inboundTopicId": "0.0.6809294",
"outboundTopicId": "0.0.6809293",
"aiAgent": {
"type": 1,
"capabilities": [0],
"model": "demo-model"
},
"uaid": "uaid:did:7L6c8nDbwXah2KCZTrdC7xPxbhDtYmJFhgb44habP4Jg_0.0.6809295;[email protected];proto=hcs-10;nativeId=hedera:testnet:0.0.2659396"
}
The SDK can attach a UAID automatically when you create a profile for an HCS‑10 agent on Hedera. It derives uid from HCS‑11 (prefer inboundTopicId@accountId) and uses Hedera CAIP‑10 for nativeId.
Resolve UAID from a profile and fetch DID
const fetched = await hcs11.fetchProfileByAccountId(accountId, 'testnet');
const uaid = fetched.profile?.uaid;
const doc = uaid ? await hcs14.getResolverRegistry().resolveUaid(uaid) : null;
Demos
pnpm run demo:hcs-11:profilepnpm run demo:hcs-11:resolve-uaidDesign Notes
Identifier vs. Identity
HCS‑14 intentionally standardizes an identifier, not the full concept of “identity.” That distinction matters:
What belongs in “identity” for agents is an open question that we want the community to help shape. Some questions we’re exploring together:
Current stance (separation of concerns):
We invite feedback on these questions in the HCS‑14 discussion.
Who Should Use This Now
Adapters and Environment Support
HCS‑14 uses adapters so the same code works across environments and DID methods:
did:hedera; add your own if you need another DID method.did:hedera; contribute issuers for other methods.Issuers (DID adapters)
HCS‑14 includes a DID issuance adapter registry with a built‑in Hedera issuer. You can contribute issuers and resolvers for additional DID methods and networks.
We welcome contributions across DID methods and CAIP namespaces.
How to contribute an Issuer (quick path)
standards-sdk/src/hcs-14/issuers/ (for example, foo.ts).DidIssuer with two methods and minimal metadata:supports(method: string): boolean
- issue(request: DidIssueRequest): Promise returning a did::...
- meta with id and didMethods so tools can list your adapter
standards-sdk/src/hcs-14/index.ts so apps can import it.supports and issue work and handle basic errors.Reference: adapter guide in the SDK docs
For Resolver adapters, see:
Get Involved
We invite developers, operators, and standards practitioners to review the draft, try the SDK, and share feedback.
Quick Examples (at a glance)
Install
pnpm add @hashgraphonline/standards-sdk
Create a UAID (Web2)
const hcs14 = new HCS14Client();
const aid = await hcs14.createUaid(
{
registry: 'acme',
name: 'Support',
version: '1.0.0',
protocol: 'a2a',
nativeId: 'acme.example',
skills: [0, 17],
},
{ uid: 'support' }
);
Wrap an existing DID (did:web)
const uaid = hcs14.createUaid('did:web:agent.example', {
uid: 'bot',
proto: 'a2a',
nativeId: 'agent.example',
});
Hedera (optional): issue did:hedera and generate UAID
const { did, uaid: hederaUaid } = await hcs14.createDidWithUaid({
issue: { method: 'hedera', client: hederaClient },
proto: 'hcs-10',
});
Resolve a UAID (Hedera)
const doc = await hcs14.getResolverRegistry().resolveUaid(hederaUaid);
Demos
pnpm run demo:hcs-11:profilepnpm run demo:hcs-11:resolve-uaidConclusion
Agents deserve a single handle that travels with them, no matter the protocol. That is what HCS‑14 delivers: a compact, durable identifier you can count on, with room for richer identity and trust to live where it belongs, in DID Documents, profiles, and credentials.
HCS‑14 is network‑agnostic by design. Start with Web2 and EVM, add Hedera when you need it, and keep the door open to other methods and networks through the adapter system. The result is simpler wiring, cleaner discovery, and fewer mismatched IDs.
Huge thanks to the HCS‑14 authors whose ideas, feedback, and solutions shaped the current draft: Michael Kantor (Kantorcodes), Patches (TMCC_Patches), Ahmer Inam, Jake Hall, and Sam Nanthans.
Thank you to the Hiero and Hashgraph team for production‑grade Hedera DID tooling. Special thanks to Keith Kowal, Alexander Shenshin, and other contributors to the Hiero DID SDK, Method, and implementation. The Standards SDK integrates the Hiero DID SDK by default for issuing and resolving did:hedera (repo: https://github.com/hiero-ledger/hiero-did-sdk-js; packages: @hiero-did-sdk/registrar, @hiero-did-sdk/resolver). We’re excited to hear how you use UAIDs in the wild. Share feedback, propose extensions, and help shape the broader definition of “agent identity” in the discussion thread.
More from the blog

Building a Decentralized Registry in Go with HCS-2 on Hedera
Learn how to build and operate a decentralized topic registry using the new Hashgraph Online Standards SDK for Go.
Read
HCS-14 Profiles and .agent's AID Resolution
Toward a modular framework for agent identity and discovery using HCS-14 Universal Agent IDs, profiles, and the AID Resolution standard for Web and DNS.
Read
Discover the best Virtuals Agents with the HOL Registry Broker
Use Hashgraph Online's Registry Broker to search and discover Virtuals ACP agents on Base. Filter by graduation status, category, and offerings to find the right agents for your workflows.
Read