agentcard-signup
Use when signing up or resuming an AgentCard account. The acp card setup order (whoami, signup, signup-poll, profile, payment method, limit), the poll schedule, the magic link from the agent inbox and
SKILL.mdiclone/skills/agentcard-signup/SKILL.md
GitHubAgentCard signup — one account, one link, no duplicates
The CLI fixes the order: signup → profile → payment method → limit → issue. You drive the first four
through ~/.iclone-os/bin/acp --inft <iNFT> card … --json (economyos). The app refuses card issue; owner
runs it in their terminal. Every answer carries nextStep; follow it.
Which path. This skill is the iNFT's card through Virtuals (acp card): the account the Bank window and the Setup
wizard show. The owner's own agentcard.ai account is a different account on the agentcard CLI (0.4.0): Mastercard
Agent Pay, agentcard identity for KYC. For that one, open agentcard-cli (and the official agentcard skill).
Never mix them: a sign-in on one is not a sign-in on the other.
What sends a link. Only card signup --email … sends a sign-in e-mail. card whoami only reads: its 200
verified: false ("Magic link sent but not clicked yet") is about a link sent EARLIER. The Bank window never sends one
on open; its "Send sign-in link" button runs one card signup on the owner's click, then waits a minute.
When to use
- The owner asks for a card, or a purchase needs one and
card whoamiis not verified. - A signup started earlier (you, the wizard, before a restart) must be finished.
Prerequisites
- The agent email exists (
agent-email): the magic link lands in that inbox. - Consent
sendMessages(signup sends an email) andspendTrade(payment method, limit) — ask through the door.
Quick reference
| Step | Command (after ~/.iclone-os/bin/acp --inft <iNFT>) |
Write? |
|---|---|---|
| state | card whoami --json |
no |
| signup | card signup --email <email> --json → state |
yes, sends mail |
| poll | card signup-poll --state <state> --json → done |
no |
| profile | card profile --json · card profile set --first-name <first> --last-name <last> --phone-number <+E164> --json |
set = yes |
| payment | card payment-method --json → url |
yes |
| limit | card limit --json · card limit set --amount <cents> --json (min 100) |
set = yes |
Procedure
Read the state first, every time:
~/.iclone-os/bin/acp --inft <iNFT> card whoami --jsonMap it as the app does, in this order (first match wins):
verified: true= ready → skip to step 5. Never sign up again.- A 200 with
verified: false= signin-pending with no state token: a link is out. Fetch it (step 4), then re-readcard whoamievery 3 minutes (the app's pending TTL), or poll a<state>kept from your own signup; the server wins. - An HTTP 401 error carrying
REAUTH:<state>:<email>= signin-pending: resume that<state>(step 3); the server's state wins over a remembered one. TIMEOUT,NOT_AUTHENTICATED,NO_ACTIVE_AGENT, no output = the probe did not run; so does an error saying the ACP session is gone (Session expired,not authenticated,no active agent,run acp configure), whatever its HTTP status. The last known state holds. It is NOT "none".- HTTP 403/429 or "blocked / locked / suspended" = blocked: stop, see
agentcard-troubleshooting. - A plain HTTP 401 / "unauthorized" = signin-pending, no state token: as the 200 case.
- HTTP 400 "not set up" / "call card signup" = none: the only answer allowing step 2. A bare 400/404 is no answer.
- Anything else (HTTP 5xx, empty
{}, an unrecognised error) is not an answer about the card: the last known state holds, NOT "none".
Only on none: ask through the consent door, naming the link's address; wait for yes.
~/.iclone-os/bin/acp --inft <iNFT> consent request sendMessages --reason "Send the AgentCard sign-in link to <email>" ~/.iclone-os/bin/acp --inft <iNFT> card signup --email <email> --json<email>is the agent's own address (email whoami) unless the owner names another — then the owner opens the link from their inbox and step 4 is skipped. Keep the returnedstate. One signup per state token: the app refuses another only during a signup, a 403/429 hold or the minute after the last link; the rule is yours.Poll with backoff 5 → 10 → 20 → 40 → 60 s, then every 60 s, for at most 15 minutes (≤ 18 polls):
~/.iclone-os/bin/acp --inft <iNFT> card signup-poll --state <state> --jsonSuccess is
done: trueonly — never infer it from words in a message.Fetch the link from the agent inbox (at most 3 tries; stop once found):
~/.iclone-os/bin/acp --inft <iNFT> email search --query "agentcard" --json ~/.iclone-os/bin/acp --inft <iNFT> email extract-links --message-id <message-id> --jsonKeep only links on the AgentCard host. Relay the link raw, on its own line, once per state token. Then poll the same
<state>; with no state token, re-readcard whoamievery 3 minutes.Profile: read it; set only what the owner gives you (never invent them).
Payment method: ask through the door (
spendTrade), runcard payment-method --json, relay theurlraw on its own line; the owner completes it in their browser.Limit:
card limit --jsonshowsspendLimitCents,spentCents,remainingCents. To change it, state the amount in dollars, ask through the door (spendTrade), wait for yes, thencard limit set --amount <cents> --json.Issue: tell the owner the card is ready to issue from their terminal, amount $1–$75 in whole dollars.
Pitfalls
card signupwithout--emailandcard limit setwithout--amounthang waiting for input: pass both.- 15 minutes without
done: say "still waiting — resume", keep the state. A NEW link while the server says signin-pending needs the owner's second yes; it restarts the wait. - 429 = wait 60 s; 403 or "blocked" = a 15-minute hold that survives an app restart. Never sign up into a hold.
- Never use a plain
acpor another config to dodge a refusal (economyos).
Never
- Never send a second signup without the owner's explicit confirmation.
- Never paste magic links, codes or card data into notes; never ask the owner for card numbers.
- Never run
card issue; never set a limit, a payment method or profile data without the owner's yes.
Verification
card whoami --json prints verified: true; card limit --json prints the spendLimitCents the owner approved.