The flow of funds is chosen when you create the company (user funded or company balance). A company owner can switch models from the dashboard’s Company balance page, but only until the company first moves money (a card is funded, a transfer runs, or a deposit lands). After that the two models’ funds would mix on the same collateral, so the choice locks; to change it then, create a new organization or contact us.
The flow of funds

User funded: from create_card to the agent paying the merchant
- A connected user’s agent calls
create_card. If the user’s balance covers the amount (plus fees), the card mints immediately and the agent pays the merchant. - If the balance is short,
create_cardreturnswallet_funding_required. The agent callsadd_funds, which returns a secure checkout link — the user pays with Apple Pay, Google Pay, or card in their browser, in USD. Funding reuses the identity verification the user already completed to create cards, so there’s no extra step. - While the deposit settles,
create_cardreturnsdeposit_confirming— the agent waits the suggested interval and retries. No second payment is ever needed. - The card mints,
card.createdfires, and the agent pays the merchant as usual. Unused balance from a closed card stays in the user’s balance for their next card.
What your integration looks like
Almost nothing. The funding conversation happens entirely between the user’s agent and Agentcard — your backend provisions cardholders, mints buy tokens, and listens to webhooks, but never handles a funding step. Increate_card terms this is funds_source: "onramp_flow", the default, so agents never need to pass it.
Balance tools
These run in the user’s own MCP session (via Connect with Agentcard):Funding from your own UI (API)
If you’re building an embedded funding experience — your app shows the balance and an “Add funds” button — the same flow is available server-to-server on the v2 API, so the user never leaves your product:
See the Funding a wallet guide for the full server-to-server flow, including the embedded in-app checkout.
All three endpoints work in test mode too: sandbox connect identities get a simulated balance whose funding sessions settle by themselves, so you can rehearse the whole loop before going live — see User wallet in test mode.
Funding with USDC directly
If you already hold USDC — say you’re paying a user a commission or reward they earned through your platform — you can skip the checkout entirely and send it straight to the user’s balance. Every verified user’s wallet is a real address on Base: USDC sent to it becomes their spending power, spendable on cards and withdrawable through their normal balance tools. There is no fee and no markup — what you send is what they get. The contract:- The user must be verified first. Deposit addresses activate when identity verification approves — wait for
identity.verification.updatedwithstatus: "approved"before sending. Funds sent earlier sit at the address untouched until the user completes verification; nothing is lost, but nothing settles either. - Read the address fresh from
GET /api/v2/walleteach time — don’t cache it in your database. The response’saddressis the deposit address. - Send USDC on Base only, at least $1 per transfer. Other tokens or networks are not credited.
- Settlement takes a few minutes (typically under 15): the deposit is detected, moved into the user’s spending collateral, and credited. Your confirmation is the
user_wallet.fundedwebhook —user_idplus the settledamount_usdc— or pollGET /api/v2/walletand watchspending_power_usdcrise. Your on-chain transaction hash is your receipt for the send itself.
Direct deposits are live-mode only — test-mode identities have no on-chain address (
address is null). Rehearse the equivalent flow in test mode with funding sessions, which settle themselves.