You Can Now Attest Your AI Agent in Zipwire
31 Oct 2026
31 Oct 2026 by Luke Puplett - Founder
Last week I wrote about Know Your Agent: banks finding AI agents in customer accounts, and the question of who invited them. In the bit where I owned up to what wasn't built, I said creating delegations inside Zipwire was "coming soon".
It's here. If you've been verified by Zipwire, you can now attest your AI agent from the Attest tab, in one signature from your own wallet.
What it is
When you pass Zipwire's ID check, your wallet gets an IsAHuman attestation on Base: an on-chain stamp that says a real, verified person holds this wallet. It says nothing about your name or your passport.
Attesting an agent adds one more link. You sign an IsDelegate attestation on the Ethereum Attestation Service (EAS). Your wallet is the attester, the agent's wallet is the recipient, and its refUID points back to your IsAHuman. In plain words: "this agent acts for me, and here's the proof I'm a real person".
It always expires, and you can revoke it whenever you like.
Why it matters
Agents look like their owners. They carry the same tokens and keys, so a service can see what an agent does but not whether anyone actually wanted it there.
A delegation fixes the second part. Any service can take the agent's wallet address and walk the chain on-chain: agent, to your IsDelegate, to your IsAHuman, to an attester it trusts. If every link holds, a verified human stands behind that agent. The service doesn't need your ID to know it, and by default it doesn't learn who you are.
That's pseudonymous, not anonymous. The chain is public, so anyone looking can see your wallet address and that it delegates to the agent's. Worth knowing before you use the wallet you also buy your NFTs with.
First, your agent needs a wallet address
What you'll need: a verified Zipwire account, the wallet that holds your IsAHuman, and a little ETH on Base in that wallet to pay the network fee when you sign. Your agent doesn't need anything except an address.
If you're not technical, don't worry about this bit: just ask your agent for its wallet address. Most agents can run Python or install whatever tooling they need, so the agent sorts it out and hands you back an address starting with 0x.
An agent wallet is just a key pair. It's free to create and it isn't an account anywhere. It doesn't need any ETH to be attested: you're the one who signs, so the fee comes out of your wallet, not the agent's. (If your agent will do things on-chain itself later, such as paying for something, it'll need its own ETH for that. Being attested isn't one of those things.) The agent keeps the private key in its own vault or secrets store. Only the 0x address gets pasted into Zipwire; the private key never leaves the agent and never goes into Zipwire.
If you'd like a ready-made prompt, try: "Create an Ethereum wallet for yourself, keep the private key in your secrets store, and tell me the address."
For the curious, the common route is Python:
# pip install eth-account
from eth_account import Account
acct = Account.create()
print(acct.address) # the 0x address to paste into Zipwire
# acct.key is the private key: it goes into the agent's vault, nowhere else
Foundry's cast wallet new, ethers.js or Nethereum do the same job if your agent prefers them.
How it works
Get verified. If you haven't already, complete the ID check and claim your
IsAHuman.Open My proofs, then Attest. Connect the same wallet that holds your
IsAHuman. The page won't let you sign from a different one.Enter the agent's wallet address, and a name if you like, such as "Claude Code laptop". The name stays private in Zipwire and doesn't go on-chain.
Choose how long it lasts: 7, 30 or 90 days, or a year.
Review and sign. You'll see the agent, the expiry and the
IsAHumanit points to. Then you sign from your own wallet, which pays a small ETH network fee on Base Mainnet.
That's it. Zipwire reads the new attestation back from the chain and lists it, so you can revoke it later from the same page.
Note who signs. You do. Zipwire doesn't relay it, doesn't hold a key that can act for you, and doesn't pay the gas. That's deliberate: a delegation that Zipwire could have made on your behalf would be a much weaker statement about what you wanted.
How a service checks it
Two ways, depending on how much you want to trust us.
Check it yourself with ProofPack. The open-source ProofPack libraries include IsDelegateAttestationVerifier. Give verifyByWallet the agent's wallet address (it's VerifyByWalletAsync in .NET). It finds the agent's IsDelegate attestations through EAS's GraphQL index and walks each chain to its root. At every hop it checks the attestation isn't revoked or expired, that each parent's recipient is the child's attester, and that the root is an IsAHuman from an attester you've chosen to trust. It returns the first valid chain, or a failure with a reason code such as MISSING_ATTESTATION.
Or ask Zipwire. GET https://zipwire.io/api/v1/is-delegate/{wallet} is public and needs no API key. It runs the same ProofPack verifier and returns each of the wallet's delegations with valid, pointsToHuman and an EAS explorer link. It's quicker to wire up, but you're trusting our check rather than doing your own. The IsDelegate API docs have the details.
Either way, you get a yes or no about the address, which you can build policy on. What the agent is then allowed to do is still up to you.
Neither check proves who is calling you. A wallet address is public, so anyone can present a delegated agent's address and claim to be that agent. Before you trust a request, your app needs to get the caller to sign something with the wallet's private key, and check the signature. That's the next section.
Proving the agent holds the wallet
The address is right there on-chain in the delegation, so it proves nothing about who is calling you. Only the agent holds the matching private key, and a signature is how it shows that.
You can close that gap today with a standard Sign-In with Ethereum (SIWE, EIP-4361) challenge. Your service writes a short message with your own domain, a random single-use nonce and a five-minute expiry. The agent signs it with its key, which never leaves the agent. You check the signature recovers to the agent's address, that the domain is yours, that the nonce hasn't been used and that it hasn't expired. Then you run the delegate check on that address. Any SIWE library will do the verifying.
On the agent's side it's a couple of lines of Python:
from eth_account import Account
from eth_account.messages import encode_defunct
# message is the SIWE text your service sent; key comes from the agent's vault
signed = Account.sign_message(encode_defunct(text=message), private_key=key)
print(signed.signature.hex()) # send this back with the message
Use your own domain in the message, not ours. If services accepted signatures over each other's messages, a dodgy one could pass a challenge along and replay the answer somewhere else.
If you'd rather not run the SIWE step yourself, Zipwire has a sample you can call. POST https://zipwire.io/api/v1/is-delegate/verify with {"wallet": "0x…"}. If the wallet has a live delegation you get a 401 with a SIWE challenge; if not, a 404. The agent signs the challenge (the same Python as above) and you post the message and signature back to the same endpoint. A 200 with controlProven: true, plus the delegation result, tells you the caller holds the wallet's key and that a verified human delegated to it. We tell you about the attestation and nothing about the human.
One catch. The challenge names Zipwire as the domain, so this proves control to Zipwire. If you relay it for your own caller, a dodgy service could do the same and pass an agent a challenge that was really meant for someone else. When that matters, issue your own challenge with your own domain.
What it doesn't do yet
Same deal as last time: I'd rather you heard the limits from me.
The proof is a one-off. A signed challenge shows the agent held its key at that moment. It doesn't sign each request after that, and there's no per-request signing yet.
Web page only, for now. You create delegations in My proofs. A
zwcommand and MCP tools are coming.Agents still use API keys with us. They can't sign in to Zipwire's own API with a delegation yet; the API takes an API key or OAuth token.
Sub-agents aren't in the UI. Checks can follow longer chains, but the page only creates human-to-agent delegations.
We don't check the address you paste. Nothing confirms it belongs to your agent, so double-check it before you sign.
No limits on what the agent can do. A delegation says "this agent acts for me", not "it may spend up to £50". There's a capabilities field, set to zero, until we've designed it properly.
Where to go next
If you're verified, go to My proofs, then Attest, and try it. The step-by-step guide is in the docs: Authorizing your agent.
If you run a service that agents call, start with the ProofPack libraries or the IsDelegate API. The Know Your Agent page has the short version for risk and compliance teams.
Last week the question was which agents were invited. Now there's a way to send the invitation.
That's lovely and everything but what is Zipwire?
Zipwire Collect handles document collection for KYC, KYB, AML, RTW and RTR compliance. Used by recruiters, agencies, landlords, accountants, solicitors and anyone needing to gather and verify ID documents.
Zipwire Approve manages contractor timesheets and payments for recruiters, agencies and people ops. Features WhatsApp time tracking, approval workflows and reporting to cut paperwork, not corners.
Zipwire Attest provides self-service identity verification with blockchain attestations for proof of personhood, proof of age, and selective disclosure of passport details and AML results.
For contractors & temps, Zipwire Approve handles time journalling via WhatsApp, and techies can even use the command line. It pings your boss for approval, reducing friction and speeding up payday. Imagine just speaking what you worked on into your phone or car, and a few days later, money arrives. We've done the first part and now we're working on instant pay.
All three solutions aim to streamline workflows and ensure compliance, making work life easier for all parties involved. It's free for small teams, and you pay only for what you use.