Skip to main content

Documentation Index

Fetch the complete documentation index at: https://developers.circle.com/llms.txt

Use this file to discover all available pages before exploring further.

Receive USDC or EURC by generating deposit addresses for external wallets to send to, or send USDC or EURC to allowlisted recipient addresses on supported blockchains. Transfers of $3,000 or more require Travel Rule compliance data for third-party payouts.

Prerequisites

Before you begin:
  • Complete the account and API key setup.
  • Review supported chains and currencies for available blockchains.
  • (For sending) Have a funded Circle Mint account.
  • (For sending) All recipient addresses must be approved by an account administrator through the Mint Console before you can create transfers. If your account is domiciled in France or Singapore, addresses require additional verification through the Mint Console.

Step 1. Receive USDC via deposit address

Step 1.1. Create a deposit address

Use the create deposit address endpoint to generate an address for receiving USDC or EURC on a specific blockchain.
curl -X POST https://api-sandbox.circle.com/v1/businessAccount/wallets/addresses/deposit \
  -H "Authorization: Bearer ${YOUR_API_KEY}" \
  -H "Content-Type: application/json" \
  -d '{"idempotencyKey": "ba943ff1-ca16-49b2-ba55-1057e70ca5c7", "currency": "USD", "chain": "ARC"}'
Expected response:
{
  "data": {
    "id": "d51d72d2-9955-4340-b3fd-2f07a82a1e6c",
    "address": "0xbd01242af414961c25aa72dcae06646fc52e9b92",
    "currency": "USD",
    "chain": "ARC"
  }
}
You can create one deposit address per blockchain. Use the same address for all deposits on that blockchain.

Step 1.2. Send funds to your deposit address

This step happens outside the Circle Mint API. The sender transfers USDC or EURC from their external wallet to your deposit address on the matching blockchain.
Sending funds on the wrong blockchain results in permanent loss. Always confirm the blockchain network matches between the sender’s wallet and your deposit address.

Step 1.3. Verify the deposit

Use the list transfers endpoint to confirm the incoming transfer has settled.
curl https://api-sandbox.circle.com/v1/businessAccount/transfers \
  -H "Authorization: Bearer ${YOUR_API_KEY}"
Expected response:
{
  "data": [
    {
      "id": "a6a1b575-13d5-4e73-9da7-73e2a3e4418a",
      "source": {
        "type": "blockchain",
        "chain": "ARC"
      },
      "destination": {
        "type": "wallet",
        "id": "1000066041"
      },
      "amount": {
        "amount": "100.00",
        "currency": "USD"
      },
      "transactionHash": "0x4cfd25b5ab46e9fe25e845e7a7e0ea2f1f7e4bba3c6e0f1db0b846e4a1bc5fd2",
      "status": "complete",
      "createDate": "2024-01-01T12:00:00.000Z"
    }
  ]
}
The transfer reaches complete status after the required number of blockchain confirmations for the deposit’s blockchain.

Step 2. Send USDC to an external address

Step 2.1. Add a recipient address

Use the create recipient address endpoint to allowlist an external blockchain address for outbound transfers.
curl -X POST https://api-sandbox.circle.com/v1/businessAccount/wallets/addresses/recipient \
  -H "Authorization: Bearer ${YOUR_API_KEY}" \
  -H "Content-Type: application/json" \
  -d '{"idempotencyKey": "2a308497-e66e-4c42-ac1e-7bedab86d958", "address": "0x493A9869E3B5f846f72267ab19B76e9bf99d51b1", "chain": "ARC", "currency": "USD", "description": "Treasury wallet"}'
Expected response:
{
  "data": {
    "id": "cfa01bb0-d166-5506-a48a-56f2beab559f",
    "address": "0x493a9869e3b5f846f72267ab19b76e9bf99d51b1",
    "chain": "ARC",
    "currency": "USD",
    "description": "Treasury wallet"
  }
}
Adding a recipient address through the API creates a pending request. An account administrator must approve the address through the Mint Console before you can send transfers to it. A confirmation notification is sent to all administrators.

Step 2.2. Create a transfer

Use the create transfer endpoint to send funds to the approved recipient address.
curl -X POST https://api-sandbox.circle.com/v1/businessAccount/transfers \
  -H "Authorization: Bearer ${YOUR_API_KEY}" \
  -H "Content-Type: application/json" \
  -d '{"idempotencyKey": "6ec3827d-15bb-442e-9d4c-32e73e61cbf4", "destination": {"type": "verified_blockchain", "addressId": "cfa01bb0-d166-5506-a48a-56f2beab559f"}, "amount": {"currency": "USD", "amount": "25.00"}}'
Expected response:
{
  "data": {
    "id": "21fd4ec4-bad1-4eb2-9fc5-60320dedc7ea",
    "source": {
      "type": "wallet",
      "id": "1016875042"
    },
    "destination": {
      "type": "blockchain",
      "address": "0x493a9869e3b5f846f72267ab19b76e9bf99d51b1",
      "chain": "ARC"
    },
    "amount": {
      "amount": "25.00",
      "currency": "USD"
    },
    "status": "pending",
    "createDate": "2024-07-15T16:41:12.395Z"
  }
}

Step 2.3. Check the transfer status

Use the get transfer endpoint to monitor the status of your transfer.
curl -X GET https://api-sandbox.circle.com/v1/businessAccount/transfers/21fd4ec4-bad1-4eb2-9fc5-60320dedc7ea \
  -H "Authorization: Bearer ${YOUR_API_KEY}"
The transfer progresses through these statuses:
  • pending: Circle received the request.
  • running: The transaction is broadcast onchain. The response includes a transactionHash.
  • complete: Blockchain finality reached — the required number of confirmations passed.
Expected response for a running transfer:
{
  "data": {
    "id": "21fd4ec4-bad1-4eb2-9fc5-60320dedc7ea",
    "source": {
      "type": "wallet",
      "id": "1016875042"
    },
    "destination": {
      "type": "blockchain",
      "address": "0x493a9869e3b5f846f72267ab19b76e9bf99d51b1",
      "chain": "ARC"
    },
    "amount": {
      "amount": "25.00",
      "currency": "USD"
    },
    "transactionHash": "0x0654eee4f609f9c35e376cef9455dd9fc1546c482c5c32c8f8d434ead14fcf97",
    "status": "running",
    "createDate": "2024-07-15T16:41:12.395Z"
  }
}

Travel Rule compliance

The Financial Crimes Enforcement Network (FinCEN) Travel Rule requires financial institutions to share originator and beneficiary information for transfers of $3,000 or more.

When it applies

Travel Rule applies to onchain transfers of $3,000 or more on these blockchains:
  • Algorand (ALGO)
  • Aptos (APTOS)
  • Arbitrum (ARB)
  • Avalanche (AVAX)
  • Base (BASE)
  • Celo (CELO)
  • Ethereum (ETH)
  • NEAR (NEAR)
  • Optimism (OP)
  • Polygon PoS (POLY)
  • Ripple (XRPL)
  • Solana (SOL)
  • Stellar (XLM)

Business account transfers

For transfers from your Circle Mint account using POST /v1/businessAccount/transfers, Circle uses your company identity on file. No additional data is required in the API request.

Third-party payouts

For payouts to third parties using the Crypto Payouts API (POST /v1/payouts), you must include the originator’s identity in the source.identities array. The following table describes the identities schema:
FieldTypeRequiredDescription
typestringYesindividual or business
namestringYesFull legal name
addressesarrayNoArray of address objects
addresses[].line1stringYes (if addresses provided)Street address
addresses[].citystringYes (if addresses provided)City
addresses[].districtstringNoState/province (2-letter code for US)
addresses[].countrystringYes (if addresses provided)ISO 3166-1 alpha-2 country code
addresses[].postalCodestringNoPostal code
The following example shows a payout request with originator identity data:
curl -X POST https://api-sandbox.circle.com/v1/payouts \
  -H "Authorization: Bearer ${YOUR_API_KEY}" \
  -H "Content-Type: application/json" \
  -d '{"idempotencyKey": "ba943ff1-ca16-49b2-ba55-1057e70ca5c7", "source": {"type": "wallet", "id": "12345", "identities": [{"type": "individual", "name": "Satoshi Nakamoto", "addresses": [{"line1": "100 Money Street", "city": "Boston", "district": "MA", "country": "US", "postalCode": "01234"}]}]}, "destination": {"type": "blockchain", "address": "0x8381470ED67C3802402dbbFa0058E8871F017A6F", "chain": "ETH"}, "amount": {"amount": "3000.00", "currency": "USD"}}'
Expected response:
{
  "data": {
    "id": "b36cbf12-6ed1-47ed-9eb9-5874f8991ca8",
    "source": {
      "type": "wallet",
      "id": "12345",
      "identities": [
        {
          "type": "individual",
          "name": "Satoshi Nakamoto",
          "addresses": [
            {
              "line1": "100 Money Street",
              "city": "Boston",
              "district": "MA",
              "country": "US",
              "postalCode": "01234"
            }
          ]
        }
      ]
    },
    "destination": {
      "type": "blockchain",
      "address": "0x8381470ED67C3802402dbbFa0058E8871F017A6F",
      "chain": "ETH"
    },
    "amount": {
      "amount": "3000.00",
      "currency": "USD"
    },
    "status": "pending",
    "createDate": "2024-07-10T02:13:30.000Z"
  }
}

Receiving transfers

If you are a regulated financial institution, Circle provides originator identity data on inbound transfers of $3,000 or more. Use returnIdentities=true as a query parameter on GET endpoints:
curl -X GET "https://api-sandbox.circle.com/v1/payouts/{id}?returnIdentities=true" \
  -H "Authorization: Bearer ${YOUR_API_KEY}"

Failure behavior

If a transfer requires identity data and it is omitted, the transfer fails with:
  • riskEvaluation.decision: denied
  • riskEvaluation.reason: 3220

See also