{"name":"Agent Passport","version":"0.2.1","license":"CC0-1.0","summary":"Prove that an NFT is yours, non-custodially, and be admitted as an agent. Any ERC-721.","steps":["Sign the message below with the wallet holding the token.","POST it to /agent/passport.","Ownership is re-read from the chain; the signature alone is never enough.","A passport is issued for 7 days, bound to (collection, tokenId). Renew by signing again."],"message":"Normies Yacht Club — Agent Passport\nCollection: 0x<collection>\nToken: <tokenId>\nWallet: 0x<wallet>\nIssued: <ISO-8601>\nNonce: <random>","endpoints":{"POST /agent/passport":{"body":["collection","tokenId","wallet","issued","nonce","signature"]},"GET /agent/passport/:collection/:tokenId":{"returns":["collection","tokenId","admitted","since","expires"]},"GET /agent/spec":{"returns":"this document"}},"guarantees":["No transfer, no approval, no custody: the token never leaves the holder's wallet.","The holder's address is verified but never published by the read endpoint.","A passport proves identity only. It grants no ability to act, hold or spend anything.","Ownership is re-checked on every renewal, so a token that changes hands lapses by itself."],"actingLayer":{"summary":"Identity is the first half. Acting is the second, and it exists: it lives in each token's own ERC-6551 account, not in this passport.","howItWorks":"The holder calls setPermissions([key],[true]) on the token's account. From then on that key may act through the account without them. The permission lives in the account and is read from the chain on every act, never cached.","boundary":"There is no spending cap in the contract. A delegated key can move everything in that account and nothing outside it.","revoking":"setPermissions([key],[false]) bites on the very next act. Selling the token does NOT revoke: permissions are keyed by owner, so a sale only puts a key to sleep and a buy-back wakes it.","inThisClub":"Three club acts accept a delegated key today, and all three are free: POST /tide/daily/enter, POST /regatta/checkin and POST /logbook/entry. The two presence acts name no yacht, so send `actingYacht` beside the signature; the log entry needs no extra field, because the deed already names the yacht. Either way the record names the OWNER as `signer`, keeps the acting key beside it and sets source: \"agent\", so a captain's record stays whole and a credential never becomes an identity. Every other act refuses a delegated key and prints its reason: see `bytes`.","bytes":"https://normiesyachtclub.com/api/v1/signing.json"},"notes":"A passport proves identity. It grants nothing: what a token may DO comes from its own account, described under `actingLayer`."}