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

# Internal Transfers

> Move stablecoins between your own treasury wallets

This guide shows how to move stablecoins between your own treasury wallets. Common use cases include transferring funds between different legal entities, funding operational accounts, and managing internal treasury movements.

## Prerequisites

* Two or more **treasury wallets** — create them using the [Treasury Wallets guide](/wallets/guides/treasury-wallets)
* A Crossmint **server API key** with the scopes `wallets.create`, `wallets.read`, `wallets:transactions.create`, `wallets:transactions.sign`

<Snippet file="wallets-sdk-installation-cmd.mdx" />

***

## Step 1: Create Treasury Wallets

Create two treasury wallets representing different entities or purposes. In this example, you will create wallets for a US entity and a European entity.

<CodeGroup>
  ```bash cURL theme={null}
  # Create US entity treasury wallet
  curl --request POST \
      --url 'https://staging.crossmint.com/api/2025-06-09/wallets' \
      --header 'X-API-KEY: <your-server-api-key>' \
      --header 'Content-Type: application/json' \
      --data '{
          "chain": "base-sepolia",
          "adminSigner": {
              "type": "evm-keypair",
              "address": "<your-recovery-signer-address>"
          },
          "owner": "COMPANY",
          "alias": "entity-us"
      }'

  # Create European entity treasury wallet
  curl --request POST \
      --url 'https://staging.crossmint.com/api/2025-06-09/wallets' \
      --header 'X-API-KEY: <your-server-api-key>' \
      --header 'Content-Type: application/json' \
      --data '{
          "chain": "base-sepolia",
          "adminSigner": {
              "type": "evm-keypair",
              "address": "<your-recovery-signer-address>"
          },
          "owner": "COMPANY",
          "alias": "entity-europe"
      }'
  ```

  ```typescript Node.js theme={null}
  import { CrossmintWallets, createCrossmint } from "@crossmint/wallets-sdk";

  const crossmint = createCrossmint({
      apiKey: "<your-server-api-key>",
  });

  const crossmintWallets = CrossmintWallets.from(crossmint);

  // Create US entity treasury wallet
  const usWallet = await crossmintWallets.createWallet({
      chain: "base-sepolia",
      recovery: { type: "server", secret: process.env.WALLET_RECOVERY_SECRET! },
      owner: "COMPANY",
      alias: "entity-us",
  });

  // Create European entity treasury wallet
  const euWallet = await crossmintWallets.createWallet({
      chain: "base-sepolia",
      recovery: { type: "server", secret: process.env.WALLET_RECOVERY_SECRET! },
      owner: "COMPANY",
      alias: "entity-europe",
  });

  console.log("US wallet:", usWallet.address);
  console.log("EU wallet:", euWallet.address);
  ```

  ```python Python theme={null}
  import requests

  api_key = "<your-server-api-key>"
  url = "https://staging.crossmint.com/api/2025-06-09/wallets"
  headers = {
      "X-API-KEY": api_key,
      "Content-Type": "application/json"
  }

  # Create US entity treasury wallet
  us_payload = {
      "chain": "base-sepolia",
      "adminSigner": {
          "type": "evm-keypair",
          "address": "<your-recovery-signer-address>"
      },
      "owner": "COMPANY",
      "alias": "entity-us"
  }
  us_response = requests.post(url, json=us_payload, headers=headers)
  print("US wallet:", us_response.json().get("address"))

  # Create European entity treasury wallet
  eu_payload = {
      "chain": "base-sepolia",
      "adminSigner": {
          "type": "evm-keypair",
          "address": "<your-recovery-signer-address>"
      },
      "owner": "COMPANY",
      "alias": "entity-europe"
  }
  eu_response = requests.post(url, json=eu_payload, headers=headers)
  print("EU wallet:", eu_response.json().get("address"))
  ```
</CodeGroup>

***

## Step 2: Transfer Between Treasury Wallets

Use the standard token transfer API to move funds. Since this is an internal transfer between your own wallets, no compliance checks are required.

<CodeGroup>
  ```bash cURL theme={null}
  # Transfer 500 USDC from US entity to European entity
  curl --request POST \
      --url 'https://staging.crossmint.com/api/2025-06-09/wallets/evm:smart:alias:entity-us/tokens/base-sepolia:usdc/transfers' \
      --header 'X-API-KEY: <your-server-api-key>' \
      --header 'Content-Type: application/json' \
      --data '{
          "recipient": "evm:smart:alias:entity-europe",
          "amount": "500"
      }'
  ```

  ```typescript Node.js theme={null}
  // Get the US entity wallet
  const usWallet = await crossmintWallets.getWallet("evm:smart:alias:entity-us", {
      chain: "base-sepolia",
  });

  await usWallet.useSigner({
      type: "server",
      secret: process.env.WALLET_RECOVERY_SECRET!,
  });

  // Transfer 500 USDC from US entity to European entity
  const { hash, explorerLink } = await usWallet.send(
      "evm:smart:alias:entity-europe", // recipient wallet locator
      "usdc",
      "500"
  );

  console.log("Transfer hash:", hash);
  console.log("Explorer:", explorerLink);
  ```

  ```python Python theme={null}
  import requests

  us_wallet_locator = "evm:smart:alias:entity-us"
  token_locator = "base-sepolia:usdc"

  url = f"https://staging.crossmint.com/api/2025-06-09/wallets/{us_wallet_locator}/tokens/{token_locator}/transfers"

  payload = {
      "recipient": "evm:smart:alias:entity-europe",
      "amount": "500"
  }
  headers = {
      "X-API-KEY": "<your-server-api-key>",
      "Content-Type": "application/json"
  }

  response = requests.post(url, json=payload, headers=headers)

  print("Transfer hash:", response.json().get("onChain", {}).get("txId"))
  ```
</CodeGroup>

<Note>
  **Signing transactions (REST API):** The cURL and Python examples above use the simplified [Transfer Token](/api-reference/wallets/transfer-token) endpoint. If your integration requires custom transaction signing, see the full create → sign → approve flow in [Send a Transaction (EVM) — REST tab](/wallets/guides/send-transaction-evm#rest).
</Note>

For the full transfer API reference, see the [Transfer Tokens](/wallets/guides/transfer-tokens) guide.

***

## Step 3: Monitor Transfers with Webhooks

Set up webhooks to receive real-time notifications when transfers complete. Configure the `wallets.transfer.out` and `wallets.transfer.in` event types in the <a href="https://www.crossmint.com/console" target="_blank">Crossmint Console</a>.

For setup instructions and the full event schema, see the [Transfer Webhooks](/wallets/guides/webhooks) guide.

***

## Next Steps

<CardGroup cols={2}>
  <Card title="Transfer Tokens Guide" icon="arrow-right-arrow-left" iconType="duotone" color="#6554C0" href="/wallets/guides/transfer-tokens">
    Full reference for the token transfer API
  </Card>

  <Card title="Transfer Webhooks" icon="bell" iconType="duotone" color="#FF991F" href="/wallets/guides/webhooks">
    Monitor transfers real-time
  </Card>

  <Card title="Payouts" icon="money-bill-transfer" iconType="duotone" color="#1A5785" href="/stablecoin-orchestration/regulated-transfers/overview">
    Send payouts to external wallets
  </Card>

  <Card title="Check Balances" icon="wallet" iconType="duotone" color="#36B37E" href="/wallets/guides/check-balances">
    Query token balances
  </Card>
</CardGroup>
