> ## Documentation Index
> Fetch the complete documentation index at: https://docs.privy.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Sending funds

Custodial wallets support transferring assets using the [`/transfer`](/wallets/actions/transfer/usage) endpoint — the same interface used by non-custodial wallets. This provides a simple, chain-agnostic way to move funds without needing to encode raw transaction data.

<Info>All transactions from custodial wallets are executed server-side.</Info>

## Initiate a transfer

For custodial wallets, only assets that are supported by the custodian can be transferred.

**Supported assets:** USDC, USDB, EURC

**Supported chains:** Base, Solana

<Info>
  Like non-custodial wallets, custodial wallets with an `owner` or `additional_signers` require an
  [authorization signature](/controls/authorization-keys/using-owners/sign/overview) for transaction
  requests.
</Info>

### Usage

Make a `POST` request to `/v1/wallets/{wallet_id}/transfer` with the source asset, amount, chain, and destination address:

<Tabs>
  <Tab title="Node.js SDK">
    ```js theme={"system"}
    const transfer = await privy.wallets().transfer('insert-wallet-id', {
      source: {
        asset: 'usdc',
        amount: '10.0',
        chain: 'base',
      },
      destination: {
        address: '0xRecipientAddress...',
      },
    });

    console.log(transfer.id);     // wallet action ID
    console.log(transfer.status); // 'pending'
    ```
  </Tab>

  <Tab title="REST API">
    ```bash theme={"system"}
    curl -X POST https://api.privy.io/v1/wallets/{wallet_id}/transfer \
      -H "Content-Type: application/json" \
      -H "privy-app-id: YOUR_APP_ID" \
      -H "Authorization: Basic BASE64_ENCODED_APP_SECRET" \
      -d '{
        "source": {
          "asset": "usdc",
          "amount": "10.0",
          "chain": "base"
        },
        "destination": {
          "address": "0xRecipientAddress..."
        }
      }'
    ```
  </Tab>
</Tabs>

### Parameters

<ParamField path="walletId" type="string" required>
  The ID of the custodial wallet to send the transfer from.
</ParamField>

<ParamField body="source" type="object" required>
  The source asset, amount, and chain for the transfer.

  <Expandable title="properties" defaultOpen>
    <ParamField body="source.asset" type="string" required>
      The asset to transfer (e.g. `"usdc"`, `"usdb"`, `"eurc"`).
    </ParamField>

    <ParamField body="source.amount" type="string" required>
      The amount to transfer as a decimal string in standard units (e.g. `"10.0"` for 10 USDC). No
      need to convert to smallest units.
    </ParamField>

    <ParamField body="source.chain" type="string" required>
      The chain to transfer from (e.g. `"base"` or `"solana"`).
    </ParamField>
  </Expandable>
</ParamField>

<ParamField body="destination" type="object" required>
  The destination for the transfer.

  <Expandable title="properties" defaultOpen>
    <ParamField body="destination.address" type="string" required>
      The recipient wallet address. Use a hex address for EVM chains and a base58 address for
      Solana.
    </ParamField>
  </Expandable>
</ParamField>

### Returns

The response is a [wallet action](/wallets/actions/overview) object with `type: "transfer"`:

<ResponseField name="id" type="string">
  The wallet action ID. Use this to poll for status updates via `GET /v1/wallets/{wallet_id}
      /actions/{action_id}`.
</ResponseField>

<ResponseField name="status" type="string">
  The action status: `pending`, `succeeded`, `rejected`, or `failed`.
</ResponseField>

<ResponseField name="type" type="'transfer'">
  The action type.
</ResponseField>

<ResponseField name="source_asset" type="string">
  The asset being transferred.
</ResponseField>

<ResponseField name="source_amount" type="string">
  The amount being transferred in standard units.
</ResponseField>

<ResponseField name="source_chain" type="string">
  The source chain.
</ResponseField>

<ResponseField name="destination_address" type="string">
  The recipient address.
</ResponseField>

## Next steps

<CardGroup>
  <Card title="Transfer lifecycle" icon="clock" href="/wallets/custodial-wallets/transaction-lifecycle">
    Learn about the transfer lifecycle for custodial wallets
  </Card>

  <Card title="Sending USDC recipe" icon="book-open" href="/recipes/send-usdc">
    Learn how to format and encode ERC-20 token transfers
  </Card>

  <Card title="Authorization controls" icon="shield-halved" href="/wallets/custodial-wallets/advanced/authorization-controls">
    Configure policies and multi-party approvals for custodial wallets
  </Card>

  <Card title="Transfer webhooks" icon="webhook" href="/wallets/custodial-wallets/advanced/webhooks">
    Monitor transfer status and lifecycle events
  </Card>
</CardGroup>
