> ## 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

<Info>
  **Regulatory status:** Internal transfers between your own treasury wallets are **not a regulated activity**. No compliance checks are required.
</Info>

This guide shows how to move stablecoins between your own treasury wallets. Common use cases include rebalancing liquidity across chains, moving funds between entities (e.g., a US entity and a European entity), and internal fund management.

## 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" href="/wallets/guides/transfer-tokens">
    Full reference for the token transfer API
  </Card>

  <Card title="Transfer Webhooks" icon="bell" href="/wallets/guides/webhooks">
    Monitor transfers with real-time notifications
  </Card>

  <Card title="Payouts" icon="money-bill-transfer" href="/stablecoin-orchestration/regulated-transfers/overview">
    Send payouts to customers
  </Card>

  <Card title="Check Balances" icon="wallet" href="/wallets/guides/check-balances">
    Query token balances across your wallets
  </Card>
</CardGroup>
