Table of Contents
Operators building AI agents that spend USDC need a wallet the user owns, a delegated signer the agent can use without a prompt per tx, and a revoke path when the agent should stop.
Crossmint Agent Wallets are that stack: a non-custodial user smart wallet, a server signer authorized with a one-time email code, and wallet.send for USDC (or staging USDXM) signed entirely on your backend.
This guide walks the public Crossmint docs flow as of September 18, 2026: staging keys, create-on-login wallet on base-sepolia, authorize with prepareOnly: true, fund with stagingFund(5) USDXM, send stablecoins, then revoke.
Key Takeaways
- Crossmint Agent Wallets give a user-owned smart wallet plus a delegated server signer for USDC spends.
- Staging quickstart needs Node.js 20+, client + server API keys, and a 32-byte CROSSMINT_SIGNER_SECRET.
- Authorize with addSigner prepareOnly:true, then the user approves via email OTP before the agent can sign.
- Staging mints 5 USDXM via stagingFund(5); production uses USDC on Base (0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913).
- Named downside: anyone with the signer secret can sign every wallet it was authorized on; revoke with the user recovery signer only.
What Crossmint Agent Wallets are (and aren't)
In Crossmint's Agents overview, Agent Wallets are the non-custodial stablecoin path next to Agent Cards and Agent Checkouts. The wallet is owned by the end user. The agent is a scoped delegate.
Crossmint's Stablecoin Wallet Quickstart targets about 10 minutes to a running app: sign in, get a wallet, authorize the agent, fund, and send. The reference repo is Crossmint/stablecoin-wallet-quickstart on GitHub.
| Step | What happens | Who signs |
|---|---|---|
| 1. Authenticate | Email OTP or Google via CrossmintAuthProvider | User |
| 2. Create wallet | createOnLogin on base-sepolia with email recovery | User recovery signer |
| 3. Authorize agent | addSigner({type:"server"}, {prepareOnly:true}) then email approve | User then server signer |
| 4. Fund | stagingFund(5) USDXM (staging) or USDC onramp/transfer (prod) | N/A / user |
| 5. Send | wallet.useSigner + wallet.send(recipient, "usdc"|"usdxm", amount) | Server signer |
| 6. Revoke | wallet.removeSigner with user email signer active | User only |
This is not Coinbase Agentic Wallet (awal) and not Circle Agent Wallet. Those are separate how-tos on Stablecoin Insider. Crossmint is the SDK path where your backend holds a server signer secret and the user keeps email recovery.
Prerequisites (as of Sep 18, 2026)
Crossmint's quickstart requires:
- Node.js 20+ and pnpm
- A Crossmint Staging Console project with a client-side key (ck_…) and a server-side key (sk_…)
- A 32-byte CROSSMINT_SIGNER_SECRET (raw 64-char hex or xmsk1_<64-hex>)
- Env vars: NEXT_PUBLIC_CROSSMINT_CLIENT_API_KEY, CROSSMINT_SERVER_SIDE_API_KEY, CROSSMINT_SIGNER_SECRET
Staging keys come with all scopes enabled by default. Develop on base-sepolia with staging keys. Production uses base with production keys and real USDC.
Step 1. Clone the quickstart and install
Clone github.com/Crossmint/stablecoin-wallet-quickstart, run pnpm install, then copy .env.example to .env.local and paste your keys.
Generate the signer secret once and store it only as a server-side environment variable. Crossmint docs warn that anyone who holds the secret can sign on behalf of every wallet it has been authorized on.
Step 2. Create the user wallet on login
Wrap the app with CrossmintProvider, CrossmintAuthProvider (email and Google), and CrossmintWalletProvider with createOnLogin={{ chain: "base-sepolia", recovery: { type: "email" } }}.
On first login the SDK creates a non-custodial smart wallet with the user's email as the recovery signer. useWallet() exposes wallet.address when status is loaded. Creation is idempotent: repeated calls return the same wallet.
For non-React or custom auth backends, use @crossmint/wallets-sdk with wallets.createWallet({ chain, owner: `userId:${userId}`, signer: { type: "email", email } }). Server-side creation requires an explicit owner so later getWallet calls resolve correctly.
Full create steps live in Crossmint's Create a User Wallet guide.
Step 3. Authorize the agent with prepareOnly
Authorization is a two-step dance so the user stays in control. See Authorize the Agent.
3a. Register the server signer (backend)
From a server action, call wallet.addSigner({ type: "server", secret: process.env.CROSSMINT_SIGNER_SECRET }, { prepareOnly: true }). That returns locator and signatureId. The secret never leaves your backend.
Always pass prepareOnly: true from the server. If you omit it, the SDK can auto-approve with the server signer itself and the user never sees a prompt.
3b. User approves with email OTP (client)
On the client, activate the email signer with wallet.useSigner({ type: "email", email: user.email }), then wallet.approve({ signatureId }). That triggers the one-time email code. After verification, wallet.signers() should show an entry with type: "server".
Step 4. Fund and send USDC (or staging USDXM)
Crossmint's Using the Wallet guide is the send path.
On staging, wallet.stagingFund(5) mints 5 USDXM into the wallet (staging-only). For production USDC, use Crossmint Onramp & Add Funds or a direct transfer. Base mainnet USDC contract in Crossmint production notes: 0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913.
Before signing, activate the server signer on that wallet handle:
await wallet.useSigner({ type: "server", secret: process.env.CROSSMINT_SIGNER_SECRET })
Then send:
const tx = await wallet.send(recipient, "usdc", amount) (use "usdxm" on staging). Crossmint docs state gas is sponsored by default on supported chains, so the user does not need ETH for gas on those paths.
Calling useSigner is per handle. If you getWallet again, call useSigner again before signing.
Step 5. Revoke agent access
When the agent should stop spending, revoke the server signer. Crossmint's Remove Agent Access flow requires the user's recovery signer, not the agent.
Activate wallet.useSigner({ type: "email", email: user.email }), then wallet.removeSigner({ locator }). Persist the locator from addSigner against each wallet. The same secret produces a different locator per wallet. Revocation is per-wallet.
An agent cannot revoke itself. If the server signer is active when you call remove, the request fails by design.
Crossmint Agent Wallet vs other SCI wallet how-tos
| Product | Owner model | Agent auth | Primary surface |
|---|---|---|---|
| Crossmint Agent Wallets | User-owned smart wallet + email recovery | Server signer + email OTP | @crossmint SDKs / quickstart |
| Coinbase Agentic Wallet | Coinbase TEE-backed agent wallet | Email OTP via awal CLI | awal CLI / payments-mcp |
| Circle Agent Wallet | Circle developer wallet stack | Circle APIs / agent tooling | Circle docs + SCI Circle how-tos |
For a general wallet bootstrap checklist, see how to set up an AI agent wallet. For funding patterns, see how to fund an AI agent wallet with USDC. For HTTP micropayments after the wallet exists, see how to accept x402 USDC from AI agents and how to charge for MCP tools with Cloudflare Agents x402.
Who this is for (and who should skip it)
Use Crossmint Agent Wallets if you need a user-owned USDC wallet, backend-signed agent spends, and a clean revoke path with email recovery.
Skip it if you only need a one-shot x402 buyer fetch (start with Coinbase AgentKit), or if your compliance model forbids a shared server signer secret across many user wallets without per-tenant secrets and hard spend caps.
Need the wallet bootstrap first? Start with Stablecoin Insider's AI agent wallet setup guide, then come back to Crossmint authorization.
FAQ
What is a Crossmint Agent Wallet?
A Crossmint Agent Wallet is a non-custodial user smart wallet that can authorize an AI agent as a delegated server signer to send stablecoins (USDC in production, USDXM in staging) without a user prompt per transaction.
How do you authorize a Crossmint agent to spend USDC?
Call wallet.addSigner with type server and prepareOnly true from your backend, then have the user approve the pending signature with an email OTP on the client. Only after that can the server signer move funds.
What does stagingFund(5) mint?
On supported staging chains, wallet.stagingFund(5) mints 5 USDXM into the wallet for local development. It is staging-only. Production wallets need real USDC via onramp or transfer.
Which Base USDC contract does Crossmint production use?
Crossmint production notes list Base mainnet USDC at 0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913. Staging uses base-sepolia with USDXM test balances.
Can the agent revoke its own Crossmint signer?
No. Removal must run with the user's recovery signer active (for example email). If the server signer is active, removeSigner fails by design.
Is Crossmint Agent Wallet the same as Coinbase Agentic Wallet?
No. Crossmint uses @crossmint SDKs and a backend CROSSMINT_SIGNER_SECRET. Coinbase Agentic Wallet uses the awal CLI and Coinbase TEE infrastructure. Stablecoin Insider covers both as separate how-tos.
This content is provided for informational and educational purposes only and does not constitute financial, investment, legal, or tax advice; no material herein should be interpreted as a recommendation, endorsement, or solicitation to buy or sell any financial instrument, and readers should conduct their own independent research or consult a qualified professional.