Skip to content

Start typing to search the documentation.

Registration modes

On this page

Every mode produces the same on-chain result: a soulbound agent NFT backed by a human proof. The modes differ in who holds the agent key and who owns the NFT. Pass the mode to requestRegistration({ mode }), POST /api/agent/register or the A2A register intent.

Mode comparison

ModeAgent keyNFT ownerHuman address
linkedServer-generated EVM key (you export it)Human’s walletRequired
wallet-freeServer-generated EVM key (you export it)The agent’s own addressNot used
privySame as linkedHuman’s Privy embedded walletRequired
smartwalletSame as linkedHuman’s passkey smart walletRequired
ed25519The agent’s own Ed25519 keyAddress derived from the pubkeyNot used
ed25519-linkedThe agent’s own Ed25519 key, with the human’s wallet as guardianAddress derived from the pubkeyRequired

The API also accepts the aliases walletfree and smart-wallet. The SDK, REST API and A2A support all six modes; the CLI supports linked and wallet-free.

Which mode?

  • The agent already has an Ed25519 key (OpenClaw, ElizaOS, and similar): ed25519, or ed25519-linked if a human wallet should be able to revoke it.
  • The human has a wallet: linked. Use privy or smartwallet when that wallet is a Privy embedded wallet or a passkey smart wallet.
  • No wallet at all: wallet-free, the quickest start.

Linked

The server generates a dedicated EVM key for the agent, and the human’s wallet (humanAddress) owns the agent NFT. The human’s wallet key is never shared with the agent. After the scan, export the agent key within 30 minutes.

Use it for autonomous agents that need their own key while a human wallet keeps ownership.

Wallet-free

Like linked, but the agent’s own address owns its NFT, so the human needs no wallet. The agent key can manage its own metadata (for example with setAgentCard). To remove the agent, the human scans again to deregister.

Privy and smart wallet

privy and smartwallet behave exactly like linked on the server: send the human’s Privy embedded wallet or passkey smart wallet address as humanAddress, and that wallet owns the NFT. Wallet creation and login happen in your own frontend.

Ed25519

For agents that already sign with Ed25519. The agent keeps its key, so there is nothing to export.

  1. POST /api/agent/register/ed25519-challenge with the 64-hex pubkey and network returns challengeHash.
  2. The agent signs the 32 raw bytes of challengeHash with its Ed25519 key.
  3. Register with ed25519Pubkey and the 128-hex ed25519Signature, and the human scans the QR code.

The NFT is minted to an address derived from the public key (Ed25519Agent.deriveAddress(pubkey)). Full example: Ed25519 challenge.

Ed25519-linked

ed25519 plus a guardian: send the human’s wallet as humanAddress to both the challenge and the register call. The guardian can revoke the agent on-chain at any time with guardianRevoke(agentId).

Verification configs

disclosures.minimumAge (0, 18 or 21) and disclosures.ofac select one of six on-chain verification configs. The response’s configIndex tells you which one.

Config indexMinimum ageOFAC screening
0NoneOff
118Off
221Off
3NoneOn
418On
521On

Use the same disclosures when you deregister or refresh the agent.

Disclosed credentials

The human can also disclose nationality, name, date_of_birth, gender and issuing_state (each a JSON boolean in disclosures). Disclosed values are stored on-chain as ZK-attested credentials and returned by getCredentials() and /api/agent/info. Every disclosure is optional, and raw passport data never leaves the phone.

Was this page helpful?