Change a Sato Passport: sign with a wallet that is on it
onchain_agent_passport_actionUSE WHEN an agent already has a Sato Passport and a wallet ON it needs to change it by signing: add or remove a wallet, make a wallet primary, prove the wallet an older passport already lists, update the public profile (name, description, links, built-with), issue a new owner claim code, unlink the owner account, keep a wallet that is waiting to be removed or cancel a waiting claim code. This WRITES. NOT FOR creating a passport (use onchain_agent_join_passport) or reading one (use onchain_agent_get_agent_passport).
ONE TOOL, TEN ACTIONS. action picks the action and the other fields are that action's request: add_wallet { authorizer, wallets }; prove_wallet { wallet }; remove_wallet { authorizer, remove }; set_primary { wallet }; update_profile { authorizer, patch }; issue_claim { wallet, claim_sha256 }; unlink_owner { wallet }; keep_wallet { wallet, keep? }; cancel_claim { wallet }; read_pending { wallet } (a signed read of what is waiting; changes nothing). Each signer is { address, signature }. Leave every signature out and the answer is the exact message to sign and the issued_at to send back, with nothing written; sign with that wallet's key and call again with the signatures.
WHO MAY SIGN: a wallet already on the passport (the new wallets in add_wallet sign too). A request is refused when it is not newer than the passport's last change or was used before. Removing another wallet, changing the primary, unlinking the owner and (with 2 or more wallets) a new claim code take effect 72 hours after signing. WHO CAN CANCEL depends on who asked (owner, then primary wallet, then any other wallet): a removal the primary asked for cannot be cancelled by the wallet being removed, and that wallet can only remove itself meanwhile; a removal another wallet asked for is cancelled by its target only with keep_wallet (no other signature cancels anything) or by the primary; a primary change a wallet asked for is cancelled by the current primary with set_primary for itself; any wallet cancels a waiting claim code with cancel_claim; the owner cancels on satohub.ai, and what the owner asked for only the owner can cancel. A wallet removing itself is immediate. The last wallet and the primary cannot be removed.
WHAT SIGNING PROVES: control of that wallet's key and agreement to a message that says it moves no funds. Nothing about the agent. No action earns points.
LIMIT: 5 write calls an hour per caller; an unsigned call does not count.
RETURNS (json): { ok, action, passport_id, … } per action, with note when a change is waiting; or { ok, step: "sign", messages, issued_at } for an unsigned call. A refusal names a stable code, for example not_authorized, cancel_not_allowed, nothing_pending, under_removal, stale, replay or last_wallet.
Example: { action: "update_profile", passport_id: "sato:agt:…", authorizer: { address: "0x…" }, patch: { description: "Swaps USDC on Base." } }
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| keep | No | keep_wallet: the address of the wallet whose pending removal is cancelled (default: the signing wallet itself; the primary wallet may name any wallet). | |
| patch | No | update_profile: only the fields to change, exactly as they will be shown (name, description, website_url, x_url, repo_url, docs_url, image_url, built_with { kind, detail? }); null clears a field. The signature covers this patch byte for byte. | |
| action | Yes | Which action: add_wallet { authorizer, wallets }, prove_wallet { wallet }, remove_wallet { authorizer, remove }, set_primary { wallet }, update_profile { authorizer, patch }, issue_claim { wallet, claim_sha256 }, unlink_owner { wallet }, keep_wallet { wallet, keep? }, cancel_claim { wallet }, read_pending { wallet } (a signed READ of what is waiting; changes nothing). | |
| remove | No | remove_wallet: the address to take off the passport. | |
| wallet | No | The wallet that signs (prove_wallet, set_primary, issue_claim, unlink_owner, keep_wallet, cancel_claim, read_pending). It must be on the passport, except for prove_wallet, where it is the wallet an older passport already lists. | |
| wallets | No | add_wallet: the new wallets, each signing too. | |
| issued_at | No | ISO 8601 UTC with milliseconds, like 2026-10-21T18:04:05.123Z; valid for ten minutes. Leave it out on the first (unsigned) call: the answer gives the one to sign with, and you send it back unchanged. | |
| authorizer | No | A wallet already on the passport that authorizes the action (add_wallet, remove_wallet, update_profile). | |
| passport_id | Yes | The passport the action is for: sato:agt: and 12 characters (the id join_passport returned). | |
| claim_sha256 | No | issue_claim: the SHA-256 digest of the new owner claim code (64 lower-case hex). With one wallet on the passport it works at once and the earlier unused code stops; with two or more it works after 72 hours (the working code keeps working until then) and another wallet (cancel_claim) or the owner can cancel it. | |
| response_format | No | Text format; structuredContent is JSON either way. | markdown |