An ENS name can be a verifiable ERC-8004 AI-agent identity. This guide is for anyone rendering that identity on a name - marketplaces, wallets, explorers - covering how it works, how to integrate, and, most importantly, what you can and can't trust.
Three standards combine:
agent-registration[<registry>][<agentId>] declaring "I am agent <agentId> in this registry."agent-context, and agent-endpoint[mcp|a2a|web]..eth 2LDs.Want your own ENS name to be an agent? ENS8004.xyz is a web interface for it - connect your wallet, bind your name's NFT to an ERC-8004 agent identity, and set the ENSIP-26 records that describe your agent (its endpoints and context).
A name is an agent when it has an on-chain binding in the ENS8004 adapter - that's what /domain/:name/agent lists under the registrations key in its response. Each registration carries two signals you should treat very differently:
| Field | Meaning |
|---|---|
is_bound | The adapter binds an agent to this name's ENS NFT, on-chain. |
has_ensip25_registration | A bonus signal: the name also carries a conformant ERC-7930 agent-registration record (ENSIP-25). |
is_bound: true means this ENS NFT is bound to that agent id on-chain. It says nothing about whether the agent is who its profile claims to be. Anyone can register a lookalike name (0pensea.eth), bind a real agent to it, and set the description, avatar, and MCP endpoint to impersonate a brand. The binding is genuine; the identity is not.
When you render the avatar or anything under profile, treat it as untrusted user content:
context is an arbitrary owner-set string - HTML-escape before display.agent-endpoint[mcp|a2a|web] are URLs the owner chose. Don't auto-fetch them server-side without an SSRF guard, and don't imply they're vetted.Three ways to integrate, by effort:
| Pattern | How | When to choose |
|---|---|---|
| Per-name lookup | Call GET /api/domain/:name/agent server-side when rendering a name's page. | Simplest. |
| Periodic sync | Walk GET /api/agents?page=N. Zero per-page-view API calls. | High-traffic surfaces; the full directory is small. |
| Fully independent | Index AgentBound events from the adapter contract yourself. | No dependency on this API. |
Full request and response detail for /domain/:name/agent, /agents, and /agents/:agentId lives in the Domains API reference.