Skip to main content

Overview

Transfers move funds to external addresses, other Coinbase users, or payment methods. In Sandbox, all transfers are simulated—webhooks fire and status transitions occur, but no real transactions happen.

Prerequisites

Before you begin, you need cdpcurl, a Sandbox API key, and a funded account. See the Quickstart for instructions.

1. Simulate transfer by target type

Set your account ID:
export ACCOUNT_ID="account_db458f63-..."
cdpcurl -k $CDP_API_KEY \
  'https://sandbox.cdp.coinbase.com/platform/v2/accounts' | sed '1d' | jq -r '.accounts[].accountId'

a. To reserved addresses

You can use any valid address format for the network—it doesn’t need to be a real or funded address. Use reserved addresses below to test specific error scenarios.
Use these reserved addresses to test specific success and failure scenarios:
Any funds sent in production to these addresses will be lost. In Sandbox, they are simulated and used for testing purposes only.
Reserved AddressSimulated Outcome
0x1111111111111111111111111111111111111111Success
0x2222222222222222222222222222222222222222Transfer invalid target
0x3333333333333333333333333333333333333333Invalid address
0x4444444444444444444444444444444444444444Unsupported network
Below is a simulation using 0x1111... to test successful transfer handling:
cdpcurl -k $CDP_API_KEY \
  -X POST \
  -d "{
    \"source\": {
      \"accountId\": \"$ACCOUNT_ID\",
      \"asset\": \"usdc\"
    },
    \"target\": {
      \"network\": \"base\",
      \"address\": \"0x1111111111111111111111111111111111111111\",
      \"asset\": \"usdc\"
    },
    \"amount\": \"5.00\",
    \"asset\": \"usdc\",
    \"execute\": true
  }" \
  'https://sandbox.cdp.coinbase.com/platform/v2/transfers'
You should expect: HTTP 2xx with normal transfer response
The target address can be any valid format for the network—it doesn’t need to be a real or funded address. Use reserved addresses to test specific scenarios.

b. To reserved email addresses

Send to a Coinbase user by email. In Sandbox, only whitelisted test emails work:
Test EmailDescription
testuser1@domain.comReturns successful validation
testuser2@domain.comReturns successful validation
cdpcurl -k $CDP_API_KEY \
  'https://sandbox.cdp.coinbase.com/platform/v2/accounts' | sed '1d' | jq -r '.accounts[].accountId'
cdpcurl -k $CDP_API_KEY \
  -X POST \
  -d "{
    \"source\": {
      \"accountId\": \"$ACCOUNT_ID\",
      \"asset\": \"usd\"
    },
    \"target\": {
      \"email\": \"testuser1@domain.com\",
      \"asset\": \"usd\"
    },
    \"amount\": \"5.00\",
    \"asset\": \"usd\",
    \"execute\": true
  }" \
  'https://sandbox.cdp.coinbase.com/platform/v2/transfers'
Any email not in the whitelist returns a 4xx error. This prevents privacy concerns around validating real email addresses in Sandbox.

c. To reserved payment methods

For testing fiat withdrawals to external banks (Fedwire, SWIFT), see the Payment Methods guide. Payment methods have pre-built test scenarios for different use cases (e.g., active vs inactive methods).

2. Validate before executing

Use validateOnly: true to verify recipient details (like email addresses or crypto addresses) before executing a transfer.
cdpcurl -k $CDP_API_KEY \
  'https://sandbox.cdp.coinbase.com/platform/v2/accounts' | sed '1d' | jq -r '.accounts[].accountId'
cdpcurl -k $CDP_API_KEY \
  -X POST \
  -d "{
    \"source\": {
      \"accountId\": \"$ACCOUNT_ID\",
      \"asset\": \"usd\"
    },
    \"target\": {
      \"email\": \"testuser1@domain.com\",
      \"asset\": \"usd\"
    },
    \"amount\": \"5.00\",
    \"asset\": \"usd\",
    \"validateOnly\": true
  }" \
  'https://sandbox.cdp.coinbase.com/platform/v2/transfers'
A 2xx response means the transfer would succeed. A 4xx response includes an errorType explaining why validation failed.
Use the reserved addresses from section 1.a to test validation scenarios for crypto addresses (e.g., validate with 0x3333... to test invalid address handling).

3. List transfers

View all transfers for your account:
cdpcurl -k $CDP_API_KEY \
  'https://sandbox.cdp.coinbase.com/platform/v2/transfers'
{
  "transfers": [
    {
      "transferId": "transfer_8b707d29-4690-4948-b645-de1cd1f5fd05",
      "status": "completed",
      "source": {
        "accountId": "account_db458f63-418a-4a91-a045-fab93ac35c3f",
        "asset": "usd"
      },
      "target": {
        "paymentMethodId": "paymentMethod_398435cb-03bd-5568-b8d5-44accd7ce305",
        "asset": "usd"
      },
      "sourceAmount": "5",
      "sourceAsset": "usd",
      "targetAmount": "5",
      "targetAsset": "usd",
      "createdAt": "2026-02-11T23:19:24.086Z",
      "updatedAt": "2026-02-11T23:19:24.183Z"
    }
  ]
}