Skip to main content
Create a customer, prepare one reusable wallet, and run the sandbox flow you need.

1. Configure sandbox

Use a sandbox API key from your backend:
The key selects the sandbox environment on the shared API host.

2. Create a customer

Create an individual customer with POST /v3/customers:
Store 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.
For a third-party payout, follow Recipients or Send funds.

4. Find an eligible capability

List supported capabilities with GET /v3/customers/{customerId}/capabilities/supported:
Choose a response entry with 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 with POST /v3/customers/{customerId}/capabilities/{capabilityId}:
Store data.status as CAPABILITY_STATUS and data.openTaskIds as TASK_IDS.

6. Complete onboarding in sandbox

If TASK_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:
This test control is not production onboarding. Refetch with GET /v3/customers/{customerId}/capabilities/{capabilityId}:
Refresh 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 with POST /v3/customers/{customerId}/accounts:
Store 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}:
Refresh FLOW_WALLET_STATUS and FLOW_WALLET_TASK_IDS from data.status and data.openTaskIds. Continue only when FLOW_WALLET_STATUS is ready.
Create a USD-to-USDC quote with POST /v3/quotes:
Store data.id as QUOTE_ID, then execute it with POST /v3/transfers:
Store data.id as TRANSFER_ID. Fetch instructions with GET /v3/transfers/{transferId}/instructions:
The response contains data.transferId and data.instructions. Store data.transferId as TRANSFER_ID and data.instructions as FUNDING_INSTRUCTIONS.
For pay-ins and payouts, monitor 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.
Next, add webhooks. Each request above already links to its complete API Reference schema and status page.