1. Configure sandbox
Use a sandbox API key from your backend:2. Create a customer
Create an individual customer withPOST /v3/customers:
data.id as CUSTOMER_ID.
3. Choose the outcome
- Pay-in: receive USD and settle USDC into the customer’s issued wallet.
- Payout: send USDC from the customer’s issued wallet to a customer-owned bank account.
- Issued bank account: issue an ACH/USD account that settles into the customer’s issued wallet.
4. Find an eligible capability
List supported capabilities withGET /v3/customers/{customerId}/capabilities/supported:
availability set to available or beta, eligibility.eligible set to true, the needed directions and method, and the matching accountType. Use the customer’s issued wallet as the pay-in destination, payout source, or bank-account settlement account; use the customer-owned account as destinationId for this payout path. If institutions are returned, use only a returned institution choice. Store the entry’s id as CAPABILITY_ID; do not hardcode a universal capability ID.
5. Request the capability
Request the selected capability withPOST /v3/customers/{customerId}/capabilities/{capabilityId}:
data.status as CAPABILITY_STATUS and data.openTaskIds as TASK_IDS.
6. Complete onboarding in sandbox
IfTASK_IDS is not empty, complete each current requirement through Capabilities and tasks.
For this walkthrough, set the capability to ready with POST /v3/sandbox/customers/{customerId}/capabilities/{capabilityId}/status:
GET /v3/customers/{customerId}/capabilities/{capabilityId}:
CAPABILITY_STATUS and TASK_IDS from data.status and data.openTaskIds. Continue only when CAPABILITY_STATUS is ready.
7. Build the selected flow
Create one issued USDC wallet on Base withPOST /v3/customers/{customerId}/accounts:
data.id as FLOW_WALLET_ID, data.status as FLOW_WALLET_STATUS, and data.openTaskIds as FLOW_WALLET_TASK_IDS. If FLOW_WALLET_TASK_IDS is not empty, complete the current tasks through Capabilities and tasks.
Refetch the wallet with GET /v3/customers/{customerId}/accounts/{accountId}:
FLOW_WALLET_STATUS and FLOW_WALLET_TASK_IDS from data.status and data.openTaskIds. Continue only when FLOW_WALLET_STATUS is ready.
- Pay-in
- Payout
- Issued bank account
Create a USD-to-USDC quote with Store Store The response contains
POST /v3/quotes:data.id as QUOTE_ID, then execute it with POST /v3/transfers:data.id as TRANSFER_ID. Fetch instructions with GET /v3/transfers/{transferId}/instructions:data.transferId and data.instructions. Store data.transferId as TRANSFER_ID and data.instructions as FUNDING_INSTRUCTIONS.TRANSFER_ID with GET /v3/transfers/{transferId}:
Pay-in
Build the complete pay-in flow.
Payout
Build production payout handling.
Issued bank account
Handle provisioning and details.