Skip to main content

Funding

In sandbox, the faucet drips test USDC (and a little ETH for gas) into a wallet so you can exercise payments without real money. It is TEST-only and rate-limited — see the caps in Environments.

AssetDefault dripMax per drip
usdc2501000
eth0.020.02

Drips are additionally rate-limited per wallet and per tenant. There is no live faucet — funding a sb_live_ wallet this way is rejected.

Key endpoints

MethodPathScopePurpose
POST/v1/wallets/{id}/fundwallets:fundDrip an asset into a wallet.
GET/v1/faucet/dripswallets:fundList drips (optional walletId filter).
GET/v1/faucet/drips/{dripId}wallets:fundGet one drip.

Fund a wallet

Body is optional — omit it to get the default 250 USDC. Both asset and amount are optional fields on FundWalletBody.

# USDC (specific amount)
curl -X POST https://api.sandbox.safebank.ai/v1/wallets/w_1a2b3c/fund \
-H "X-SafeBank-Api-Key: $SAFEBANK_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "asset": "usdc", "amount": "250" }'

# ETH for gas
curl -X POST https://api.sandbox.safebank.ai/v1/wallets/w_1a2b3c/fund \
-H "X-SafeBank-Api-Key: $SAFEBANK_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "asset": "eth" }'

The response is a Drip. status starts SUBMITTED and moves to CONFIRMED once the transfer lands (or FAILED, with a failureReason):

{
"id": "d_9z8y",
"walletId": "w_1a2b3c",
"asset": "usdc",
"amount": "250",
"chainId": 84532,
"status": "SUBMITTED",
"txHash": null,
"failureReason": null,
"createdAt": "2026-08-09T12:00:05.000Z"
}

Poll GET /v1/faucet/drips/{dripId} (or sb.faucet.getDrip(id)) until status is CONFIRMED and txHash is populated before spending the balance.

note

For live funding, move real USDC into the wallet's Safe address directly on Base (chainId 8453), or use the Bridge on-ramp surface. The faucet exists only in sandbox.

Next