> ## 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:** OUSD, USDC, USDB, and EURC

**Supported chains:** Tempo, Base, and 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', {
      amount: '10.0',
      source: {
        asset: 'ousd',
        chain: 'tempo',
      },
      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": "ousd",
          "amount": "10.0",
          "chain": "tempo"
        },
        "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. `"ousd"`, `"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 OUSD). No
      need to convert to smallest units.
    </ParamField>

    <ParamField body="source.chain" type="'tempo' | 'base' | 'solana'" required>
      The chain to transfer from (e.g. `"tempo"` 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>

<ParamField body="custody_options" type="object">
  Additional options for custodial transfers.

  <Expandable title="properties">
    <ParamField body="custody_options.initiation" type="object" required>
      Payment initiation context. This should be provided depending on SCA requirements for
      the custodial wallet. This context is passed to Bridge. Learn more about
      [Strong Customer Authentication
      (SCA)](/wallets/custodial-wallets/advanced/strong-customer-authentication).

      <Expandable title="properties" defaultOpen>
        <ParamField body="custody_options.initiation.channel" type="string" required>
          How the payment was initiated. Use `p2p_mobile_payment` for peer-to-peer transfers initiated
          on a mobile device; `other_mobile_payment` for non-P2P mobile-initiated payments (e.g. a
          merchant payment via a mobile app); `other` for payments not relying on a mobile device.
        </ParamField>

        <ParamField body="custody_options.initiation.subchannel" type="string" required>
          Whether the payment was made remotely or in person. Use `remote` for payments initiated
          from a distance (mobile app, online banking, or e-commerce checkout); `non_remote` for
          payments made in person (physical card, payment terminal, or contactless tap).
        </ParamField>

        <ParamField body="custody_options.initiation.attestations" type="object" required>
          Payment initiation attestations for a transfer.

          <Expandable title="properties" defaultOpen>
            <ParamField body="custody_options.initiation.attestations.sca" type="object" required>
              Strong Customer Authentication attestation for a transfer.

              <Expandable title="properties" defaultOpen>
                <ParamField body="custody_options.initiation.attestations.sca.outcome" type="string" required>
                  Whether Strong Customer Authentication (SCA) was applied or which regulatory
                  exemption or non-applicability reason covers this payment.

                  | Outcome | Description |
                  | - | - |
                  | `sca_used` | The user authenticated with SCA. |
                  | `payment_to_self` | Payer and payee are the same person (remote only). |
                  | `trusted_beneficiaries` | Payee is on the user's pre-approved list. |
                  | `recurring_transaction` | Amount and payee match a previously SCA-authorized recurring series. |
                  | `contactless_low_value` | Contactless card payment below the low-value threshold (non-remote only). |
                  | `unattended_terminal_for_transport` | Automated terminal for transport fares or parking (non-remote only). |
                  | `low_value` | Remote payment below the low-value threshold (remote only). |
                  | `secure_corporate_payment` | Dedicated corporate payment process with controls equivalent to SCA (remote only). |
                  | `transaction_risk_analysis` | PSP has performed real-time risk analysis and the transaction falls within permitted thresholds (remote only). |
                  | `merchant_initiated_transaction` | Payment triggered by the merchant without the payer present, on a pre-authorized mandate (remote only). |
                  | `not_applicable` | This flow requires initiation context but SCA and SCA exemptions do not apply. |
                  | `other` | Another recognized exemption not listed above. |
                </ParamField>

                <ParamField body="custody_options.initiation.attestations.sca.auth_factors" type="object[]">
                  Authentication factor metadata. Optional when `outcome` is `sca_used`; if provided,
                  it must contain at least two entries from different `category` values (e.g. one
                  `possession` factor and one `knowledge` factor). Omit this field for any other outcome.

                  <Expandable title="properties">
                    <ParamField body="custody_options.initiation.attestations.sca.auth_factors[].category" type="string" required>
                      The type of authentication factor used: `knowledge` (something
                      only the user knows, e.g. a PIN or password), `possession` (something only the
                      user has, e.g. a phone receiving an OTP or a hardware token), or `inherence`
                      (something the user is, e.g. a fingerprint or face scan). When `outcome` is
                      `sca_used`, the two factors in `auth_factors` must belong to two different categories.
                    </ParamField>

                    <ParamField body="custody_options.initiation.attestations.sca.auth_factors[].authenticated_at" type="string" required>
                      The ISO 8601 timestamp when this factor was authenticated.
                    </ParamField>

                    <ParamField body="custody_options.initiation.attestations.sca.auth_factors[].reference" type="string" required>
                      Your internal identifier for this authentication event (e.g. a session ID,
                      transaction ID, or audit log reference). Used for reconciliation.
                    </ParamField>
                  </Expandable>
                </ParamField>
              </Expandable>
            </ParamField>
          </Expandable>
        </ParamField>
      </Expandable>
    </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>


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.